C++面向?qū)ο蠖嗑€程學(xué)習(xí)筆記_多任務(wù)與多線程編程

多任務(wù)(multitask)同時執(zhí)行多個進程,而多線程(multithread)允許單個進程同時執(zhí)行多個線程支子。

1. 多任務(wù)編程

當OS使用一個規(guī)劃策略允許兩個或更多進程并發(fā)共享一個CPU時,它稱做多任務(wù)編程(multitasking)或多程序編程(multiprogramming)。

多任務(wù)可以在3個級別上發(fā)生:

a. 對話級; b. 進程級淳地; c. 線程級。

對話級的多任務(wù)由用戶控制帅容。用戶運行若干應(yīng)用程序或?qū)υ挄r發(fā)生用戶控制多任務(wù)(user-controlled multitask)颇象。對話創(chuàng)建一個虛擬計算機以及它的鍵盤、鼠標和屏幕并徘,當執(zhí)行一個對話時遣钳,用戶可以決定切換到另一個對方中。因為由用戶決定哪一個應(yīng)用或?qū)υ捨挥谇芭_或后臺麦乞,以及終止哪一個應(yīng)用或?qū)υ捲誊睿苑Q之為用戶控制多任務(wù)。用戶也可以打開新應(yīng)用程序或?qū)υ挕?/p>

在對話間姐直,多個進程可以并發(fā)激活倦淀,通過相互合作來完成一個目標。當在一個對話中有多個進程激活時声畏,這稱做進程級多任務(wù)編程(process-level multitasking)撞叽。

進程由多個單獨的任務(wù)組成,每個任務(wù)都有自己的控制流程插龄,這些任務(wù)充當輕量級的進程即線程愿棋。進程內(nèi)的多線程并發(fā)執(zhí)行稱做多線程編程(multithreading)。

對話間的多任務(wù)是一個高級別的多任務(wù)均牢,它受用戶所控制糠雨。進程間的多任務(wù)以及多線程在低級別上實現(xiàn),并受到程序員的嚴重影響徘跪。程序員創(chuàng)建進程甘邀,并決定每個進程的線程數(shù),還決定任務(wù)的優(yōu)先權(quán)以及什么時候掛起垮庐,什么時候終止松邪。

多任務(wù)的目的是增加系統(tǒng)完成的工作量。多任務(wù)通過保持資源(CPU突硝,I/O等)的繁忙而且試圖防止它們在系統(tǒng)中處于非激活狀態(tài)來使用資源测摔。大部分任務(wù)不能不間斷執(zhí)行置济,因為它們需要等待I/O或另一個任務(wù)的終止解恰,此時就可讓給其它任務(wù)來使用資源锋八,以充分提高CPU的使用率。

2. 合作和搶占式多任務(wù)

多任務(wù)使用兩種規(guī)劃原則來實現(xiàn):合作(cooperation)與搶占(preemption)护盈。通過搶占挟纱,OS保持對處理器的控制。一旦任務(wù)提交給處理器后腐宋,它只執(zhí)行短暫的時間段紊服,然后分配另一個任務(wù)給處理器。而通過合作胸竞,任務(wù)分配給處理器后欺嗤,它就不能被搶占。為了讓另一個任務(wù)執(zhí)行卫枝,運行任務(wù)必須自愿從處理器中刪除自身煎饼。

2.1 合作多任務(wù)

合作多任務(wù)允許任務(wù)控制處理器,OS放棄對處理器的控制校赤,任務(wù)一旦擁有處理器就可以選擇運行任意長的時間而不會被系統(tǒng)操作搶占吆玖,除非它自己放棄了控制權(quán)。在這樣的OS下马篮,任何任務(wù)都可能發(fā)生饑餓沾乘。合作多任務(wù)使用優(yōu)先權(quán)規(guī)劃。如果阻塞或掛起一個高優(yōu)先權(quán)的任務(wù)浑测,則低優(yōu)先權(quán)任務(wù)被分配給處理器翅阵,它可以獨占處理器,不允許高優(yōu)先權(quán)任務(wù)有執(zhí)行時間尽爆。

