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