轉(zhuǎn)自http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
作者:阮一峰
日期:2013年4月24日
進程(process)和線程(thread)是操作系統(tǒng)的基本概念向图,但是它們比較抽象,不容易掌握。
最近,我讀到一篇材料币绩,發(fā)現(xiàn)有一個很好的類比叫搁,可以把它們解釋地清晰易懂。
1.
計算機的核心是CPU吐葵,它承擔(dān)了所有的計算任務(wù)污筷。它就像一座工廠工闺,時刻在運行。
2.
假定工廠的電力有限,一次只能供給一個車間使用陆蟆。也就是說雷厂,一個車間開工的時候,其他車間都必須停工遍搞。背后的含義就是罗侯,單個CPU一次只能運行一個任務(wù)器腋。
3.
進程就好比工廠的車間溪猿,它代表CPU所能處理的單個任務(wù)。任一時刻纫塌,CPU總是運行一個進程诊县,其他進程處于非運行狀態(tài)。
4.
一個車間里措左,可以有很多工人依痊。他們協(xié)同完成一個任務(wù)。
5.
線程就好比車間里的工人怎披。一個進程可以包括多個線程胸嘁。
6.
車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的凉逛。這象征一個進程的內(nèi)存空間是共享的性宏,每個線程都可以使用這些共享內(nèi)存。
7.
可是状飞,每間房間的大小不同毫胜,有些房間最多只能容納一個人,比如廁所诬辈。里面有人的時候酵使,其他人就不能進去了。這代表一個線程使用某些共享內(nèi)存時焙糟,其他線程必須等它結(jié)束口渔,才能使用這一塊內(nèi)存。
8.
一個防止他人進入的簡單方法穿撮,就是門口加一把鎖搓劫。先到的人鎖上門,后到的人看到上鎖混巧,就在門口排隊枪向,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion咧党,縮寫 Mutex)秘蛔,防止多個線程同時讀寫某一塊內(nèi)存區(qū)域。
9.
還有些房間,可以同時容納n個人深员,比如廚房负蠕。也就是說,如果人數(shù)大于n倦畅,多出來的人只能在外面等著遮糖。這好比某些內(nèi)存區(qū)域,只能供給固定數(shù)目的線程使用叠赐。
10.
這時的解決方法撤蚊,就是在門口掛n把鑰匙河绽。進去的人就取一把鑰匙巢钓,出來時再把鑰匙掛回原處位喂。后到的人發(fā)現(xiàn)鑰匙架空了,就知道必須在門口排隊等著了罢洲。這種做法叫做"信號量"(Semaphore)踢故,用來保證多個線程不會互相沖突。
不難看出惹苗,mutex是semaphore的一種特殊情況(n=1時)殿较。也就是說,完全可以用后者替代前者桩蓉。但是淋纲,因為mutex較為簡單,且效率高触机,所以在必須保證資源獨占的情況下帚戳,還是采用這種設(shè)計。
11.
操作系統(tǒng)的設(shè)計儡首,因此可以歸結(jié)為三點:
(1)以多進程形式片任,允許多個任務(wù)同時運行;
(2)以多線程形式蔬胯,允許單個任務(wù)分成不同的部分運行对供;
(3)提供協(xié)調(diào)機制,一方面防止進程之間和線程之間產(chǎn)生沖突氛濒,另一方面允許進程之間和線程之間共享資源产场。
(完)