擁有處理器的任務(wù)可以在等待一個I/O請求完成時一直占據(jù)處理器怎顾。系統(tǒng)依賴于任務(wù)間的合作來保持系統(tǒng)平穩(wěn)運行。任務(wù)必須與所有的普通系統(tǒng)函數(shù)合作漱贱,否則這些函數(shù)就會受到侵犯槐雾,因為任務(wù)正占據(jù)著處理器。

通過合作實現(xiàn)多任務(wù)的方式如下:

a. 設(shè)置它使用處理器的時間限制幅狮;

b. 在代碼中設(shè)置邏輯斷點募强,在此處放棄處理器;

c. 當發(fā)出I/O請求時放棄處理器崇摄;

d. 當系統(tǒng)操作需要立即執(zhí)行時放棄處理器擎值;

e. 放棄處理器允許交互任務(wù)使用處理器;

f. 放棄處理器允許系統(tǒng)對中斷作出反應(yīng)逐抑。

合作多任務(wù)的優(yōu)點如下:

a. 對時間重要任務(wù)和通信任務(wù)不會被搶占鸠儿;

b. 程序員控制了系統(tǒng)的操作;

c. 強迫程序員按防錯方式設(shè)計任務(wù),有目的性地允許合作进每;

d. 任務(wù)的執(zhí)行和反應(yīng)更具可預(yù)測性汹粤;

e. 一種公平的規(guī)劃方法:引入的高優(yōu)先權(quán)任務(wù)不能取代已經(jīng)運行的任務(wù);

f. 比搶占式規(guī)劃開銷低田晚,搶占式規(guī)劃因為頻繁的上下文切換嘱兼,所以需要在主存儲器中保持多個任務(wù)。

合作多任務(wù)的缺點:

a. 允許任務(wù)獨占處理器贤徒;

b. 多任務(wù)只在任務(wù)得到處理器時才發(fā)生芹壕。由程序員決定是否發(fā)生多任務(wù);

c. 可能得不到可接受的反應(yīng)時間接奈;

d. 程序員控制了系統(tǒng)的操作踢涌;

e. 程序員在設(shè)計任務(wù)時,必須考慮OS的操作序宦,而不是排它性地設(shè)計任務(wù)的功能性斯嚎;(無疑這樣對程序員的要求高了不少)

f. 沒有設(shè)計為合作的任務(wù)可以阻止正常合作任務(wù)的執(zhí)行;

g. 長時間運行任務(wù)將使短時間運行任務(wù)等待挨厚;

h. 設(shè)計不良的任務(wù)可能導(dǎo)致整個系統(tǒng)停頓堡僻。

2.2 搶占式多任務(wù)

搶占式多任務(wù)是多任務(wù)的一種形式,在這種形式中疫剃,OS不會等到任務(wù)自愿將處理器交還系統(tǒng)钉疫,讓它分配另一個任務(wù)給處理器。每個任務(wù)運行短暫的一段時間巢价,稱為時間片斷(slice)或時間片(quantum)牲阁,當時間片過期時,OS搶占執(zhí)行并分配另一個任務(wù)給處理器壤躲。任務(wù)在時間段過期前城菊,可以自愿放棄處理器;但如果仍然執(zhí)行碉克,則該任務(wù)會被刪除凌唬。

搶占式多任務(wù)的優(yōu)點:

a. 不允許任何任務(wù)獨占處理器;

b. 設(shè)計不良的任務(wù)不限止其它任務(wù)的執(zhí)行漏麦,而且不導(dǎo)致整個系統(tǒng)的停頓客税,因為它們將被搶占;

c. OS保持對系統(tǒng)的控制撕贞;

d. 設(shè)計任務(wù)時更耻,程序員不必考慮系統(tǒng)的操作,而可以排它性地設(shè)計任務(wù)的功能性捏膨;

e. 通過分配每個任務(wù)一段處理器時間來推進任務(wù)的執(zhí)行秧均;

f. 由于上下文的切換,所以有可接受的反應(yīng)時間;

g. 新引入的高優(yōu)先權(quán)可以搶占運行任務(wù)目胡;

h. 多任務(wù)由OS執(zhí)行疙描,而不是由程序員來執(zhí)行。

搶占式多任務(wù)的缺點:

a. 時間敏感任務(wù)和通信可能被搶占讶隐;

b. 比合作式多任務(wù)開銷大,因為頻繁的上下文切換久又,所以必須在主存儲器中保持多個任務(wù)巫延。

