課件-2014第二章進程管理_第1頁
課件-2014第二章進程管理_第2頁
課件-2014第二章進程管理_第3頁
課件-2014第二章進程管理_第4頁
課件-2014第二章進程管理_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

計算機操作系統(tǒng)楊為民

湯小丹等編著22.5進程通信2.5.1進程通信的類型2.5.2消息傳遞通信的實現方法2.5.3消息傳遞系統(tǒng)實現中的若干問題2.5.4消息緩沖隊列通信機制32.5進程通信通信(communication)意味著在進程間傳送數據。操作系統(tǒng)可以被看作是各種進程組成的。這些進程都具有各自的獨立功能,且大多數被外部需要而啟動執(zhí)行。一般來說,進程間的通信根據通信內容可以劃分為二種:控制信息的傳送與大批量數據傳送。有時,也把進程間控制信息的交換稱為低級通信,低級通信一般只傳送一個或幾個字節(jié)的信息,以達到控制進程執(zhí)行速度的作用。把進程間大批量數據的交換稱為高級通信。高級通信要傳送大量數據。高級通信的目的不是為了控制進程的執(zhí)行速度,而是為了交換信息。42.5.1進程通信的類型共享存儲器系統(tǒng)(Shared-MemorySystem)消息傳遞系統(tǒng)(Messagepassingsystem)管道(Pipe)通信52.5.1進程通信的類型1.共享存儲器系統(tǒng)(Shared-MemorySystem)(1)基于共享數據結構的通信方式:諸進程公用數據結構以實現進程間的信息交換;

(2)基于共享存儲區(qū)的通信方式:諸進程通過對共享存儲區(qū)中數據的讀或寫實現通信。62.5.1進程通信的類型2.消息傳遞系統(tǒng)(Messagepassingsystem)不論是單機系統(tǒng)、多機系統(tǒng),還是計算機網絡,消息傳遞機制都是用得最廣泛的一種進程間通信的機制。在消息傳遞系統(tǒng)中,進程間的數據交換,是以格式化的消息(message)為單位的;在計算機網絡中,又把message稱為報文。程序員直接利用系統(tǒng)提供的一組通信命令(原語)進行通信。操作系統(tǒng)隱藏了通信的實現細節(jié),大大減化了通信程序編制的復雜性,而獲得廣泛的應用。消息傳遞系統(tǒng)的通信方式屬于高級通信方式。又因其實現方式的不同而進一步分成直接通信方式和間接通信方式兩種。

72.5.1進程通信的類型3.管道(Pipe)通信所謂“管道”,是指用于連接一個讀進程和一個寫進程以實現他們之間通信的一個共享文件,又名pipe文件。向管道(共享文件)提供輸入的發(fā)送進程(即寫進程),以字符流形式將大量的數據送入管道;而接受管道輸出的接收進程(即讀進程),則從管道中接收(讀)數據。由于發(fā)送進程和接收進程是利用管道進行通信的,故又稱為管道通信。這種方式首創(chuàng)于UNIX系統(tǒng),由于它能有效地傳送大量數據,因而又被引入到許多其它操作系統(tǒng)中。82.5.1進程通信的類型為了協(xié)調雙方的通信,管道機制必須提供以下三方面的協(xié)調能力:①互斥,即當一個進程正在對pipe執(zhí)行讀/寫操作時,其它(另一)進程必須等待。②同步,指當寫(輸入)進程把一定數量(如4KB)的數據寫入pipe,便去睡眠等待,直到讀(輸出)進程取走數據后,再把他喚醒。當讀進程讀一空pipe時,也應睡眠等待,直至寫進程將數據寫入管道后,才將之喚醒。③確定對方是否存在,只有確定了對方已存在時,才能進行通信。92.5.2消息傳遞通信的實現方法

