線程和進(jìn)程

簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
線程的劃分尺度小于進(jìn)程拨扶,使得多線程程序的并發(fā)性高箫荡。
另外说榆,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存牛郑,從而極大地提高了程序的運(yùn)行效率怠肋。
線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口淹朋、順序執(zhí)行序列和程序的出口笙各。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中础芍,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制杈抢。
從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中仑性,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行惶楼。但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配诊杆。這就是進(jìn)程和線程的重要區(qū)別歼捐。

進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
一個(gè)線程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間晨汹,一個(gè)進(jìn)程崩潰后豹储,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑淘这。線程有自己的堆棧和局部變量剥扣,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉铝穷,所以多進(jìn)程的程序要比多線程的程序健壯钠怯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大曙聂,效率要差一些呻疹。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程筹陵,不能用進(jìn)程。

The term thread is used to refer to a separate path of execution for code.
The term process is used to refer to a running executable, which can encompass multiple threads.

線程用于指代一個(gè)獨(dú)立執(zhí)行的代碼路徑
進(jìn)程用于指代一個(gè)可執(zhí)行程序镊尺,他可以包含多個(gè)線程

當(dāng)一個(gè)可執(zhí)行程序中擁有多個(gè)獨(dú)立執(zhí)行的代碼路徑的時(shí)候朦佩,這就叫做多線程。

進(jìn)程

進(jìn)程(process)是一塊包含了某些資源的內(nèi)存區(qū)域庐氮。操作系統(tǒng)利用進(jìn)程把它的工作劃分為一些功能單元语稠。

進(jìn)程中所包含的一個(gè)或多個(gè)執(zhí)行單元稱(chēng)為線程(thread)。進(jìn)程還擁有一個(gè)私有的虛擬地址空間,該空間僅能被它所包含的線程訪問(wèn)仙畦。

線程只能歸屬于一個(gè)進(jìn)程并且它只能訪問(wèn)該進(jìn)程所擁有的資源输涕。當(dāng)操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程后,該進(jìn)程會(huì)自動(dòng)申請(qǐng)一個(gè)名為主線程或首要線程的線程慨畸。
應(yīng)用程序(application)是由一個(gè)或多個(gè)相互協(xié)作的進(jìn)程組成的莱坎。

線程

一個(gè)線程包含以下內(nèi)容:

<ul>
<li> 一個(gè)指向當(dāng)前被執(zhí)行指令的指令指針;</li>
<li> 一個(gè)棧寸士;</li>
<li> 一個(gè)寄存器值的集合檐什,定義了一部分描述正在執(zhí)行線程的處理器狀態(tài)的值;</li>
<li> 一個(gè)私有的數(shù)據(jù)區(qū)弱卡。</li>
</ul>

所有這些元素都?xì)w于線程執(zhí)行上下文的名下乃正。處在同一個(gè)進(jìn)程中的所有線程都可以訪問(wèn)該進(jìn)程所包含的地址空間,當(dāng)然也包含存儲(chǔ)在該空間中的所有資源婶博。

并行使用一些線程通常是我們?cè)趯?shí)現(xiàn)算法時(shí)的自然反應(yīng)瓮具。實(shí)際上,一個(gè)算法往往由一系列可以并發(fā)執(zhí)行的任務(wù)組成凡人。但是需要引起注意的是名党,使用大量的線程將引起過(guò)多的上下文切換,最終反而影響了性能划栓。

進(jìn)程與線程的一個(gè)簡(jiǎn)單解釋

<li> 計(jì)算機(jī)的核心是CPU兑巾,它承擔(dān)了所有的計(jì)算任務(wù)。它就像一座工廠忠荞,時(shí)刻在運(yùn)行蒋歌。</li>

<li> 假定工廠的電力有限,一次只能供給一個(gè)車(chē)間使用委煤。也就是說(shuō)堂油,一個(gè)車(chē)間開(kāi)工的時(shí)候,其他車(chē)間都必須停工碧绞。背后的含義就是府框,單個(gè)CPU一次只能運(yùn)行一個(gè)任務(wù)。</li>

<li> 進(jìn)程就好比工廠的車(chē)間讥邻,它代表CPU所能處理的單個(gè)任務(wù)迫靖。任一時(shí)刻,CPU總是運(yùn)行一個(gè)進(jìn)程兴使,其他進(jìn)程處于非運(yùn)行狀態(tài)系宜。</li>

<li> 一個(gè)車(chē)間里,可以有很多工人发魄。他們協(xié)同完成一個(gè)任務(wù)盹牧。</li>

<li> 線程就好比車(chē)間里的工人俩垃。一個(gè)進(jìn)程可以包括多個(gè)線程。</li>

<li> 車(chē)間的空間是工人們共享的汰寓,比如許多房間是每個(gè)工人都可以進(jìn)出的口柳。這象征一個(gè)進(jìn) <li> 程的內(nèi)存空間是共享的,每個(gè)線程都可以使用這些共享內(nèi)存有滑。</li>

<li> 可是跃闹,每間房間的大小不同,有些房間最多只能容納一個(gè)人俺孙,比如廁所辣卒。里面有人的時(shí)候,其他人就不能進(jìn)去了睛榄。這代表一個(gè)線程使用某些共享內(nèi)存時(shí)荣茫,其他線程必須等它結(jié)束,才能使用這一塊內(nèi)存场靴。</li>