2.3 時間片的大小

如果時間片太長,一旦某個任務(wù)得到處理器地消,它就執(zhí)行到完成炉峰,而不是多任務(wù)地執(zhí)行,系統(tǒng)操作性能就會降級到連續(xù)性執(zhí)行脉执;而如果時間片過短疼阔,開銷變得更為重要。時間片的長度隨系統(tǒng)的不同而不同半夷,在不同的條件下也可能發(fā)生變化婆廊,還可能針對不同類型的任務(wù)而有所不同。

一些OS允許更改時間片的長度巫橄。時間片有一個最小值和一個最大值淘邻,以毫秒為單位。用戶按這種方式定義后湘换,它就成為一個靜態(tài)值宾舅。缺省時間片為動態(tài),根據(jù)系統(tǒng)裝載的不同彩倚,時間片的大小也會改變筹我。對于允許這種變化的系統(tǒng),在文件config.sys中定義時間片的大小帆离。

3. 多處理器下的多線程

非對稱和對稱系統(tǒng)都處于一種緊密耦合(tightly coupled)環(huán)境中蔬蕊。緊密耦合環(huán)境意味著,處理器處于一種使用單一操作系統(tǒng)控制所有處理器的單一系統(tǒng)中哥谷。這些處理器有一個用于通信的共享內(nèi)存區(qū)域袁串,只要在這里存在共享的內(nèi)容,就有可能存在對它的競爭呼巷。通過在處理器間分布任務(wù)裝載囱修、使用阻塞或每個處理器的緩沖內(nèi)存,可以將這種競爭降到最低限度王悍。

緊密耦合環(huán)境與松散耦合環(huán)境相反破镰。在松散耦合環(huán)境中,存在兩個或更多的獨立系統(tǒng),它們各自有自己的存儲器和操作系統(tǒng)鲜漩。這種系統(tǒng)通過消息傳遞或遠程過程建立通信鏈接源譬,相互間可以訪問對方的文件。在緊密耦合環(huán)境中孕似,處理器訪問相同的就緒隊列踩娘。在松散環(huán)境中,獨立系統(tǒng)保持有自己的單獨就緒隊列喉祭。單個進程的線程可以利用緊密耦合的多處理器养渴。

3.1 非對稱多處理器處理

在非對稱組織的多處理器處理系統(tǒng)中,一個處理器執(zhí)行一個設(shè)計好的任務(wù)泛烙。設(shè)計用一個處理器(譬如處理器0)一執(zhí)行輸入和輸出理卑,其它處理器(譬如處理器1到處理器n)執(zhí)行計算密集型的任務(wù)。只要需要執(zhí)行I/O蔽氨,就用處理器0來執(zhí)行藐唠,它只執(zhí)行操作系統(tǒng),而用戶任務(wù)不能在執(zhí)行OS所在的處理器上執(zhí)行鹉究。非對稱多處理器處理用于非對稱硬件上宇立,例如一個處理器和一個協(xié)理器(coprocessor)。

非對稱多處理器給其上的每個處理器進行了職能劃分自赔,限定了其分別所可執(zhí)行任務(wù)的種類泄伪,因此它允許處理器處理空閑(即使有任務(wù)在等待執(zhí)行),所以整體上減少了處理器的吞吐量匿级。

3.2 對稱多處理器處理

多處理器對稱組織具備一個相互等同的處理器池(pool of processor)蟋滴。處理器不是設(shè)計用于執(zhí)行特殊類型的任務(wù)。任何處理器都可以執(zhí)行系統(tǒng)或用戶線程痘绎,都可以控制某個I/O設(shè)備或引用內(nèi)存地址津函。操作系統(tǒng)線程可在任何處理器上執(zhí)行,而且從一個處理器漂移到另一個處理器上孤页,所以操作系統(tǒng)代碼需要重新進入尔苦。某些系統(tǒng)有一個設(shè)計作為執(zhí)行處理器的處理器,它負責(zé)系統(tǒng)數(shù)據(jù)和系統(tǒng)函數(shù)行施。對稱多處理器處理是一種更穩(wěn)固允坚、可靠的環(huán)境,如一個崩潰蛾号,它就不再屬于可用處理器之列了稠项。

