进程和线程的区别

2023-11-13

转自文章进程和线程的区别

面试必考 | 进程和线程的区别

1、根本区别

进程和线程的根本区别是进程是操作系统(OS)资源分配的基本单位,而线程是处理器(CPU)任务调度和执行的基本单位。

2、资源开销:

每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

3、包含关系:

如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线
同完成的;线程是进程的一部分,所行过程不是一条线的,而是多条线(线耗)其被称为轻权进程或者轻量级进程。

4、内存分配:

同一进程的线程共享本进分享截屏空间和资源,而进程之间的地址空间和资源是相互独立的。

5、影响关系:

一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

6、执行过程:

每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

✌️ 补充

一、进程、线程、协程的概念

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
协程:是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。其执行过程更类似于子例程,或者说不带返回值的函数调用。

二、进程和线程的区别

地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。
资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
健壮性:多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
可并发性:
两者均可并发执行。
切换时:
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
其他:线程是处理器调度的基本单位,但是进程不是。

三、协程和线程的区别

协程避免了无意义的调度,由此可以提高性能,但程序员必须自己承担调度的责任。同时,协程也失去了标准线程使用多CPU的能力。
线程相对独立有自己的上下文切换受系统控制;协程相对独立有自己的上下文切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

四、何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

五、为什么会有线程?

每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。

六、*python多线程的问题(面试问题)

存在问题:
python由于历史遗留的问题,严格说多个线程并不会同时执行(没法有效利用多核处理器,python的并发只是在交替执行不同的代码)。多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。所以python的多线程并发并不能充分利用多核,并发没有java的并发严格。

原因:
原因就在于GIL ,在Cpython 解释器(Python语言的主流解释器)中,有一把全局解释锁(GIL, Global Interpreter Lock),在解释器解释执行Python 代码时,任何Python线程执行前,都先要得到这把GIL锁。这个GIL全局锁实际上把所有线程的执行代码都给上了锁。这意味着,python在任何时候,只可能有一个线程在执行代码。其它线程要想获得CPU执行代码指令,就必须先获得这把锁,如果锁被其它线程占用了,那么该线程就只能等待,直到占有该锁的线程释放锁才有执行代码指令的可能。多个线程一起执行反而更加慢的原因:同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换、锁机制处理(获取锁,释放锁等),所以,多线程执行不快反慢。什么时候GIL 被释放?当一个线程遇到I/O 任务时,将释放GIL。计算密集型(CPU-bound)线程执行100次解释器的计步(ticks)时(计步可粗略看作Python 虚拟机的指令),也会释放GIL。即,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

本条参考博客:http://www.sohu.com/a/230407177_99992472

七、进程通信方式(选读)

管道:速度慢,容量有限,只有父子进程能通讯
FIFO:任何进程间都能通讯,但速度慢
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
信号量:不能传递复杂消息,只能用来同步
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
本条参考博客:https://blog.csdn.net/weixin_40283480/article/details/82155704

八、举例说明进程、线程、协程

程序:例如main.py这是程序,是一个静态的程序。
python进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。multiprocessing.Process实现多进程
进程池:如果要启动大量的子进程,可以用进程池的方式批量创建子进程。multiprocessing.Pool
进程间通信:各自在独立的地址空间,并不能直接进行全局的数据共享,在创建子进程的时候会将父进程的数据复制到子进程中一份。进程间通信 Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
python线程:thread是比较低级,底层的模块,threading是高级模块,对thread进行了封装,可以更加方便的被使用。
python协程:线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员,当程序中存在大量不需要CPU的操作时(例如 I/O),适用于协程。
例如yield其中 yield 是python当中的语法。当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。但是,yield让协程暂停,和线程的阻塞是有本质区别的。
协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。因此,协程的开销远远小于线程的开销。最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程和线程的区别 的相关文章

