說明: 本文在原文基礎(chǔ)上做了幾處修改和補充,原文地址見文章末尾
定義:
一 程序只是一組指令的有序集合喜庞。
二 進(jìn)程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位;
三 線程是進(jìn)程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),一個線程可以創(chuàng)建和撤銷另一個線程;
-
計算機的核心是CPU,它承擔(dān)了所有的計算任務(wù)譬重。它就像一座工廠读整,時刻在運行簿训。 -
假定工廠的電力有限,一次只能供給一個車間使用。也就是說强品,一個車間開工的時候膘侮,其他車間都必須停工。背后的含義就是的榛,單個CPU一次只能運行一個任務(wù)琼了。 -
進(jìn)程就好比工廠的車間,它代表CPU所能處理的單個任務(wù)夫晌。
任一時刻雕薪,CPU總是運行一個進(jìn)程,其他進(jìn)程處于非運行狀態(tài)晓淀。
有的OS中CPU的調(diào)度單位是線程所袁,一次只能執(zhí)行一個線程(當(dāng)然多核的有幾核就能同時執(zhí)行幾個線程),而不是一次執(zhí)行一個進(jìn)程凶掰! -
一個車間里燥爷,可以有很多工人。他們協(xié)同完成一個任務(wù)懦窘。 -
線程就好比車間里的工人前翎。一個進(jìn)程可以包括多個線程。 -
車間的空間是工人們共享的畅涂,比如許多房間是每個工人都可以進(jìn)出的港华。這象征一個進(jìn)程的內(nèi)存空間是共享的,每個線程都可以使用這些共享內(nèi)存毅戈。 -
可是苹丸,每間房間的大小不同,有些房間最多只能容納一個人苇经,比如廁所赘理。里面有人的時候,其他人就不能進(jìn)去了扇单。這代表一個線程使用某些共享內(nèi)存時商模,其他線程必須等它結(jié)束,才能使用這一塊內(nèi)存蜘澜。
(PS:)因為線程間同步是為了防止競爭(就是說因同時修改施流,而導(dǎo)致的數(shù)據(jù)不一致)。本質(zhì)上講鄙信,進(jìn)程的內(nèi)存空間是天然獨立的瞪醋,線程的內(nèi)存空間是天然共享的。 -
一個防止他人進(jìn)入的簡單方法装诡,就是門口加一把鎖银受。先到的人鎖上門践盼,后到的人看到上鎖,就在門口排隊宾巍,等鎖打開再進(jìn)去咕幻。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex)顶霞,防止多個線程同時讀寫某一塊內(nèi)存區(qū)域肄程。 -
還有些房間,可以同時容納n個人选浑,比如廚房蓝厌。也就是說,如果人數(shù)大于n古徒,多出來的人只能在外面等著褂始。這好比某些內(nèi)存區(qū)域,只能供給固定數(shù)目的線程使用描函。 -
這時的解決方法,就是在門口掛n把鑰匙狐粱。進(jìn)去的人就取一把鑰匙舀寓,出來時再把鑰匙掛回原處。后到的人發(fā)現(xiàn)鑰匙架空了肌蜻,就知道必須在門口排隊等著了互墓。這種做法叫做"信號量"(Semaphore),用來保證多個線程不會互相沖突蒋搜。
不難看出篡撵,mutex是semaphore的一種特殊情況(n=1時)。也就是說豆挽,完全可以用后者替代前者育谬。但是,因為mutex較為簡單帮哈,且效率高膛檀,所以在必須保證資源獨占的情況下,還是采用這種設(shè)計娘侍。
- 操作系統(tǒng)的設(shè)計咖刃,因此可以歸結(jié)為三點:
(1)以多進(jìn)程形式,允許多個任務(wù)同時運行憾筏;
(2)以多線程形式嚎杨,允許單個任務(wù)分成不同的部分運行;
(3)提供協(xié)調(diào)機制氧腰,一方面防止進(jìn)程之間和線程之間產(chǎn)生沖突枫浙,另一方面允許進(jìn)程之間和線程之間共享資源刨肃。
- 進(jìn)程與線程區(qū)別與聯(lián)系總結(jié):
- 劃分尺度:線程更小,所以多線程程序并發(fā)性更高;
- 資源分配&處理器調(diào)度:進(jìn)程是資源分配的基本單位自脯,線程是處理器調(diào)度的基本單位
- 地址空間:進(jìn)程擁有獨立的地址空間之景;線程沒有獨立的地址空間,同一進(jìn)程內(nèi)多個線程共享其資源
- 執(zhí)行:每個線程都有一個程序運行的入口膏潮,順序執(zhí)行序列和程序的出口锻狗,但線程不能單獨執(zhí)行,必須組成進(jìn)程焕参,一個進(jìn)程至少有一個主線程轻纪。線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行叠纷。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用刻帚,來實現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。
- 簡而言之涩嚣,一個程序至少有一個進(jìn)程崇众,一個進(jìn)程至少有一個線程。 *