3.3 具有多處理器的多線程處理模型

創(chuàng)建具有同時執(zhí)行多線程的進程強迫程序員按并行的方式來思考,程序員必須考慮在同一時刻所有執(zhí)行的形為鲜结,以及它們之間相互影響的方式展运,或者一些全局結(jié)構(gòu)活逆。同時執(zhí)行的任務(wù)可以相互獨立發(fā)揮作用,或者在某個點拗胜,可能需要其它任務(wù)的同步或合作蔗候。需求同步化時,該任務(wù)可能不能繼續(xù)執(zhí)行埂软,直到其中一個任務(wù)完成為止锈遥。需求合作可能意味著該任務(wù)從其它將完成工作的任務(wù)中獲取一些數(shù)據(jù)。完成與其它任務(wù)獨立發(fā)揮作用的同時(simultaneous)任務(wù)則不需要同步(synchronization)勘畔。事實上所灸,它們可以不按特定的順序來執(zhí)行。

容易將完全獨立的線程分配給它們自己的處理器來執(zhí)行咖杂。其它任務(wù)可能需要一定程度的同步和合作。需要用一個范例為并發(fā)任務(wù)建立模型蚊夫。模型將特征化如何將工作分解成線程诉字,以及線程如何同步化。模型應(yīng)當包含數(shù)據(jù)結(jié)構(gòu)中的任何共享數(shù)據(jù)知纷,使用某種類型的阻塞機制可以保護這些數(shù)據(jù)結(jié)構(gòu)壤圃,使訪問同步化而避免數(shù)據(jù)競爭。

在多處理器處理環(huán)境中琅轧,一個用于多線程進程的模型例子是主-次線程模型(primary-secondary thread model)伍绳。在這個模型中,一個線程(指主線程)將任務(wù)分解乍桂,并分布到次線程中冲杀。這些次線程在同一時間調(diào)用。主線程一直等到所有的次線程都完成了它們的任務(wù)睹酌,然后才繼續(xù)权谁。主線程與次線程同步執(zhí)行。主線程根據(jù)事先知道的工作調(diào)用線程憋沿,將工作大體平分為相等的部分旺芽。

管道線模型:工作分為幾個執(zhí)行階段。這些階段創(chuàng)建一個管道線或裝配線辐啄,在每個階段執(zhí)行指定的任務(wù)部分采章。管道線中的每個階段執(zhí)行不同或相同任務(wù)。這些階段并行執(zhí)行壶辜。在管道線中為每個階段分配一個線程悯舟。

工作堆:分配任務(wù)以隊列形式存在于工作堆中的多個塊。工作線程從堆中請求任務(wù)來執(zhí)行砸民⊥脊龋可以給工作堆添加工作線程翩活。請求可以得到保證,直到工作堆為空便贵。工作堆不同于主-次線程模型菠镇,主-次模型需要預(yù)先知道將要完成的工作量,然后創(chuàng)建相應(yīng)數(shù)量的次線程承璃。而在工作堆模型中利耍,預(yù)告不知道工作量,工作線程可能導(dǎo)致執(zhí)行額外的任務(wù)盔粹。

4. 規(guī)劃策略

規(guī)劃策略決定什么時候分配處理器隘梨,以及分配哪一個線程給處理器。OS可能使用優(yōu)先權(quán)規(guī)劃舷嗡,其中最高優(yōu)先權(quán)線程被分配給處理器轴猎。當存在多個同一優(yōu)先類(或)優(yōu)先級的線程時,使用另一個規(guī)劃方案进萄。

規(guī)劃的發(fā)生級別有:

a. 線程規(guī)劃捻脖;

b. 進程規(guī)劃;

c. 中間級規(guī)劃中鼠。

像進程可婶、線程這樣的低級別規(guī)劃由分派器來執(zhí)行(分派器常駐在主存儲器中)。中間級別規(guī)劃決定允許哪一個進程競爭處理器援雇。競爭處理器的進程保存在就緒隊列中矛渴。在這一級別,進程可以掛起惫搏,由于系統(tǒng)負載的變化也可能恢復(fù)具温。這個級別的規(guī)劃是進入系統(tǒng)的進程與競爭處理器進程之間的一個緩沖器。

