出于对自己对多进程和多线程概念理解的怀疑,便花时间深入学习了一下。我的目的是将一个生动的围绕CPU运行的动作模型描述出来。
我们先看专业书上是怎么解释的——进程是资源分配的最小单位,线程是CPU调度的最小单位——。
只要能把这句话理解了,那也就对多进程与多线程理解的差不多了。
我们来看一下操作系统是怎么协调程序利用单核CPU,内存来运行的:因为是单核的,原则上讲应该是执行一段线程,再切换到令一个线程,是只能这样,但是操作系统是怎么做使得看起来多个程序同时运行的呢?操作系统给每一个程序的运行实体——>进程分配了一个时间片,既一次周期一个进程能获得的最大运行线程的时间,这样如果那个时间片十分短,那么人看起来就是几个进程同时运行。
所谓的一个进程就是一至多个线程的集合,真正执行的是线程。
单线程:
<IGNORE_JS_OP>
多线程:
<IGNORE_JS_OP>
还是单核CPU,我们说一个进程的多线程,简单来说就是在一个时间片内每一个线程有同等的几乎同等的机会去获得CPU,这样看起来就像是线程是同时运行了。那有人会说,这样总时间不是没变么?这又涉及到一个问题,就是线程优先级问题:
windows系统的线程优先级分0-31级不等,只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程。高优先级线程往往“打断”低优先级线程的执行。比如,当一个优先级为15的线程正在运行,如果此时系统发现一个优先级比15高的线程可以调度,那么该高优先级线程会“打断”那个低优先级线程的执行,哪怕低优先级的时间片才过了一半。
由此可知,如果系统运行到了这个优先级的程序,那么基本上就是与这个程序优先级相同的那么几个程序在运行了,并且线程共享程序资源,而只有自己独立的栈空间,所以多线程的CPU利用率更高。
现在来看多核CPU,如果操作系统不划分时间片的话,那么单核CPU一次能执行一个线程,多核CPU一次就能执行与核数相同的线程数,达到线程并行(并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)
这样的话一个多核CPU就可以同一时刻运行多个线程。
如果理解了多线程,那么多进程只不过是多线程的功能加上程序资源放到独立的地址上。
多进程中每一个进程的地址,程序资源,堆栈空间都是独立的。
所以综上所述:多进程与多线程的区别就在于,多线程中每个线程执行的代码地址,利用的资源,都是共享的,只有栈是不同的因为参数不一样,多进程中不同进程的代码地址是不同的,用到资源是拷贝的。
看完以上,你应该能理解多线程与多进程的区别了。
再说点题外话,早期的python的多线程机制采取了GIL,这有别于java语言,python多线程不能实现真正意义上的并行,只能做到并发,但多进程可以,但并不是说多进程效率更高,对于爬虫这种IO密集型程序差不多的了。python这样做是为了数据安全,更详细的请百度吧。
python多线程I/O密集型:
<IGNORE_JS_OP>
我还是一样,抱着谦虚求教的态度,聆听读者的任何建议
转载自:http://bbs.fishc.com/thread-77899-1-1.html