進(jìn)程推盛、線程和協(xié)程的理解

轉(zhuǎn)載自 https://www.cnblogs.com/guolei2570/p/8810536.html

一冕房、進(jìn)程

進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)住册,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)雹拄。在早期面向進(jìn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中收奔,進(jìn)程是程序的基本執(zhí)行實(shí)體;在當(dāng)代面向線程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中滓玖,進(jìn)程是線程的容器坪哄。程序是指令、數(shù)據(jù)及其組織形式的描述势篡,進(jìn)程是程序的實(shí)體翩肌。

組成

進(jìn)程是一個(gè)實(shí)體。每一個(gè)進(jìn)程都有它自己的地址空間禁悠,一般情況下念祭,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)碍侦。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼粱坤;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)著活動(dòng)過程調(diào)用的指令和本地變量瓷产。

特征

動(dòng)態(tài)性:進(jìn)程的實(shí)質(zhì)是程序在多道程序系統(tǒng)中的一次執(zhí)行過程站玄,進(jìn)程是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的濒旦。
并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行
獨(dú)立性:進(jìn)程是一個(gè)能獨(dú)立運(yùn)行的基本單位株旷,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;
異步性:由于進(jìn)程間的相互制約疤估,使進(jìn)程具有執(zhí)行的間斷性灾常,即進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)
結(jié)構(gòu)特征:進(jìn)程由程序铃拇、數(shù)據(jù)和進(jìn)程控制塊三部分組成钞瀑。
多個(gè)不同的進(jìn)程可以包含相同的程序:一個(gè)程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進(jìn)程,能得到不同的結(jié)果慷荔;但是執(zhí)行過程中雕什,程序不能發(fā)生改變。

狀態(tài)

這里寫圖片描述

二显晶、線程

線程贷岸,有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP)磷雇,是程序執(zhí)行流的最小單元偿警。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC)唯笙,寄存器集合和堆棧組成螟蒸。另外,線程是進(jìn)程中的一個(gè)實(shí)體崩掘,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位七嫌,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源苞慢,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源诵原。

線程是程序中一個(gè)單一的順序控制流程。進(jìn)程內(nèi)有一個(gè)相對(duì)獨(dú)立的挽放、可調(diào)度的執(zhí)行單元绍赛,是系統(tǒng)獨(dú)立調(diào)度和分派CPU的基本單位指令運(yùn)行時(shí)的程序的調(diào)度單位。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作辑畦,稱為多線程惹资。

特點(diǎn)

在多線程OS中,通常是在一個(gè)進(jìn)程中包括多個(gè)線程航闺,每個(gè)線程都是作為利用CPU的基本單位褪测,是花費(fèi)最小開銷的實(shí)體。線程具有以下屬性潦刃。
1)輕型實(shí)體
線程中的實(shí)體基本上不擁有系統(tǒng)資源侮措,只是有一點(diǎn)必不可少的、能保證獨(dú)立運(yùn)行的資源乖杠。
線程的實(shí)體包括程序分扎、數(shù)據(jù)和TCB。線程是動(dòng)態(tài)概念胧洒,它的動(dòng)態(tài)特性由線程控制塊TCB(Thread Control Block)描述畏吓。TCB包括以下信息:
(1)線程狀態(tài)墨状。
(2)當(dāng)線程不運(yùn)行時(shí),被保存的現(xiàn)場(chǎng)資源菲饼。
(3)一組執(zhí)行堆棧肾砂。
(4)存放每個(gè)線程的局部變量主存區(qū)。
(5)訪問同一個(gè)進(jìn)程中的主存和其它資源宏悦。
用于指示被執(zhí)行指令序列的程序計(jì)數(shù)器镐确、保留局部變量、少數(shù)狀態(tài)參數(shù)和返回地址等的一組寄存器和堆棧饼煞。
2)獨(dú)立調(diào)度和分派的基本單位源葫。
在多線程OS中,線程是能獨(dú)立運(yùn)行的基本單位砖瞧,因而也是獨(dú)立調(diào)度和分派的基本單位息堂。由于線程很“輕”,故線程的切換非常迅速且開銷锌榇佟(在同一進(jìn)程中的)储矩。
3)可并發(fā)執(zhí)行。
在一個(gè)進(jìn)程中的多個(gè)線程之間褂乍,可以并發(fā)執(zhí)行持隧,甚至允許在一個(gè)進(jìn)程中所有線程都能并發(fā)執(zhí)行;同樣逃片,不同進(jìn)程中的線程也能并發(fā)執(zhí)行屡拨,充分利用和發(fā)揮了處理機(jī)與外圍設(shè)備并行工作的能力。
4)共享進(jìn)程資源褥实。