1.直接通信方式這是指發(fā)送進程利用OS所提供的發(fā)送命令,直接把消息發(fā)送給目標進程。此時,要求發(fā)送進程和接收進程都以顯式方式提供對方的標識符。通常,系統(tǒng)提供下述兩條通信命令(原語):Send(Receiver,message);發(fā)送一個消息給接收進程;Receive(Sender,message);接收Sender發(fā)來的消息;例如,原語Send(P2,m1)表示將消息m1發(fā)送給接收進程P2;而原語Receive(P1,m1)則表示接收由P1發(fā)來的消息m1。102.5.2消息傳遞通信的實現方法在某些情況下,接收進程可與多個發(fā)送進程通信,因此,它不可能事先指定發(fā)送進程。例如,用于提供打印服務的進程,它可以接收來自任何一個進程的“打印請求”消息。對于這樣的應用,在接收進程接收消息的原語中的源進程參數,是完成通信后的返回值,接收原語可表示為:Receive(id,message);112.5.2消息傳遞通信的實現方法我們還可以利用直接通信原語,來解決生產者-消費者問題。當生產者生產出一個產品(消息)后,便用Send原語將消息發(fā)送給消費者進程;而消費者進程則利用Receive原語來得到一個消息。如果消息尚未生產出來,消費者必須等待,直至生產者進程將消息發(fā)送過來。生產者-消費者的通信過程可分別描述如下:

repeat

…produceaniteminnextp;

…send(consumer,nextp);untilfalse;repeatreceive(producer,nextc);

