现代操作系统比如Mac OS X
,UNIX
,Linux
,Windows
等,都是支持“多任务”
的操作系统。简单地说,就是操作系统可以同时运行多个任务。
打个比方,你一边在用浏览器上网,一边在听MP3
,一边在用Word
赶作业,这就是多任务,至少同时有3个任务
正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。
现在,多核CPU
已经非常普及了,但是,即使过去的单核CPU
,也可以执行多任务。由于CPU
执行代码都是顺序执行的,那么,单核CPU
是怎么执行多任务的呢?
答案就是操作系统轮流让各个任务交替执行,任务1
执行 0.01 秒,切换到任务2
,任务2
执行 0.01 秒,再切换到任务3
,执行 0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU
的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
有些进程还不止同时干一件事,比如Word
,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”
,我们把进程内的这些“子任务”
称为线程(Thread
)。
由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word
这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU
才可能实现。
-
进程:资源(
CPU
、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU
时间,程序开始真正运行。 -
线程:程序执行时的最小单位,它是进程的一个执行流,是
CPU
调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU
独立调度执行,在多CPU
环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。 -
线程和进程各自有什么区别和优劣呢?
-
进程是资源分配的最小单位,线程是程序执行的最小单位。
-
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此
CPU
切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 -
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(
IPC
)进行。不过如何处理好同步与互斥是编写多线程程序的难点。 -
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
-
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~