多任務(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)率其次屹徘,非搶占式的)走趋。