…consumetheiteminnextc;untilfalse;122.5.2消息傳遞通信的實現方法2.間接通信方式(1)信箱的創(chuàng)建和撤消。進程可利用信箱創(chuàng)建原語來建立一個新信箱。創(chuàng)建者進程應給出信箱名字、信箱屬性(公用、私用或共享);對于共享信箱,還應給出共享者的名字。當進程不再需要讀信箱時,可用信箱撤消原語將之撤消。(2)消息的發(fā)送和接收。當進程之間要利用信箱進行通信時,必須使用共享信箱,并利用系統(tǒng)提供的下述通信原語進行通信。Send(mailbox,message);將一個消息發(fā)送到指定信箱Receive(mailbox,message);從指定信箱中接收一個消息132.5.2消息傳遞通信的實現方法信箱可由操作系統(tǒng)創(chuàng)建,也可由用戶進程創(chuàng)建,創(chuàng)建者是信箱的擁有者。據此,可把信箱分為以下三類。1)私用信箱用戶進程可為自己建立一個新信箱,并作為該進程的一部分。信箱的擁有者有權從信箱中讀取消息,其他用戶則只能將自己構成的消息發(fā)送到該信箱中。這種私用信箱可采用單向通信鏈路的信箱來實現。當擁有該信箱的進程結束時,信箱也隨之消失。142.5.2消息傳遞通信的實現方法2)公用信箱它由操作系統(tǒng)創(chuàng)建,并提供給系統(tǒng)中的所有核準進程使用。核準進程既可把消息發(fā)送到該信箱中,也可從信箱中讀取發(fā)送給自己的消息。顯然,公用信箱應采用雙向通信鏈路的信箱來實現。通常,公用信箱在系統(tǒng)運行期間始終存在。3)共享信箱它由某進程創(chuàng)建,在創(chuàng)建時或創(chuàng)建后,指明它是可共享的,同時須指出共享進程(用戶)的名字。信箱的擁有者和共享者,都有權從信箱中取走發(fā)送給自己的消息。152.5.2消息傳遞通信的實現方法在利用信箱通信時,在發(fā)送進程和接收進程之間,存在以下四種關系:(1)一對一關系。這時可為發(fā)送進程和接收進程建立一條兩者專用的通信鏈路,使兩者之間的交互不受其他進程的干擾。(2)多對一關系。允許提供服務的進程與多個用戶進程之間進行交互,也稱為客戶/服務器交互(client/serverinteraction)。(3)一對多關系。允許一個發(fā)送進程與多個接收進程進行交互,使發(fā)送進程可用廣播方式,向接收者(多個)發(fā)送消息。(4)多對多關系。允許建立一個公用信箱,讓多個進程都能向信箱中投遞消息;也可從信箱中取走屬于自己的消息。162.5.3消息傳遞系統(tǒng)實現中的若干問題1.通信鏈路(communicationlink)為使在發(fā)送進程和接收進程之間能進行通信,必須在兩者之間建立一條通信鏈路。有兩種方式建立通信鏈路。由發(fā)送進程在通信之前,用顯式的“建立連接”命令(原語)請求系統(tǒng)為之建立一條通信鏈路;在鏈路使用完后,也用顯式方式拆除鏈路。這種方式主要用于計算機網絡中。發(fā)送進程無須明確提出建立鏈路的請求,只須利用系統(tǒng)提供的發(fā)送命令(原語),系統(tǒng)會自動地為之建立一條鏈路。這種方式主要用于單機系統(tǒng)中。172.5.3消息傳遞系統(tǒng)實現中的若干問題根據通信鏈路的連接方法,又可把通信鏈路分為兩類:①點—點連接通信鏈路,這時的一條鏈路只連接兩個結點(進程);②多點連接鏈路,指用一條鏈路連接多個(n>2)結點(進程)。而根據通信方式的不同,則又可把鏈路分成兩種:單向通信鏈路,只允許發(fā)送進程向接收進程發(fā)送消息;雙向鏈路,既允許由進程A向進程B發(fā)送消息,也允許進程B同時向進程A發(fā)送消息。182.5.3消息傳遞系統(tǒng)實現中的若干問題2.消息的格式在某些OS中,消息是采用比較短的定長消息格式,這減少了對消息的處理和存儲開銷。這種方式可用于辦公自動化系統(tǒng)中,為用戶提供快速的便箋式通信;但這對要發(fā)送較長消息的用戶是不方便的。在有的OS中,采用另一種變長的消息格式,即進程所發(fā)送消息的長度是可變的。系統(tǒng)在處理和存儲變長消息時,須付出更多的開銷,但方便了用戶。這兩種消息格式各有其優(yōu)缺點,故在很多系統(tǒng)(包括計算機網絡)中,是同時都用的。192.5.3消息傳遞系統(tǒng)實現中的若干問題3.進程同步方式(1)發(fā)送進程阻塞、接收進程阻塞。(2)發(fā)送進程不阻塞、接收進程阻塞。(3)發(fā)送進程和接收進程均不阻塞。202.5.3消息傳遞系統(tǒng)實現中的若干問題1.通信鏈路(communicationlink)為使在發(fā)送進程和接收進程之間能進行通信,必須在兩者之間建立一條通信鏈路。有兩種方式建立通信鏈路。由發(fā)送進程在通信之前,用顯式的“建立連接”命令(原語)請求系統(tǒng)為之建立一條通信鏈路;在鏈路使用完后,也用顯式方式拆除鏈路。這種方式主要用于計算機網絡中。發(fā)送進程無須明確提出建立鏈路的請求,只須利用系統(tǒng)提供的發(fā)送命令(原語),系統(tǒng)會自動地為之建立一條鏈路。這種方式主要用于單機系統(tǒng)中。212.5.3消息傳遞系統(tǒng)實現中的若干問題根據通信鏈路的連接方法,又可把通信鏈路分為兩類:①點—點連接通信鏈路,這時的一條鏈路只連接兩個結點(進程);②多點連接鏈路,指用一條鏈路連接多個(n>2)結點(進程)。而根據通信方式的不同,則又可把鏈路分成兩種:單向通信鏈路,只允許發(fā)送進程向接收進程發(fā)送消息;雙向鏈路,既允許由進程A向進程B發(fā)送消息,也允許進程B同時向進程A發(fā)送消息。222.5.3消息傳遞系統(tǒng)實現中的若干問題2.消息的格式在某些OS中,消息是采用比較短的定長消息格式,這減少了對消息的處理和存儲開銷。這種方式可用于辦公自動化系統(tǒng)中,為用戶提供快速的便箋式通信;但這對要發(fā)送較長消息的用戶是不方便的。在有的OS中,采用另一種變長的消息格式,即進程所發(fā)送消息的長度是可變的。系統(tǒng)在處理和存儲變長消息時,須付出更多的開銷,但方便了用戶。這兩種消息格式各有其優(yōu)缺點,故在很多系統(tǒng)(包括計算機網絡)中,是同時都用的。232.5.3消息傳遞系統(tǒng)實現中的若干問題3.進程同步方式(1)發(fā)送進程阻塞、接收進程阻塞。(2)發(fā)送進程不阻塞、接收進程阻塞。(3)發(fā)送進程和接收進程均不阻塞。242.5.4消息緩沖隊列通信機制

