一、进程、线程、协程
1,进程
进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
2,线程(thread)(内核级线程)
线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。
3,协程(用户级线程)
协程是一种用户态的轻量级线程,又称微线程。协程调度完全由用户控制,相当于子程序。
4,区别
1、资源方面:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程不可见
2、通信:进程间通信IPC,进程间可以直接读写进程数据段进行通信——需要进程同步和互斥手段辅助,以保证数据的一致性,线程通信主要通过共享内存
3、调度和切换:线程上下文切换比进程上下文切换要快的多
4、对于 进程、线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法),对于 协程(用户级线程),这是对内核透明的,是由用户程序自己控制,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。
进程优点:
1. 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
进程缺点:
在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。多进程的程序要比多线程的程序健壮,但在进程创建、切换、撤销时,耗费资源较大,效率要差一些。
进程间通信(IPC)较为复杂和耗时
线程优点:
1.线程的出现是为了减少任务切换的消耗,提高系统的并发性,实现让一个进程也能执行多个任务
线程缺点:
1.线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉
2.线程没有自己的系统资源,只有运行时不可缺少的资源,但是同一进程的各线程可以共享进程所拥有的系统资源。对于某些独占资源存在锁机制,处理不当会出现死锁。
协程优点:
1.协程执行效率高。因为子程序切换不是线程切换,由程序自身控制,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。
2.协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好,所以执行效率比多线程高很多。
5.场景
多进程:
密集CPU任务,需要重复利用CPU多核资源(大量的并行计算)
多线程:
密集IO任务(网络IO,磁盘IO,数据库IO)
协程:
当程序中存在大量不需要CPU的操作时
最高效的组合:利用多核CPU最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能
6.进程/线程之间的亲缘性
亲缘性的意思是进程/线程只在某个cpu上运行(多核系统),比如:
使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能。
二、小结
核心只有一个,线程是操作系统调度,协程是用户态调度。协程不必须是语言集成,例如C语言可以用setjmp/longjmp实现,也可以自己通过改变esp指针换栈实现协程。 协程本身跟高吞吐没任何关系,基于io多路复用+回调就可以实现高并发和高吞吐。引入协程是为了将回调逻辑变成线性同步逻辑。
《本文》有 0 条评论