进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程能够有多个线程。线程又叫作轻量级进程。程序员
进程是让操做系统的伪并发性成为可能算法
线程是让进程里面内部子任务的并发成为可能并发
最终目标是提升cpu的利用率高并发
进程是系统分配的最小单元,线程是cpu调度的最小单元操作系统
进程是具备必定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。.net
线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程
一个进程能够有多个线程,多个线程也能够并发执行协程
进程的生命周期:建立-就绪-运行-等待-死亡blog
线程的生命周期:新建-就绪-运行-阻塞-等待-锁池-死亡生命周期
二者的对比:
一、调度方面:在引入线程的OS中,线程是独立的调度和分派单位,而进程做为资源的拥有单位(至关于把未引入线程的传统OS中的进程的两个属性分开了)。因为线程不拥有资源,所以能够显著的提升并发度以及减小切换开销。
二、并发性:引入了线程的OS中,进程间能够并发,并且一个进程内部的多个线程之间也是能够并发的,这就使OS具备更好的并发性,有效的提升了系统资源利用率和吞吐量。
三、拥有资源:不管OS是否支持线程,进程都是基本的资源拥有单位,线程只拥有不多的基本的资源,可是线程能够访问所隶属的进程的资源(进程的代码段,数据段和所拥有的系统资源如fd)
四、系统开销:建立或者撤销进程的时候,系统要为之建立或回收PCB,系统资源等,切换时也须要保存和恢复CPU环境。而线程的切换只须要保存和恢复少许的寄存器,不涉及存储器管理方面的工做,因此开销较小。此外,统一进程中的多个线程因为共享地址空间,因此通讯同步等都比较方便。
如何理解一个程序能够对应多个进程,一个进程也能够对应多个程序?
一个程序能够重复运行,开几个窗口,好比网游的“双开”,一个进程能够对应多个程序就是一个DLL文件能够被多个程序运用,好比DirectX9的动态连接库,就是,许多游戏都要有它才能运行。这就如同的车和路的关系,要去一个地方,能够有多条路,而一条路也可到达多个地方。
从其余方面诠释:
一开始你们想要同一时间执行那么三五个程序,你们能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机同样。因而就有了并发,从程序员的角度能够当作是多个独立的逻辑流。内部能够是多cpu并行,也能够是单cpu时间分片,能快速的切换逻辑流,看起来像是你们一块跑的就行。
可是一块跑就有问题了。我计算到一半,刚把屡次方程解到最后一步,你忽然插进来,个人中间状态咋办,我用来储存的内存被你覆盖了咋办?因此跑在一个cpu里面的并发都须要处理上下文切换的问题。进程就是这样抽象出来的一个概念,搭配虚拟内存、进程表之类的东西,用来管理独立的程序运行、切换。
后来一个电脑上有了好几个cpu,好咧,你们都别闲着,一人跑一个进程。就是所谓的并行。
由于程序的使用涉及大量的计算机资源配置,把这活随意的交给用户程序,很是容易让整个系统分分钟被搞跪,资源分配也很难作到相对的公平。因此核心的操做须要陷入内核(kernel),切换到操做系统,让老大帮你来作。
有的时候碰着I/O访问,阻塞了后面全部的计算。空着也是空着,老大就直接把CPU切换到其余进程,让人家先用着。固然除了I\O阻塞,还有时钟阻塞等。一开始你们都这样弄,后来发现不成,太慢了。为啥呀,一切换进程得反复进入内核,置换掉一大堆状态。进程数一高,大部分系统资源就被进程切换给吃掉了。后来搞出线程的概念,大体意思就是,这个地方阻塞了,但我还有其余地方的逻辑流能够计算,这些逻辑流是共享一个地址空间的,不用特别麻烦的切换页表、刷新TLB,只要把寄存器刷新一遍就行,能比切换进程开销少点。
若是连时钟阻塞、 线程切换这些功能咱们都不须要了,本身在进程里面写一个逻辑流调度的东西。那么咱们便可以利用到并发优点,又能够避免反复系统调用,还有进程切换形成的开销,分分钟给你上几千个逻辑流不费力。这就是用户态线程。
从上面能够看到,实现一个用户态线程有两个必需要处理的问题:一是碰着阻塞式I\O会致使整个进程被挂起;二是因为缺少时钟阻塞,进程须要本身拥有调度线程的能力。若是一种实现使得每一个线程须要本身经过调用某个方法,主动交出控制权。那么咱们就称这种用户态线程是协做式的,便是协程。
本质上协程就是用户空间下的线程。
用户线程与内核线程
根据操做系统内核是否对线程可感知,能够把线程分为内核线程和用户线程。
引入用户线程,具体而言,有如下四个方面的优点:
(1)能够在不支持线程的操做系统中实现。
(2)建立和销毁线程、线程切换代价和线程管理的代价比内核线程少得多。
(3)容许每一个进程定制本身的调度算法,线程管理比较灵活。
(4)用户线程可以利用的表空间和堆栈空间比内核级线程多。
用户线程的缺点主要有如下两点:
(1)同一进程中只能同时有一个线程在运行,若是有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。
(2)页面失效也会产生相似的问题。
参考连接:
https://mp.weixin.qq.com/s/zuWRx1FGuBC-_HwuA7jK3w原文:https://blog.csdn.net/qq_35642036/article/details/82798749