<li> 一個(gè)防止他人進(jìn)入的簡(jiǎn)單方法啡莉,就是門(mén)口加一把鎖。先到的人鎖上門(mén)旨剥,后到的人看到上鎖咧欣,就在門(mén)口排隊(duì),等鎖打開(kāi)再進(jìn)去轨帜。這就叫"互斥鎖"(Mutual exclusion魄咕,縮寫(xiě) Mutex),防止多個(gè)線程同時(shí)讀寫(xiě)某一塊內(nèi)存區(qū)域蚌父。</li>

<li> 還有些房間哮兰,可以同時(shí)容納n個(gè)人,比如廚房苟弛。也就是說(shuō)喝滞,如果人數(shù)大于n,多出來(lái)的人只能在外面等著膏秫。這好比某些內(nèi)存區(qū)域右遭,只能供給固定數(shù)目的線程使用。</li>

<li> 這時(shí)的解決方法缤削,就是在門(mén)口掛n把鑰匙窘哈。進(jìn)去的人就取一把鑰匙,出來(lái)時(shí)再把鑰匙掛回原處亭敢。后到的人發(fā)現(xiàn)鑰匙架空了滚婉,就知道必須在門(mén)口排隊(duì)等著了。這種做法叫做"信號(hào)量"(Semaphore)吨拗,用來(lái)保證多個(gè)線程不會(huì)互相沖突。
不難看出,mutex是semaphore的一種特殊情況(n=1時(shí))劝篷。也就是說(shuō)哨鸭,完全可以用后者替代前者。但是娇妓,因?yàn)閙utex較為簡(jiǎn)單像鸡,且效率高,所以在必須保證資源獨(dú)占的情況下哈恰,還是采用這種設(shè)計(jì)只估。</li>

<li> 操作系統(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)程之間和線程之間共享資源彬向。
</li>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兼贡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娃胆,更是在濱河造成了極大的恐慌遍希,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件里烦,死亡現(xiàn)場(chǎng)離奇詭異凿蒜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)招驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)篙程,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人别厘,你說(shuō)我怎么就攤上這事虱饿。” “怎么了触趴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵氮发,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冗懦,道長(zhǎng)爽冕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任披蕉,我火速辦了婚禮颈畸,結(jié)果婚禮上乌奇,老公的妹妹穿的比我還像新娘。我一直安慰自己眯娱,他們只是感情好礁苗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著徙缴,像睡著了一般试伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上于样,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天疏叨,我揣著相機(jī)與錄音,去河邊找鬼穿剖。 笑死蚤蔓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的携御。 我是一名探鬼主播昌粤,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啄刹!你這毒婦竟也來(lái)了涮坐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤誓军,失蹤者是張志新(化名)和其女友劉穎袱讹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昵时,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捷雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹甥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片救巷。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖句柠,靈堂內(nèi)的尸體忽然破棺而出浦译,到底是詐尸還是另有隱情,我是刑警寧澤溯职,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布精盅,位于F島的核電站,受9級(jí)特大地震影響谜酒,放射性物質(zhì)發(fā)生泄漏叹俏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一僻族、第九天 我趴在偏房一處隱蔽的房頂上張望粘驰。 院中可真熱鬧屡谐,春花似錦、人聲如沸蝌数。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)籽前。三九已至,卻和暖如春敷钾,著一層夾襖步出監(jiān)牢的瞬間枝哄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工阻荒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挠锥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓侨赡,卻偏偏與公主長(zhǎng)得像蓖租,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羊壹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 一蓖宦、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個(gè)執(zhí)行中的程序?qū)嵗總€(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間油猫,一個(gè)進(jìn)程中可以有多個(gè)線程稠茂。...
    阿敏其人閱讀 2,612評(píng)論 0 13
  • 一、概述: 進(jìn)程就是一個(gè)程序運(yùn)行的時(shí)候被CPU抽象出來(lái)的情妖,一個(gè)程序運(yùn)行后被抽象為一個(gè)進(jìn)程睬关,但是線程是從一個(gè)進(jìn)程里面...
    夏天的風(fēng)_song閱讀 581評(píng)論 0 5
  • 前言 拖了好久,不過(guò)還是得堅(jiān)持毡证。喜歡本文的話可以加下公眾號(hào)【于你供讀】电爹。 目錄 線程與進(jìn)程 線程與進(jìn)程是操作系統(tǒng)里...
    GitHubClub閱讀 831評(píng)論 0 4
  • 又來(lái)到了一個(gè)老生常談的問(wèn)題,應(yīng)用層軟件開(kāi)發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢料睛? 今天就這個(gè)問(wèn)題開(kāi)始丐箩,來(lái)談?wù)劜?..
    tangsl閱讀 4,124評(píng)論 0 23
  • 兒時(shí)有一個(gè)很好的玩伴叫霞,她自小家里貧窮秦效,母親是一個(gè)啞巴在她剛上小學(xué)一年級(jí)時(shí)就跑丟了雏蛮,父親是老實(shí)巴交的農(nóng)民。我們相...
    上善若水sunny閱讀 1,343評(píng)論 3 4