1.消息緩沖隊列通信機制中的數據結構(1)消息緩沖區(qū)。在消息緩沖隊列通信方式中,主要利用的數據結構是消息緩沖區(qū)。它可描述如下:typemessagebuffer=recordsender;發(fā)送者進程標識符size;消息長度text;消息正文next;指向下一個消息緩沖區(qū)的指針end252.5.4消息緩沖隊列通信機制

(2)PCB中有關通信的數據項。在利用消息緩沖隊列通信機制時,在設置消息緩沖隊列的同時,還應增加用于對消息隊列進行操作和實現同步的信號量,并將它們置入進程的PCB中。在PCB中應增加的數據項可描述如下:typeprocesscontrolblock=record

…mq;消息隊列隊首指針

mutex;消息隊列互斥信號量

sm;消息隊列資源信號量

…end262.5.4消息緩沖隊列通信機制

2.發(fā)送原語發(fā)送進程在利用發(fā)送原語發(fā)送消息之前,應先在自己的內存空間,設置一發(fā)送區(qū)a,把待發(fā)送的消息正文、發(fā)送進程標識符、消息長度等信息填入其中,然后調用發(fā)送原語,把消息發(fā)送給目標(接收)進程。發(fā)送原語首先根據發(fā)送區(qū)a中所設置的消息長度a.size來申請一緩沖區(qū)i,接著,把發(fā)送區(qū)a中的信息復制到緩沖區(qū)i中。為了能將i掛在接收進程的消息隊列mq上,應先獲得接收進程的內部標識符j,然后將i掛在j.mq上。由于該隊列屬于臨界資源,故在執(zhí)行insert操作的前后,都要執(zhí)行wait和signal操作。27圖2-12消息緩沖通信2.5.4消息緩沖隊列通信機制28

proceduresend(receiver,a)begingetbuf(a.size,i);根據a.size申請緩沖區(qū);

i.sender∶=a.sender;將發(fā)送區(qū)a中的信息復制到消息緩沖區(qū)之中;

i.size∶=a.size;i.text∶=a.text;i.next∶=0;getid(PCBset,receiver.j);獲得接收進程內部標識符;

wait(j.mutex);insert(j.mq,i);將消息緩沖區(qū)插入消息隊列;

signal(j.mutex);signal(j.sm);end2.5.4消息緩沖隊列通信機制292.5.4消息緩沖隊列通信機制3.接收原語接收原語描述如下:procedurereceive(b)beginj∶=internalname;j為接收進程內部的標識符;

wait(j.sm);wait(j.mutex);remove(j.mq,i);將消息隊列中第一個消息移出;

