一个有趣的例子
1,我们公司一开始带饭的人不是很多,公司只有一个茶水间,于是行政的小姐姐很体贴的买了一个微波炉放到茶水间,然后大家中午可以在茶水间排队去热饭。很开心。
2,后来公司发展越来越好,不断有新鲜的血液注入到公司,充满了活力,带饭的人越来越多,行政小姐姐发现一个微波炉根本不够用,于是又卖了两个,大家中午继续去茶水间排队去热饭,速度比以前快了许多,大大缓解了排队过长的压力。
3,某一天公司上市了,发展一片大好,人员也越来越多,于是公司换了新的办公地点,将原来的一个茶水间扩充到了3个,微波炉每个茶水间放5个,同时雇了一个阿姨,专门辅助员工的一些生活方面的事,让员工可以安安心心工作,于是变成了这样,到中午的时候,员工选择3个茶水间一个,将饭盒放在茶水间里,阿姨负责将饭热好放到指定位置,一个阿姨就可以同时操作多个微波炉,一个热好后取出放入下一个,大大提高了热饭效率,热好的饭可以放到指定位置一会自己来取即可,也可以送到员工的位置,大家中午再也不用排队热饭了,
茶水间 ≈ 进程
多个茶水间相当于多进程(放在python也可以理解为多核),大大提高了效率,但同时开销也很多,增加一个茶水间的代价远大于增加一个微波炉。
进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
顺序使用微波炉 ≈ 线程
大家排队去茶水间热饭,先到的先热,同一茶水间同时只有一个人在热饭。即使有多个微波炉也是顺序的开始工作,三个微波炉相当于三个线程,同时可以热三份饭,但热饭的人是顺序进入茶水间的。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。
雇佣的阿姨操作微波炉 ≈ 协程
阿姨可以同时操作多个微波炉,一个热好后取出放入下一个,大大提高了热饭效率,哪个微波炉热好就先用哪个,所以协程是无序的,大大提高了工作效率。
协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。
热好饭后的动作 ≈ 回调
阿姨热好饭之后放到指定位置,每个人可以根据自己的时间过来取,如果阿姨空闲了也可以送到员工工位。
同步
公司初期人员较少,所有员工在唯一的一个茶水间排队使用同一个微波炉,顺序使用微波炉。
并发
公司中期增加了微波炉的数量,所有员工在茶水间排队使用多个微波炉,多个微波炉同时工作。
异步
公司发展后期增加了茶水间和微波炉的数量,只有一个阿姨使用多个茶水间的微波炉,只有在微波炉可以使用的条件下才去使用,其他时间可以干其他事情。
总结
一、进程,线程,协程的区别与联系
【区别】:
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等;
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
【联系】:
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
资源分配给进程,同一进程的所有线程共享该进程的所有资源;
处理机分给线程,即真正在处理机上运行的是线程;
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
二,python中的实现
(1)进程可使用multiprocessing包实现
(2)线程可使用threading包或thread包
(3)协程通过async await 实现,async声明一个函数为异步函数,await可将程序挂起,去执行其他的异步程序。协程 有两种,一种 无栈协程,python 中 以 asyncio 为代表, 一种有栈协程,python 中 以 gevent 为代表。
三,操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
网友评论