在同一進(jìn)程中的各個(gè)線程呀狼,都可以共享該進(jìn)程所擁有的資源,這首先表現(xiàn)在:所有線程都具有相同的地址空間(進(jìn)程的地址空間)损离,這意味著哥艇,線程可以訪問該地址空間的每一個(gè)虛地址;此外僻澎,還可以訪問進(jìn)程所擁有的已打開文件貌踏、定時(shí)器、信號(hào)量機(jī)構(gòu)等窟勃。由于同一個(gè)進(jìn)程內(nèi)的線程共享內(nèi)存和文件祖乳,所以線程之間互相通信不必調(diào)用內(nèi)核。

三秉氧、協(xié)程

協(xié)程與子例程一樣眷昆,協(xié)程(coroutine)也是一種程序組件。相對(duì)子例程而言,協(xié)程更為一般和靈活亚斋,但在實(shí)踐中使用沒有子例程那樣廣泛作媚。協(xié)程源自 Simula 和 Modula-2 語言,但也有其他語言支持帅刊。
協(xié)程不是進(jìn)程或線程纸泡,其執(zhí)行過程更類似于子例程,或者說不帶返回值的函數(shù)調(diào)用厚掷。
一個(gè)程序可以包含多個(gè)協(xié)程弟灼,可以對(duì)比與一個(gè)進(jìn)程包含多個(gè)線程级解,
因而下面我們來比較協(xié)程和線程冒黑。我們知道多個(gè)線程相對(duì)獨(dú)立,有自己的上下文勤哗,切換受系統(tǒng)控制抡爹;而協(xié)程也相對(duì)獨(dú)立,有自己的上下文芒划,但是其切換由自己控制冬竟,由當(dāng)前協(xié)程切換到其他協(xié)程由當(dāng)前協(xié)程來控制。
協(xié)程和線程區(qū)別:協(xié)程避免了無意義的調(diào)度民逼,由此可以提高性能泵殴,但也因此,程序員必須自己承擔(dān)調(diào)度的責(zé)任拼苍,同時(shí)笑诅,協(xié)程也失去了標(biāo)準(zhǔn)線程使用多CPU的能力。

四疮鲫、進(jìn)程和線程的關(guān)系和區(qū)別

這里寫圖片描述

1吆你、地址空間:進(jìn)程內(nèi)的一個(gè)執(zhí)行單元;進(jìn)程至少有一個(gè)線程;它們共享進(jìn)程的地址空間;而進(jìn)程有自己獨(dú)立的地址空間;因此線程可以讀寫同樣的數(shù)據(jù)結(jié)構(gòu)和變量,便于線程之間的通信俊犯。相反妇多,進(jìn)程間通信(IPC)很困難且消耗更多資源。
2燕侠、資源擁有:進(jìn)程是資源分配和擁有的單位,同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程的資源
3者祖、進(jìn)程是資源的分配和調(diào)度的一個(gè)獨(dú)立單元,而線程是CPU調(diào)度的基本單元
4绢彤、二者均可并發(fā)執(zhí)行.
5咸包、進(jìn)程的創(chuàng)建調(diào)用fork或者vfork,而線程的創(chuàng)建調(diào)用pthread_create杖虾,進(jìn)程結(jié)束后它擁有的所有線程都將銷毀烂瘫,而線程的結(jié)束不會(huì)影響同個(gè)進(jìn)程中的其他線程的結(jié)束
6、線程有自己的私有屬性TCB,線程id坟比,寄存器芦鳍、硬件上下文,而進(jìn)程也有自己的私有屬性進(jìn)程控制塊PCB葛账,這些私有屬性是不被共享的柠衅,用來標(biāo)示一個(gè)進(jìn)程或一個(gè)線程的標(biāo)志

五、優(yōu)缺點(diǎn)

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小籍琳,但不利于資源的管理和保護(hù)菲宴;而進(jìn)程正相反。同時(shí)趋急,線程適合于在SMP機(jī)器上運(yùn)行喝峦,而進(jìn)程則可以跨機(jī)器遷移。



最后送上呜达,從網(wǎng)上找的材料谣蠢,以圖文方式將進(jìn)程和線程做的很好的解釋清晰易懂:

1、


CPU就像一座工廠

計(jì)算機(jī)的核心是CPU查近,它承擔(dān)了所有的計(jì)算任務(wù)眉踱。它就像一座工廠,時(shí)刻在運(yùn)行霜威。
2谈喳、


一次只能供給一個(gè)車間使用

假定工廠的電力有限,一次只能供給一個(gè)車間使用戈泼。也就是說婿禽,一個(gè)車間開工的時(shí)候,其他車間都必須停工矮冬。背后的含義就是谈宛,單個(gè)CPU一次只能運(yùn)行一個(gè)任務(wù)。
3胎署、


這里寫圖片描述

進(jìn)程就好比工廠的車間吆录,它代表CPU所能處理的單個(gè)任務(wù)。任一時(shí)刻琼牧,CPU總是運(yùn)行一個(gè)進(jìn)程恢筝,其他進(jìn)程處于非運(yùn)行狀態(tài)
4、


