多进程概念(1):
----当前的操作系统都是多任务OS(在windows上同时写着文档,听着音乐,聊着QQ,同时打开好几个应用程序)
----每个独立执行的任务就是一个进程
----OS将时间划分为多个时间片(每个时间片很短,可能只有几个纳秒几个微秒)
----每个时间片内将CPU分配给某一个任务,时间片结束,CPU将自动回收,再分配给另外任务。从外部看,所有任务是同时在执行(音乐一直在放,QQ一直在接收消息)。但是在CPU上,任务是按照串行顺序依次运行(假设在单核CPU上运行,CPU一直在工作,空闲状态有个空闲进程)。如果是多核CPU,多个进程任务可以并行(任务A分配到第一个核,任务B分配到第二个核)。但是单个核上,多进程只能串行执行(使用者感官上认为是同时执行的)。
多进程概念(2):
多进程的优点:(OS最开始是单个进程,单作业系统,到后来的多任务OS)
(1)可以同时运行多个任务
(2)程序因IO堵塞时,可以释放CPU(这时CPU是空闲的所以可以释放),让CPU为其他程序服务(CPU是计算的组件,我们希望提高CPU的利用率,当前状态IO堵塞了,CPU处于空闲的状态,即idle状态,就释放掉让它为其它程序工作)
(3)当系统有多个CPU时,可以为多个程序同时服务
----我们的电脑都是四核、八核,为什么有这个多个核(多个CPU),因为CPU的发展,我们的CPU不再提高频率了,由于受到晶体管数量和系统运行时产生出来的热量的限制,那么CPU已经在频率上没法提高了。CPU频率提高到3G到4G时,频率不再提高了,因为固定面积下晶体管数量没法再加了
----2005年Herb Sutter的文章The free lunch is over,指明多核和并行程序才是提高程序性能的唯一办法。什么是免费午餐,如果我们想提高程序的运行速度,只能换CPU,更好的频率更大的CPU即可
把程序分成很多个小程序,可以同时在很多CPU上同时执行
多进程的缺点:
(1)太笨重,不好管理
OS层面说,进程比较大,OS能同时打开多少个应用程序(可以理解成能同时打开多少个进程),一个计算机能同时运行多少个进程,总归是有限的,可能几百个,基本上机器就很慢了,内存都被消耗完了
(2)太笨重,不好切换
比如IO堵塞时,可以释放CPU,让CPU去服务别的程序,对于CPU来说,需要把另一个程序的内容加载进来,进程的内容比较多,做进程切换的时候,不好切换
多线程概念:
----一个程序可以包括多个子任务,可串 / 并行(比如main函数有很多内容,可以把这些内容组合成很多模块,一个函数一个模块,我就分模块来编程。一个程序可以包括多个子任务,只要子任务之间,耦合关系较少,不存在先后执行顺序)
----每个子任务可以称为一个线程
----如果一个子任务阻塞,程序可以将CPU调度另外一个子任务进行工作。这样CPU还是保留在本程序中,而不是被调度到别的程序(进程)去。这样,提高本程序所获得CPU时间和利用率
多进程和多线程对比:
(1)线程共享数据(线程都属于同一个程序里面,只是不同的子模块,它们之间可以共享一部分数据)
(2)线程通讯更加高效(线程都属于同一个程序,兄弟模块。而进程和进程之间比如word和QQ之间怎么交换数据就很难交换)
(3)线程更轻量级,更容易切换(线程切换的时间少代价更小,CPU的利用率更大)
(4)多个线程更加容易管理
举个例子:进程的demo
线程的demo:
第6行的start方法将会调用第17行的run方法(第17行的run方法以线程的方式执行)
通过这个例子可以看出,多线程因为在一个程序里面,它们的通讯、协调、同步比起多进程都是比较容易做的