signal(j.mutex);b.sender∶=i.sender;將消息緩沖區(qū)i中的信息復制到接收區(qū)b;b.size∶=i.size;b.text∶=i.text;end302.6線程2.6.1線程的基本概念2.6.2線程間的同步和通信2.6.3線程的實現方式2.6.4線程的實現312.6.1線程的基本概念1、線程的引入在操作系統(tǒng)中引入進程的目的,是為了使多個程序能并發(fā)執(zhí)行,以提高資源利用率和系統(tǒng)吞吐量,在操作系統(tǒng)中再引入線程,則是為了減少程序在并發(fā)執(zhí)行時所付出的時空開銷,使OS具有更好的并發(fā)性。為了說明這一點,我們首先來回顧進程的兩個基本屬性:①進程是一個可擁有資源的獨立單位;②進程同時又是一個可獨立調度和分派的基本單位。正是由于進程有這兩個基本屬性,才使之成為一個能獨立運行的基本單位,從而也就構成了進程并發(fā)執(zhí)行的基礎。然而,為使程序能并發(fā)執(zhí)行,系統(tǒng)還必須進行以下的一系列操作。322.6.1線程的基本概念為使程序能并發(fā)執(zhí)行,系統(tǒng)還必須進行以下的一系列操作。創(chuàng)建進程系統(tǒng)在創(chuàng)建一個進程時,必須為它分配其所必需的、除處理機以外的所有資源,如內存空間、I/O設備,以及建立相應的PCB。2)撤消進程系統(tǒng)在撤消進程時,又必須先對其所占有的資源執(zhí)行回收操作,然后再撤消PCB。3)進程切換對進程進行切換時,由于要保留當前進程的CPU環(huán)境和設置新選中進程的CPU環(huán)境,因而須花費不少的處理機時間。換言之,由于進程是一個資源的擁有者,因而在創(chuàng)建、撤消和切換中,系統(tǒng)必須為之付出較大的時空開銷。正因如此,在系統(tǒng)中所設置的進程,其數目不宜過多,進程切換的頻率也不宜過高,這也就限制了并發(fā)程度的進一步提高。332.6.1線程的基本概念2、線程的屬性輕型實體。線程中的實體基本上不擁有系統(tǒng)資源,只是有一點必不可少的、能保證其獨立運行的資源,比如,在每個線程中都應具有一個用于控制線程運行的線程控制塊TCB,用于指示被執(zhí)行指令序列的程序計數器,保留局部變量、少數狀態(tài)參數和返回地址等的一組寄存器和堆棧。(2)獨立調度和分派的基本單位。在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由于線程很“輕”,故線程的切換非常迅速且開銷小。(3)可并發(fā)執(zhí)行。在一個進程中的多個線程之間可以并發(fā)執(zhí)行,甚至允許在一個進程中的所有線程都能并發(fā)執(zhí)行;同樣,不同進程中的線程也能并發(fā)執(zhí)行。(4)共享進程資源。在同一進程中的各個線程都可以共享該進程所擁有的資源,這首先表現在所有線程都具有相同的地址空間(進程的地址空間)。這意味著線程可以訪問該地址空間中的每一個虛地址;此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。34線程與進程的比較3、線程與進程的比較1.調度:在傳統(tǒng)的操作系統(tǒng)中,擁有資源的基本單位和獨立調度、分派的基本單位都是進程。2.并發(fā)性:在引入線程的操作系統(tǒng)中,不僅進程之間可以并發(fā)執(zhí)行,而且在一個進程中的多個線程之間亦可并發(fā)執(zhí)行,因而使操作系統(tǒng)具有更好的并發(fā)性,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)吞吐量。3.擁有資源:不論是傳統(tǒng)的操作系統(tǒng),還是設有線程的操作系統(tǒng),進程都是擁有資源的一個獨立單位,它可以擁有自己的資源。4.系統(tǒng)開銷:由于在創(chuàng)建或撤消進程時,系統(tǒng)都要為之分配或回收資源,如內存空間、I/O設備等。因此,操作系統(tǒng)所付出的開銷將明顯地大于在創(chuàng)建或撤消線程時的開銷。352.6.1線程的基本概念

4、線程的狀態(tài)(1)狀態(tài)參數。在OS中的每一個線程都可以利用線程標識符和一組狀態(tài)參數進行描述。狀態(tài)參數通常有這樣幾項:①寄存器狀態(tài),它包括程序計數器PC和堆棧指針中的內容;②堆棧,在堆棧中通常保存有局部變量和返回地址;③線程運行狀態(tài),用于描述線程正處于何種運行狀態(tài);④優(yōu)先級,描述線程執(zhí)行的優(yōu)先程度;⑤線程專有存儲器,用于保存線程自己的局部變量拷貝;⑥信號屏蔽,即對某些信號加以屏蔽。362.6.1線程的基本概念