這里寫圖片描述

一個(gè)車間里巨坊,可以有很多工人撬槽。他們協(xié)同完成一個(gè)任務(wù)。
5趾撵、


這里寫圖片描述

線程就好比車間里的工人侄柔。一個(gè)進(jìn)程可以包括多個(gè)線程共啃。
6、


這里寫圖片描述

車間的空間是工人們共享的暂题,比如許多房間是每個(gè)工人都可以進(jìn)出的移剪。這象征一個(gè)進(jìn)程的內(nèi)存空間是共享的,每個(gè)線程都可以使用這些共享內(nèi)存薪者。
7纵苛、


這里寫圖片描述

可是,每間房間的大小不同言津,有些房間最多只能容納一個(gè)人攻人,比如廁所。里面有人的時(shí)候悬槽,其他人就不能進(jìn)去了怀吻。這代表一個(gè)線程使用某些共享內(nèi)存時(shí),其他線程必須等它結(jié)束陷谱,才能使用這一塊內(nèi)存烙博。
8瑟蜈、


這里寫圖片描述

一個(gè)防止他人進(jìn)入的簡單方法烟逊,就是門口加一把鎖。先到的人鎖上門铺根,后到的人看到上鎖宪躯,就在門口排隊(duì),等鎖打開再進(jìn)去位迂。這就叫”互斥鎖”(Mutual exclusion访雪,縮寫 Mutex),防止多個(gè)線程同時(shí)讀寫某一塊內(nèi)存區(qū)域掂林。
9臣缀、


這里寫圖片描述

還有些房間,可以同時(shí)容納n個(gè)人泻帮,比如廚房精置。也就是說,如果人數(shù)大于n锣杂,多出來的人只能在外面等著脂倦。這好比某些內(nèi)存區(qū)域,只能供給固定數(shù)目的線程使用元莫。
10赖阻、


這里寫圖片描述

這時(shí)的解決方法,就是在門口掛n把鑰匙踱蠢。進(jìn)去的人就取一把鑰匙火欧,出來時(shí)再把鑰匙掛回原處。后到的人發(fā)現(xiàn)鑰匙架空了,就知道必須在門口排隊(duì)等著了苇侵。這種做法叫做”信號(hào)量”(Semaphore)离陶,用來保證多個(gè)線程不會(huì)互相沖突。

不難看出衅檀,mutex是semaphore的一種特殊情況(n=1時(shí))招刨。也就是說,完全可以用后者替代前者哀军。但是沉眶,因?yàn)閙utex較為簡單,且效率高杉适,所以在必須保證資源獨(dú)占的情況下谎倔,還是采用這種設(shè)計(jì)。
11猿推、


這里寫圖片描述

操作系統(tǒng)的設(shè)計(jì)片习,因此可以歸結(jié)為三點(diǎn):

(1)以多進(jìn)程形式,允許多個(gè)任務(wù)同時(shí)運(yùn)行蹬叭;

(2)以多線程形式藕咏,允許單個(gè)任務(wù)分成不同的部分運(yùn)行;

(3)提供協(xié)調(diào)機(jī)制秽五,一方面防止進(jìn)程之間和線程之間產(chǎn)生沖突孽查,另一方面允許進(jìn)程之間和線程之間共享資源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坦喘,一起剝皮案震驚了整個(gè)濱河市盲再,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓣铣,老刑警劉巖答朋,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棠笑,居然都是意外死亡梦碗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門腐晾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叉弦,“玉大人,你說我怎么就攤上這事藻糖⊙捅” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵巨柒,是天一觀的道長樱拴。 經(jīng)常有香客問我柠衍,道長,這世上最難降的妖魔是什么晶乔? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任珍坊,我火速辦了婚禮,結(jié)果婚禮上正罢,老公的妹妹穿的比我還像新娘阵漏。我一直安慰自己,他們只是感情好翻具,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布履怯。 她就那樣靜靜地躺著,像睡著了一般裆泳。 火紅的嫁衣襯著肌膚如雪叹洲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天工禾,我揣著相機(jī)與錄音运提,去河邊找鬼。 笑死闻葵,一個(gè)胖子當(dāng)著我的面吹牛民泵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笙隙,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼洪灯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坎缭!你這毒婦竟也來了竟痰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤掏呼,失蹤者是張志新(化名)和其女友劉穎坏快,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憎夷,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莽鸿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拾给。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祥得。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒋得,靈堂內(nèi)的尸體忽然破棺而出级及,到底是詐尸還是另有隱情,我是刑警寧澤额衙,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布饮焦,位于F島的核電站怕吴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏县踢。R本人自食惡果不足惜转绷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硼啤。 院中可真熱鬧议经,春花似錦、人聲如沸谴返。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏镰。三九已至扯旷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間索抓,已是汗流浹背钧忽。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逼肯,地道東北人耸黑。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像篮幢,于是被迫代替她去往敵國和親大刊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容