C++面向?qū)ο蠖嗑€程學習筆記_多任務(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ù)可能導致整個系統(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í)行,而且不導致整個系統(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í)行處理器的處理器,它負責系統(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ù)告不知道工作量,工作線程可能導致執(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)負載的變化也可能恢復。這個級別的規(guī)劃是進入系統(tǒng)的進程與競爭處理器進程之間的一個緩沖器。

規(guī)劃策略的目的是決定哪一個進程或線程使用處理器以及應(yīng)當何時使用處理器。它應(yīng)當偏向于占有重要資源的任務(wù)。低優(yōu)先權(quán)任務(wù)可能鎖定資源,而這些資源將被其它具有較高優(yōu)先權(quán)任務(wù)所使用或被系統(tǒng)中的許多激活任務(wù)所使用,因此可能會導致死鎖。這種規(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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

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

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