(2)線程運行狀態(tài)。如同傳統(tǒng)的進程一樣,在各線程之間也存在著共享資源和相互合作的制約關系,致使線程在運行時也具有間斷性。相應地,線程在運行時,也具有下述三種基本狀態(tài):①執(zhí)行狀態(tài),表示線程正獲得處理機而運行;②就緒狀態(tài),指線程已具備了各種執(zhí)行條件,一旦獲得CPU便可執(zhí)行的狀態(tài);③阻塞狀態(tài),指線程在執(zhí)行中因某事件而受阻,處于暫停執(zhí)行時的狀態(tài)。372.6.1線程的基本概念

5、線程的創(chuàng)建和終止在多線程OS環(huán)境下,應用程序在啟動時,通常僅有一個線程在執(zhí)行,該線程被人們稱為“初始化線程”。它可根據需要再去創(chuàng)建若干個線程。在創(chuàng)建新線程時,需要利用一個線程創(chuàng)建函數(或系統(tǒng)調用),并提供相應的參數,如指向線程主程序的入口指針、堆棧的大小,以及用于調度的優(yōu)先級等。在線程創(chuàng)建函數執(zhí)行完后,將返回一個線程標識符供以后使用。終止線程的方式有兩種:一種是在線程完成了自己的工作后自愿退出;另一種是線程在運行中出現錯誤或由于某種原因而被其它線程強行終止。382.6.1線程的基本概念6、多線程OS中的進程在多線程OS中,進程是作為擁有系統(tǒng)資源的基本單位,通常的進程都包含多個線程并為它們提供資源,但此時的進程就不再作為一個執(zhí)行的實體。多線程OS中的進程有以下屬性:(1)作為系統(tǒng)資源分配的單位。(2)可包括多個線程。(3)進程不是一個可執(zhí)行的實體。392.6.1線程的基本概念(1)作為系統(tǒng)資源分配的單位。在多線程OS中,仍是將進程作為系統(tǒng)資源分配的基本單位,在任一進程中所擁有的資源包括受到分別保護的用戶地址空間、用于實現進程間和線程間同步和通信的機制、已打開的文件和已申請到的I/O設備,以及一張由核心進程維護的地址映射表,該表用于實現用戶程序的邏輯地址到其內存物理地址的映射。402.6.1線程的基本概念(2)可包括多個線程。通常,一個進程都含有多個相對獨立的線程,其數目可多可少,但至少也要有一個線程,由進程為這些(個)線程提供資源及運行環(huán)境,使這些線程可并發(fā)執(zhí)行。在OS中的所有線程都只能屬于某一個特定進程。(3)進程不是一個可執(zhí)行的實體。在多線程OS中,是把線程作為獨立運行的基本單位,所以此時的進程已不再是一個可執(zhí)行的實體。雖然如此,進程仍具有與執(zhí)行相關的狀態(tài)。例如,所謂進程處于“執(zhí)行”狀態(tài),實際上是指該進程中的某線程正在執(zhí)行。此外,對進程所施加的與進程狀態(tài)有關的操作,也對其線程起作用。例如,在把某個進程掛起時,該進程中的所有線程也都將被掛起;又如,在把某進程激活時,屬于該進程的所有線程也都將被激活。412.6.2線程間的同步和通信

1.互斥鎖(mutex)互斥鎖是一種比較簡單的、用于實現線程間對資源互斥訪問的機制。由于操作互斥鎖的時間和空間開鎖都較低,因而較適合于高頻度使用的關鍵共享數據和程序段?;コ怄i可以有兩種狀態(tài),即開鎖(unlock)和關鎖(lock)狀態(tài)。相應地,可用兩條命令(函數)對互斥鎖進行操作。其中的關鎖lock操作用于將mutex關上,開鎖操作unlock則用于打開mutex。422.6.2線程間的同步和通信2.條件變量每一個條件變量通常都與一個互斥鎖一起使用,亦即,在創(chuàng)建一個互斥鎖時便聯系著一個條件變量。單純的互斥鎖用于短期鎖定,主要是用來保證對臨界區(qū)的互斥進入。而條件變量則用于線程的長期等待,直至所等待的資源成為可用的。線程首先對mutex執(zhí)行關鎖操作,若成功便進入臨界區(qū),然后查找用于描述資源狀態(tài)的數據結構,以了解資源的情況。只要發(fā)現所需資源R正處于忙碌狀態(tài),線程便轉為等待狀態(tài),并對mutex執(zhí)行開鎖操作后,等待該資源被釋放;若資源處于空閑狀態(tài),表明線程可以使用該資源,于是將該資源設置為忙碌狀態(tài),再對mutex執(zhí)行開鎖操作。43