規(guī)劃策略的目的是決定哪一個進程或線程使用處理器以及應(yīng)當何時使用處理器筐赔。它應(yīng)當偏向于占有重要資源的任務(wù)桂躏。低優(yōu)先權(quán)任務(wù)可能鎖定資源,而這些資源將被其它具有較高優(yōu)先權(quán)任務(wù)所使用或被系統(tǒng)中的許多激活任務(wù)所使用川陆,因此可能會導(dǎo)致死鎖剂习。這種規(guī)劃機制應(yīng)當偏向于鎖定這類資源的進程或線程,使得它可以釋放資源较沪。

規(guī)劃策略目標:

a. 最大化吞吐量鳞绕;

b. 強制優(yōu)先權(quán);

c. 根據(jù)實際尸曼,盡量公平们何;

d. 最小化開銷;

e. 避免無限延遲和饑餓控轿;

f. 偏向于占據(jù)了其它任務(wù)所需資源的任務(wù)冤竹;

g. 在需要時拂封,有充足的可用資源,讓反應(yīng)時間可接受鹦蠕;

h. 不應(yīng)當在重系統(tǒng)負荷下崩潰冒签。

常用的規(guī)劃策略如以下:

FIFO(非搶占式);SJF(最短任務(wù)優(yōu)先钟病,同樣非搶占式)萧恕;RR(輪詢,搶占式的)肠阱;STR(最短剩余時間票唆,也是搶占式的),HRN(最高反應(yīng)率其次屹徘,非搶占式的)走趋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市噪伊,隨后出現(xiàn)的幾起案子簿煌,更是在濱河造成了極大的恐慌,老刑警劉巖酥宴,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啦吧,死亡現(xiàn)場離奇詭異您觉,居然都是意外死亡拙寡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門琳水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肆糕,“玉大人,你說我怎么就攤上這事在孝〕峡校” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵私沮,是天一觀的道長始赎。 經(jīng)常有香客問我,道長仔燕,這世上最難降的妖魔是什么造垛? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮晰搀,結(jié)果婚禮上五辽,老公的妹妹穿的比我還像新娘。我一直安慰自己外恕,他們只是感情好杆逗,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布乡翅。 她就那樣靜靜地躺著,像睡著了一般罪郊。 火紅的嫁衣襯著肌膚如雪蠕蚜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天排龄,我揣著相機與錄音波势,去河邊找鬼。 笑死橄维,一個胖子當著我的面吹牛尺铣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播争舞,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼凛忿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竞川?” 一聲冷哼從身側(cè)響起店溢,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎委乌,沒想到半個月后床牧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡遭贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年戈咳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壕吹。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡著蛙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耳贬,到底是詐尸還是另有隱情踏堡,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布咒劲,位于F島的核電站顷蟆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腐魂。R本人自食惡果不足惜帐偎,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挤渔。 院中可真熱鬧肮街,春花似錦、人聲如沸判导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绕辖,卻和暖如春摇肌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仪际。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工围小, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人树碱。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓肯适,卻偏偏與公主長得像,于是被迫代替她去往敵國和親成榜。 傳聞我的和親對象是個殘疾皇子框舔,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 線程是一種輕量級進程。與進程相比赎婚,線程給操作系統(tǒng)帶來的創(chuàng)建刘绣、維護和管理負擔(dān)要輕,因為與線程相關(guān)的信息非常少挣输。它同時...
    manofmountain閱讀 850評論 0 2
  • 又來到了一個老生常談的問題纬凤,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個問題開始撩嚼,來談?wù)劜?..
    tangsl閱讀 4,088評論 0 23
  • 理解多線程編程停士,掌握什么是線程和進程以及它們之間的關(guān)系很重要。 1. 何為進程绢馍? 進程就是執(zhí)行中的一段程序向瓷。一旦程...
    manofmountain閱讀 387評論 0 1
  • 從世俗里抽身而出 卸下包裹的殼 輕心出發(fā) 每一刻都是嶄新的 要么是新的景 要么是曾經(jīng)的景里有新的心情 自然會喚醒真...
    Lily孫閱讀 310評論 0 1
  • 你是我今生的唯一不確定 你使我的生命得以完整 當你意識到想要與一個人共度余生的時候肠套,你會希望余生盡快開始
    曉風(fēng)冰雨閱讀 320評論 0 0