并发和并行
并发
并发是指运行的程序以我们不知道的顺序进行,比如A程序输出(1,2,3),B程序输出(4,5,6),我们先后运行A,B两个程序发现输出的顺序并不是1,2,3,4,5,6而是以打乱的顺序输出的,那我们就可以说这两个程序是并发执行的。但是在某一个时间点,只有一个程序在运行。
并行
那么什么是并行呢,并行和并发有一点相似,但是他是真正的在某一时间点有两个程序在同时运行,那么并行的前提就是拥有多核的cpu或者多个cpu,只有并发的程序才有并行的机会
进程,线程,协程
进程
- 进程就是为了更好的利用cpu资源而出现的,假设两个任务A,B比如我们同时听音乐和浏览网页就可以说是两个进程,但是cpu只有一个,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费,若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行,这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源,通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。
- 进程是系统资源分配的最小单位,进程占用的资源有:地址空间,全局变量,文件描述符,各种硬件等等资源
线程
- 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
- 有的时候碰着I/O访问,阻塞了后面所有的计算。空着也是空着,老大就直接把CPU切换到其他进程,让人家先用着。当然除了I/O阻塞,还有时钟阻塞等等。一开始大家都这样弄,后来发现不成,太慢了。为啥呀,一切换进程得反复进入内核,置换掉一大堆状态。进程数一高,大部分系统资源就被进程切换给吃掉了。后来搞出线程的概念,大致意思就是,这个地方阻塞了,但我还有其他地方的逻辑流可以计算,这些逻辑流是共享一个地址空间的,不用特别麻烦的切换页表、刷新TLB,只要把寄存器刷新一遍就行,能比切换进程开销少点。
协程
- 协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。
- 时钟阻塞、 线程切换这些功能我们都不需要了,自己在进程里面写一个逻辑流调度的东西。那么我们即可以利用到并发优势,又可以避免反复系统调用,还有进程切换造成的开销,分分钟给你上几千个逻辑流不费力。这就是用户态线程。
- 本质上协程就是用户空间下的线程。
小结
进程,线程,协程不断突破,更高效的处理阻塞,不断地提高CPU的利用率。但是并不是说,线程就一定比进程快,而协程就一定不线程要快。具体还是要看应用场景。可以简单粗暴的把应用分为IO密集型应用以及CPU密集型应用。
多核CPU,CPU密集型应用
此时多线程的效率是最高的,多线程可以使到全部CPU核心满载,又避免了协程间切换造成性能损失。当CPU密集型任务时,CPU一直在利用着,切换反而会造成性能损失,即便协程上下文切换消耗最小,但也还是有消耗的。
多核CPU,IO密集型应用
此时采用多线程多协程效率最高,多线程可以使到全部CPU核心满载,而一个线程多协程,则更好的提高了CPU的利用率。
单核CPU,CPU密集型应用
单进程效率是最高,此时单个进程已经使到CPU满载了。
单核CPU,IO密集型应用
多协程,效率最高。例如,看了上面应该也是知道的了
参考:知乎回答:协程的好处有哪些?
参考:进程,线程,协程与并行,并发

1万+

被折叠的 条评论
为什么被折叠?