LockmutexLockmutexcheckdatastructures; markresourceasfree;while(resourcebusy); unlockmutex;wait(conditionvariable); wakeup(conditionvariable);markresourceasbusy;unlockmutex;2.6.2線程間的同步和通信下面給出了對上述資源的申請(左半部分)和釋放(右半部分)操作的描述。442.6.2線程間的同步和通信3.信號量機制(1)私用信號量(privatesamephore)。當某線程需利用信號量來實現同一進程中各線程之間的同步時,可調用創(chuàng)建信號量的命令來創(chuàng)建一私用信號量,其數據結構是存放在應用程序的地址空間中。私用信號量屬于特定的進程所有,OS并不知道私用信號量的存在,因此,一旦發(fā)生私用信號量的占用者異常結束或正常結束,但并未釋放該信號量所占有空間的情況時,系統(tǒng)將無法使它恢復為0(空),也不能將它傳送給下一個請求它的線程。452.6.2線程間的同步和通信(2)公用信號量(publicsemaphort)。公用信號量是為實現不同進程間或不同進程中各線程之間的同步而設置的。由于它有著一個公開的名字供所有的進程使用,故而把它稱為公用信號量。其數據結構是存放在受保護的系統(tǒng)存儲區(qū)中,由OS為它分配空間并進行管理,故也稱為系統(tǒng)信號量。如果信號量的占有者在結束時未釋放該公用信號量,則OS會自動將該信號量空間回收,并通知下一進程。可見,公用信號量是一種比較安全的同步機制。462.6.3線程的實現方式1.內核支持線程這里所謂的內核支持線程,也都同樣是在內核的支持下運行的,即無論是用戶進程中的線程,還是系統(tǒng)進程中的線程,他們的創(chuàng)建、撤消和切換等,也是依靠內核實現的。此外,在內核空間還為每一個內核支持線程設置了一個線程控制塊,內核是根據該控制塊而感知某線程的存在的,并對其加以控制。472.6.3線程的實現方式2.用戶級線程用戶級線程僅存在于用戶空間中。對于這種線程的創(chuàng)建、撤消、線程之間的同步與通信等功能,都無須利用系統(tǒng)調用來實現。對于用戶級線程的切換,通常是發(fā)生在一個應用進程的諸多線程之間,這時,也同樣無須內核的支持。由于切換的規(guī)則遠比進程調度和切換的規(guī)則簡單,因而使線程的切換速度特別快??梢姡@種線程是與內核無關的。482.6.4線程的實現1.內核支持線程的實現在僅設置了內核支持線程的OS中,一種可能的線程控制方法是,系統(tǒng)在創(chuàng)建一個新進程時,便為它分配一個任務數據區(qū)PTDA(PerTaskDataArea),其中包括若干個線程控制塊TCB空間,如圖2-13所示。在每一個TCB中可保存線程標識符、優(yōu)先級、線程運行的CPU狀態(tài)等信息。雖然這些信息與用戶級線程TCB中的信息相同,但現在卻是被保存在內核空間中。491.內核支持線程的實現圖2-13任務數據區(qū)空間PTDA進程資源TCB#1TCB#2TCB#32.6.4線程的實現502.6.4線程的實現每當進程要創(chuàng)建一個線程時,便為新線程分配一個TCB,將有關信息填入該TCB中,并為之分配必要的資源,如為線程分配數百至數千個字節(jié)的棧空間和局部存儲區(qū),于是新創(chuàng)建的線程便有條件立即執(zhí)行。當PTDA中的所有TCB空間已用完,而進程又要創(chuàng)建新的線程時,只要其所創(chuàng)建的線程數目未超過系統(tǒng)的允許值(通常為數十至數百個),系統(tǒng)可再為之分配新的TCB空間;在撤消一個線程時,也應回收該線程的所有資源和TCB??梢?,內核支持線程的創(chuàng)建、撤消均與進程的相類似。在有的系統(tǒng)中為了減少創(chuàng)建和撤消一個線程時的開銷,在撤消一個線程時,并不立即回收該線程的資源和TCB,當以后再要創(chuàng)建一個新線程時,便可直接利用已被撤消但仍保持有資源和TCB的線程作為新線程。512.6.4線程的實現2.用戶級線程的實現1)運行時系統(tǒng)(RuntimeSystem)所謂“運行時系統(tǒng)”,實質上是用于管理和控制線程的函數(過程)的集合,其中包括用于創(chuàng)建和撤消線程的函數、線程同步和通信的函數以及實現線程調度的函數等。正因為有這些函數,才能使用戶級線程與內核無關。運行時系統(tǒng)中的所有函數都駐留在用戶空間,并作為用戶級線程與內核之間的接口。522.6.4線程的實現在傳統(tǒng)的OS中,進程在切換時必須先由用戶態(tài)轉為核心態(tài),再由核心來執(zhí)行切換任務;而用戶級線程在切換時則不需轉入核心態(tài),而是由運行時系統(tǒng)中的線程切換過程來執(zhí)行切換任務。該過程將線程的CPU狀態(tài)保存在該線程的堆棧中,然后按照一定的算法選擇一個處于就緒狀態(tài)的新線程運行,將新線程堆棧中的CPU狀態(tài)裝入到CPU相應的寄存器中,一旦將棧指針和程序計數器切換后,便開始了新線程的運行。由于用戶級線程的切換無需進入內核,且切換操作簡單,因而使用戶級線程的切換速度非??臁2徽撛趥鹘y(tǒng)的OS中,還是在多線程OS中,系統(tǒng)資源都是由內核管理的。在傳統(tǒng)的OS中,進程是利用OS提供的系統(tǒng)調用來請求系統(tǒng)資源的,系統(tǒng)調用通過軟中斷(如trap)機制進入OS內核,由內核來完成相應資源的分配。用戶級線程是不能利用系統(tǒng)調用的。當線程需要系統(tǒng)資源時,是將該要求傳送給運行時系統(tǒng),由后者通過相應的系統(tǒng)調用來獲得系統(tǒng)資源的。532.6.4線程的實現2)內核控制線程這種線程又稱為輕型進程LWP(LightWeightProcess)。每一個進程都可擁有多個LWP,同用戶級線程一樣,每個LWP都有自己的數據結構(如TCB),其中包括線程標識符、優(yōu)先級、狀態(tài),另外還有棧和局部存儲區(qū)等。它們也可以共享進程所擁有的資源。LWP可通過系統(tǒng)調用來獲得內核提供的服務,這樣,當一個用戶級線程運行時,只要將它連接到一個LWP上,此時它便具有了內核支持線程的所有屬性。542.6.4線程的實現在一個系統(tǒng)中的用戶級線程數量可能很大,為了節(jié)省系統(tǒng)開銷,不可能設置太多的LWP,而把這些LWP做成一個緩沖池,稱為“線程池”。用戶進程中的任一用戶線程都可以連接到LWP池中的任何一個LWP上。為使每一用戶級線程都能利用LWP與內核通信,可以使多個用戶級線程多路復用一個LWP,但只有當前連接到LWP上的線程才能與內核通信,其余進程或者阻塞,或者等待LWP。而每一個LWP都要連接到一個內核級線程上,這樣,通過LWP可把用戶級線程與內核線程連接起來,用戶級線程可通過LWP來訪問內核,但內核所看到的總是多個LWP而看不到用戶級線程。亦即,由LWP實現了在內核與用戶級線程之間的隔離,從而使用戶級線程與內核無關。圖2-14示出了利用輕型進程作為中間系統(tǒng)時用戶級線程的實現方法。55圖2-14利用輕型進程作為中間系統(tǒng)2.6.4線程的實現56作業(yè)修訂版:P685、6、22、24、27第三版:P

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論