随机推荐

  • 未来刷脸支付设备圈地运动将会加剧

    未来刷脸支付设备的圈地运动将会加剧 而支付宝方面数据显示 自从去年支付宝宣布刷脸支付大规模商业化后 与刷脸支付相关的上下游产业链 催生的研发 生产 安装调试人员就已经达到50万人 刷脸支付项目合作推广更是成为市场热门 抓住移动支付发展的浪潮
  • 【FFmpeg】多媒体文件处理

    1 ffmpeg的日志打印 include
  • Rancher 集群安装

    一 Rancher 是什么 Rancher 是一个 Kubernetes 管理工具 用于在任何地方和任何提供商上部署和运行集群 Rancher 可以从托管提供商调配 Kubernetes 调配计算节点 然后将 Kubernetes 安装到这
  • TCP应用层协议

    TCP IP是个协议组 可分为三个层次 网络层 传输层和应用层 在网络层有IP协议 ICMP协议 ARP协议 RARP协议和BOOTP协议 在传输层中有TCP协议与UDP协议 在应用层有FTP HTTP TELNET SMTP DNS等协议
  • 准备刺第一针了(飞秋官方下载)

    WZSZF飞鸽 2013年10月26日 它还有一双花椒粒一样大小的眼睛 它还会丰富多腔地叫唤 叫起来婉转动听 毛大爹 原来我们不能离开眼镜啊 第二天 呜的一声 简直不相信自己的耳朵 放生青蛙今天外公外婆叔叔阿姨们要来我家吃饭 我终于撑到最后
  • Z-Statk协调器 路由器 终端的确定---Simple例程(一)

    Z Statk协调器 路由器 终端的确定 Simple例程 一 2010 12 24 09 42 10 分类 嵌入式 当我们选择了终端 路由器 或者协调器的时候 来看一下程序中是怎么判断的 也就是如何作为其中的各个角色进行启动 是加入网络
  • 使用内网负载机(Linux)执行Jmeter性能测试

    一 背景 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试 一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢 遇到公网环境下性能测试达到了带宽瓶颈 那么这时 我们就需要考虑在内网环境负载机下来执行我们的性能测试以达到
  • 给button设置背景图片不显示解决了

    以前给按钮设置背景图片但是图片不显示 一直没有解决 网上也找不到正确的方法 今天终于被我解决了 其实就把button的背景颜色改改就OK了
  • 面试时这样介绍算法,想不高薪都难,排序算法(归并排序)

    算法背景 归并排序 Merge sort 是一种排序算法 它的目的是将一个无序的数组变成有序的 它采用分治法 将原数组不断地分成若干个小数组 直到每个小数组只有一个元素 然后把这些小数组按照顺序合并起来 最终得到一个有序的数组 归并排序需要
  • CSS3滤镜——页面黑白灰度处理

    每当遭遇重大灾难 比如之前的非典 汶川地震 以及前几天清明节对新冠肺炎逝世同胞的哀悼 各大主流网站也会呈黑白两色 今天偶然搜了下实现机制 原来是如此的简单 也对之前不怎么了解的滤镜刮目相看了 将以下样式代码放到页面中即可实现页面黑白处理 这
  • 数据结构和算法之插入排序

    一 插入排序 插入排序是一种简单直观的排序算法 它的原理是通过构建有序序列 对于未排序数据 在已排序序列中从后向前扫描 找到相应位置并插入 mermaid svg v2YbPqchr8qWCPvn font family trebuchet
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • 学习新技术的10个建议

    学习新技术的10个建议 http www apkbus com portal php mod view aid 1780 我们生活在一个振奋人心的时代 我们可以越来越方便廉价地获得大量学习资源 这些资源的传播载体由最初的教室被变成了博客 技
  • “范式杯”2023牛客暑期多校训练营1

    D Chocolate 题意 有n m的矩阵 分成n m块 每一块都有一块巧克力 然后A和B两个人 进行博弈 选择一个下标 i j 将左上角 1 1 到 i j 的巧克力全部吃掉 如果谁是最后一个吃完全部巧克力 那么就输了 每人至少吃一块巧
  • 支付宝API接口开发相关文档以及实例

    支付宝实物即时到账接口 在下载该接口之前 请确定你已经签约了即时到账的服务协议 并且账号已经开通了即时到账的权限 口常见错误问题搜集 http union alipay com alipay zhichi shiwu 商家工具FAQ pdf
  • Python兼职:800-1500元/天,多做多得,时间自由!

    以下三种情况 哪个让你最绝望 好不容易找到一个资源齐全的网站 不是要收费就是要翻墙 每次想看的音乐会 想抢的假期车票 永远抢不到 工资4500 生活费1000 花呗欠了10000 说实话 反正我真的选不出 每一个都让我崩溃 但是我将这个测试
  • kibana创建索引_Elasticsearch 实战案例(索引切分、模板、别名、数据迁移)

    背景 基于ELK搭建的日志平台 前期匆忙建设过程中一些参数和设计未做过多的考虑 上线后就需要不断根据实际情况做调整 而一些调整限于ELK的一些特性 一旦操作不当就会出现丢数据 数据写入异常 数据查不到等情况 因此如何在这种背景下 做到对使用
  • 海康威视智能终端获取实时人脸体温识别记录二次开发java

    需求 使用的是海康威视人脸带体温识别智能终端 根据主动获取设备事件现在不支持获取体温 所以实时获取 参考设备布防 设备登陆注册省略 见 海康威视人脸识别智能终端获取设备事件二次开发Java 设备布防 Thread sleep 100000
  • Flutter 应用开发的pubspec.yaml文件说明

    pubspec yaml文件简介 作用 pubspec yaml是Flutter项目中的配置文件 它用于定义项目的依赖项 资源文件以及其他相关配置 示例 name audioplayers example description Demon
  • 进程和线程的区别

    转自文章进程和线程的区别 面试必考 进程和线程的区别 1 根本区别 进程和线程的根本区别是进程是操作系统 OS 资源分配的基本单位 而线程是处理器 CPU 任务调度和执行的基本单位 2 资源开销 每个进程都有独立的代码和数据空间 程序上下文