【OS】进程与线程
文章目錄
- 進程的概念和特征
- 進程和程序的關(guān)系
- 進程的特征
- 進程的狀態(tài)和轉(zhuǎn)換
- 進程控制
- 引起`進程終止`的事件主要有:
- 操作系統(tǒng)`終止進程`過程如下(`撤銷原語`):
- `阻塞原語`的執(zhí)行過程如下:
- `喚醒原語`的執(zhí)行過程如下:
- `進程切換`的過程如下:
- 進程組織
- 進程通信
- 線程概念和多線程模式
- 線程的提出有利于提高系統(tǒng)并發(fā)性
- 小結(jié)
進程的概念和特征
在多道程序環(huán)境下允許多個程序并發(fā)執(zhí)行,此時這些程序會失去封閉性,并具有間斷性以及不可再現(xiàn)性。為此引入了進程(Process)的概念,以便于更好的去描述和控制程序的并發(fā)執(zhí)行,實現(xiàn)操作系統(tǒng)的并發(fā)性和共享性(操作系統(tǒng)最基本的兩個特征)。
為了能使參與并發(fā)執(zhí)行的程序能夠獨立運行,必須要為每個進程配置一個進程控制塊(PCB)。
系統(tǒng)利用PCB來描述進程的基本情況和運行狀態(tài),進而控制和管理進程。
進程映像(進程實體)由程序段、相關(guān)數(shù)據(jù)段和PCB三部分構(gòu)成。進程映像是靜態(tài)的,進程是動態(tài)的,進程是進程映像的運行過程。所謂創(chuàng)建進程實質(zhì)上是創(chuàng)建進程映像中的PCB,而撤銷進程實質(zhì)上是撤銷進程的PCB。
!!!PCB是進程存在的唯一標志。
進程和程序的關(guān)系
進程可以創(chuàng)建其他進程,程序不能產(chǎn)生新程序
①進程是程序的一次執(zhí)行過程。
②進程是一個程序及其數(shù)據(jù)在處理機上順序執(zhí)行時所發(fā)生的活動。
③進程是具有獨立功能的程序在一個數(shù)據(jù)集合上運行的過程,它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
進程的特征
進程是由多道程序的并發(fā)執(zhí)行引出的,它和程序是兩個不同的概念,進程的基本特征是對比單個程序的順序執(zhí)行提出的,也是對進程管理提出的基本要求。
①動態(tài)性
進程是程序的一次執(zhí)行,它有著創(chuàng)建、活動、暫停、終止等過程,具有一定的生命周期,是動態(tài)的產(chǎn)生,變化和消亡的。動態(tài)性是進程最基本的特征
②并發(fā)性
并發(fā)性是指多個進程實體同時存于內(nèi)存中,能在一段時間內(nèi)同時運行。并發(fā)性是進程的重要特征,同時也是操作系統(tǒng)的重要特征,引入進程的目的就是為了使程序能與其他進程的程序并發(fā)執(zhí)行,從而提高資源利用率。
③獨立性
獨立性是指進程實體是一個能獨立運行,獨立獲得資源和獨立接受調(diào)度的基本單位。
凡未建立PCB的程序都不能作為一個獨立的單位參與運行。
④異步性
由于進程的相互制約,使得進程具有執(zhí)行的間斷性,即進程按各自獨立的、不可預知的速度向前推進。異步性會導致執(zhí)行結(jié)果的不可再現(xiàn)性,為此,在操作系統(tǒng)中必須配置相應的進程同步機制。
⑤結(jié)構(gòu)性
每個進程都配置一個PCB對其進行描述。從結(jié)構(gòu)上看進程實體是由程序段、數(shù)據(jù)段和進程控制塊三部分組成。
進程的狀態(tài)和轉(zhuǎn)換
一個進程在其生命周期中,由于系統(tǒng)各進程之間的相互制約關(guān)系以及系統(tǒng)的運行環(huán)境的變化,會使得進程的狀態(tài)也在不斷的發(fā)生變化(一個進程會經(jīng)歷若干不同的狀態(tài)),通常情況下會有以下5種狀態(tài),前3種是進程的基本狀態(tài)。
進程正在處理機上運行。在單處理機環(huán)境下,每個時刻最多只有一個進程處于運行態(tài)。
進程獲得了除處理機之外的一切所需資源,一旦得到處理機便可立即運行。系統(tǒng)中處于就緒狀態(tài)的進程可能有多個,通常將它們排成一個隊列稱為就緒隊列。
阻塞態(tài)又稱等待態(tài)。進程正在等待某一事件而暫停運行,如等待某資源為可用(不包括處理機)或等待輸入/輸出完成。即使處理機空閑,該進程也不能運行。
進程正在被創(chuàng)建,尚未轉(zhuǎn)到就緒態(tài)。
進程創(chuàng)建通常需要多個步驟:
首先申請一個空白的PCB,并向PCB中填寫一些控制和管理進程的信息,然后由系統(tǒng)為該進程分配運行時所必需的資源,最后把該進程轉(zhuǎn)入就緒態(tài)。
進程正從系統(tǒng)中消失,可能是進程正常結(jié)束或者是其他原因中斷退出運行。進程需要結(jié)束運行時,系統(tǒng)首先必須置該進程為結(jié)束態(tài),然后再進一步處理資源釋放和回收等工作。
注意區(qū)別就緒態(tài)和等待態(tài):
就緒態(tài)是指進程僅僅缺少了處理機,只要獲得處理機資源就可以立即運行進程,而等待態(tài)是指進程需要其他資源(除了處理機)或等待某一件事件。
之所以將處理機和其他資源劃分開,是因為在分時系統(tǒng)的時間片輪轉(zhuǎn)機制中,每個進程分到的時間片是幾毫秒,也就是說進程得到處理機的時間很短,而且非常頻繁,進程在運行過程中實際上是頻繁的轉(zhuǎn)換到就緒態(tài),而其他資源(比如說外設(shè))的使用和分配或某一事件的發(fā)生(如io操作的完成)對應的時間相對來說很長,進程轉(zhuǎn)換到等待態(tài)的次數(shù)也相對較少,這樣看來就緒態(tài)和等待態(tài)是進程生命周期中兩個完全不同的狀態(tài),需要加以區(qū)分。
- 就緒態(tài)→運行態(tài)
處于就緒態(tài)的進程被調(diào)度后獲得處理機資源(分派處理機時間片),于是進程由就緒態(tài)轉(zhuǎn)換為運行態(tài)。 - 運行態(tài)→就緒態(tài)
處于運行態(tài)的進程,在時間片用完后不得不讓出處理機,從而進程由運行態(tài)轉(zhuǎn)化為就緒態(tài),此外在可剝奪的操作系統(tǒng)中,當有更高優(yōu)先級的進程就緒時,調(diào)度程度將正在執(zhí)行的進程轉(zhuǎn)化為就緒態(tài),讓更高優(yōu)先級的進程執(zhí)行。 - 運行態(tài)→阻塞態(tài)
進程請求某一資源(如外設(shè))的使用和分配,或等待某一事件的發(fā)生時,它就從運行態(tài)轉(zhuǎn)換為阻塞態(tài),進程以系統(tǒng)調(diào)用的形式請求操作系統(tǒng)提供服務,這是一種特殊的由運行用戶態(tài)程序調(diào)用操作系統(tǒng)內(nèi)核過程的程序。 - 阻塞態(tài)→就緒態(tài)
進程等待的事件到來時(如IO操作結(jié)束或中斷結(jié)束時),中斷處理程序必須把相應進程的狀態(tài)由阻塞態(tài)轉(zhuǎn)化為就緒態(tài)。
一個進程從運行態(tài)變?yōu)樽枞麘B(tài)是主動行為,而從阻塞態(tài)變成就緒態(tài)是被動行為,需要其他相關(guān)進程的協(xié)助。
進程控制
一般把進程控制用的程序段稱為原語,原語的特點是執(zhí)行期間不允許中斷,它是一個不可分割的基本單位。
允許一個進程創(chuàng)建另外一個進程,創(chuàng)建者稱為父進程,被創(chuàng)建的進程稱為子進程。子進程可以繼承父進程所擁有的資源,當子進程被撤銷時,應將其從父進程那里獲得的資源歸還給父進程,此外在撤銷父進程時必須同時撤銷其所有的子進程。
在操作系統(tǒng)中,終端用戶登錄系統(tǒng)、作業(yè)調(diào)度、系統(tǒng)提供服務、用戶程序的請求等都會引起新進程的創(chuàng)建。操作系統(tǒng)會創(chuàng)建一個新的進程(創(chuàng)建原語):
①為新進程分配一個唯一的進程標識號,并申請一個空白的PCB(PCB是有限的)。若PCB申請失敗,則創(chuàng)建失敗。
②為進程分配資源,為新進程的程序和數(shù)據(jù)及用戶棧分配必要的內(nèi)存空間(PCB中體現(xiàn))。若資源不足,則并不是創(chuàng)建失敗,而是處于阻塞態(tài),等待內(nèi)存資源。
③初始化PCB主要包括初始化標志信息,初始化處理機狀態(tài)信息和初始化處理機控制信息,以及設(shè)置進程的優(yōu)先級等。
④若進程就緒隊列能夠接納新進程,則將新進程插入就緒隊列,等待被調(diào)度運行。
引起進程終止的事件主要有:
①正常結(jié)束,表示進程的任務已完成,并準備退出運行。
②異常結(jié)束,表示進程在運行時發(fā)生了某種異常事件,使程序無法繼續(xù)運行。
③外界干預,指進程應外界的請求而終止運行。
操作系統(tǒng)終止進程過程如下(撤銷原語):
①根據(jù)被終止進程的標識符,檢索PCB,從中讀出該進程的狀態(tài)。
②若被終止進程處于執(zhí)行狀態(tài),立即終止該進程的執(zhí)行,將處理機資源分配給其他進程。
③若該進程還有子孫進程,則應將其所有子孫進程終止。
④將該進程所擁有的全部資源,或歸還給其父進程,或歸還給操作系統(tǒng)。
⑤將該PCB從所在隊列(鏈表)中刪除。
正在執(zhí)行的進程,由于期待的某些事件尚未發(fā)生(如請求系統(tǒng)資源失敗,等待某種操作完成,新數(shù)據(jù)尚未到達或無心工作可做等),由系統(tǒng)自動執(zhí)行阻塞原語(Block),使自己由運行態(tài)變?yōu)樽枞麘B(tài),可見進程的阻塞是進程自身的一種主動行為,也因此只有處于運行態(tài)的進程才可能將其轉(zhuǎn)為阻塞態(tài)
阻塞原語的執(zhí)行過程如下:
①找到將要被阻塞進程的標識號對應的PCB
②若該進程為運行態(tài),則保護其現(xiàn)場,將其狀態(tài)轉(zhuǎn)為阻塞態(tài)停止運行
③把該PCB插入相應事件的等待隊列,將處理機資源調(diào)度給其他就緒進程
當被阻塞進程所期待的事件發(fā)生(如它所啟動的IO操作已完成,或其所期待的數(shù)據(jù)已到達)時,由有關(guān)進程調(diào)用喚醒原語(Wakeup),將等待該事件的進程喚醒。
喚醒原語的執(zhí)行過程如下:
①在該事件的等待隊列中找到相應的進程的PCB
②將其從等待隊列中移出,并致其狀態(tài)為就緒態(tài)
③把該PCB插入就緒隊列,等待調(diào)度程序調(diào)度
Block原語和Wakeup原語是一對作用剛好相反的原語,必須成對使用。Block原語是被阻塞進程自我調(diào)用實現(xiàn)的,而Wakeup原語則是由一個與被喚醒進程合作或被其他相關(guān)的進程調(diào)用實現(xiàn)的。
對于通常的進程來說,其創(chuàng)建、撤銷及要求由系統(tǒng)設(shè)備完成的IO操作都是利用系統(tǒng)調(diào)用而進入內(nèi)核的,再由內(nèi)核中的相應處理程序予以完成。進程切換同樣是在內(nèi)核的支持下實現(xiàn)的,可以說任何競爭都是在操作系統(tǒng)內(nèi)核的支持下運行的,是與內(nèi)核緊密相關(guān)。
進程切換是指處理機從一個進程的運行轉(zhuǎn)到另一個進程上運行,在這個過程中進程的運行環(huán)境產(chǎn)生了實質(zhì)性的變化
進程切換的過程如下:
①保存處理機上下文,包括程序計數(shù)器和其他寄存器。
②更新PCB信息。
③把進程的PCB移入相應的隊列。如就緒、在某事件阻塞等隊列。
④選擇另一個進程執(zhí)行并更新其PCB。
⑤更新內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)。
⑥恢復處理機上下文。
進程切換與處理機模式切換是不同的,模式切換時處理機邏輯上可能還在同一進程中運行。若進程因中斷或異常進入核心態(tài)運行,執(zhí)行完后又回到用戶態(tài)剛被中斷的程序運行,則操作系統(tǒng)只需恢復進程進入內(nèi)核時所保存的CPU現(xiàn)場,而無需改變當前進程的環(huán)境信息。但若要切換進程,當前的運行進程改變了,則當前進程的環(huán)境信息也需要改變。
進程組織
進程是一個獨立的運行單位,也是操作系統(tǒng)進行資源分配和調(diào)度的基本單位,由以下三部分組成,最核心的部分是進程控制塊PCB。
1)進程創(chuàng)建時,操作系統(tǒng)為它新建一個PCB,該結(jié)構(gòu)之后常駐內(nèi)存,任何時刻都可以存儲,并在進程結(jié)束時刪除,PCB是進程實體的一部分,是進程存在的唯一標志。
2)進程執(zhí)行時,系統(tǒng)通過其PCB了解進程的現(xiàn)行狀態(tài)信息,以便對其進行控制和管理。
3)進程結(jié)束時系統(tǒng)回收其PCB,該進程隨之消亡,操作系統(tǒng)通過PCB表來管理和控制進程。
4)當操作系統(tǒng)想要調(diào)度某進程運行時,要從該進程的PCB中查出其現(xiàn)行狀態(tài)和優(yōu)先級;在調(diào)度到某進程后,要根據(jù)其PCB所保存的處理機狀態(tài)信息,設(shè)置該進程恢復運行的現(xiàn)場,并根據(jù)其PCB中的程序和數(shù)據(jù)的內(nèi)存地址找到其程序和數(shù)據(jù)。
5)進程在運行過程中,當需要和與之合作的進程實現(xiàn)同步、通信或訪問文件時,也需要訪問PCB。
6)當進程由于某種原因而暫停運行時,又需將其斷點的處理機環(huán)境保存在PCB中。
可見在進程的整個生命期中,系統(tǒng)總是通過PCB對進程進行控制,系統(tǒng)唯有通過進程的PCB才能感知到其進程的存在。
PCB主要包括進程描述、信息進程控制、管理信息、資源分配清單和處理機相關(guān)信息等。
①進程描述信息
進程標識符:標志各個進程,每個進程都有唯一一個標識號。
用戶標識符:進程歸屬的用戶,用戶標識符主要為共享和保護服務。
②進程控制和管理信息
進程當前狀態(tài):描述進程的狀態(tài)信息作為處理機分配調(diào)度的依據(jù)。
進程優(yōu)先級:描述進程搶占處理機的優(yōu)先級,優(yōu)先級高的進程可優(yōu)先獲得處理機。
③資源分配清單
用于說明有關(guān)內(nèi)存地址空間或虛擬地址空間的情況,所打開文件的列表和所使用的輸入輸出設(shè)備信息。
④處理機相關(guān)信息
主要指處理機中各寄存器的值。當進程被切換時,處理機狀態(tài)信息都必須保存在相應的PCB中,以便在該進程重新執(zhí)行時,能從斷點繼續(xù)執(zhí)行。
PCB包含內(nèi)容:
—
在一個系統(tǒng)中通常存在著許多進程的PCB,有的處于就緒態(tài),有的處于阻塞態(tài),而且阻塞下來的原因各不相同。
為了方便進程的調(diào)度和管理,需要將各進程的PCB用適當?shù)姆椒ńM織起來,目前常用的組織方式有鏈接方式和索引方式兩種:
鏈接方式:將同一狀態(tài)的PCB鏈接成一個隊列,不同狀態(tài)對應不同的隊列,也可把處于阻塞態(tài)的進程的PCB,根據(jù)其阻塞原因的不同,排成多個阻塞隊列。
索引方式:將同一狀態(tài)的進程組織在一個索引表中,索引表的表項指向相應的PCB,不同狀態(tài)對應不同的索引表,如就緒索引表和阻塞索引表等。
2. 程序段
程序段就是能被進程調(diào)度程序調(diào)度到CPU執(zhí)行的程序代碼段。
程序可被多個進程共享,即多個進程可以運行同一個程序。
3. 數(shù)據(jù)段
一個進程的數(shù)據(jù)段可以是進程對應的程序加工處理的原始數(shù)據(jù),也可以是程序執(zhí)行時產(chǎn)生的中間或最終結(jié)果。
進程通信
進程通信是指進程之間的信息交換,PV操作是低級通信方式,高級通信方式是指以較高的效率傳輸大量數(shù)據(jù)的通信方式,高級通信方法主要有以下三類:
在通信的進程之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行讀寫操作實現(xiàn)進程之間的信息交換。在對共享空間進行讀寫操作時,需要使用同步互斥工具(如PV操作),對共享空間的讀/寫操作進行控制。
共享存儲又分為兩種:
低級共享是基于數(shù)據(jù)結(jié)構(gòu)的共享
高級共享是基于存儲區(qū)的共享
操作系統(tǒng)只負責為通信進程提供可共享使用的存儲空間和同步互斥工具,而數(shù)據(jù)交換則由用戶自己安排讀寫指令完成
注意:用戶進程空間一般都是獨立的,進程運行期間一般不能訪問其他進程的空間,要想讓兩個用戶進程共享空間必須通過特殊的系統(tǒng)調(diào)用實現(xiàn),而進程內(nèi)的線程是自然共享進程空間的。
消息傳遞
在消息傳遞系統(tǒng)中,進程間的數(shù)據(jù)交換是以格式化的消息為單位的,如果通信的進程之間不存在可直接訪問的共享空間,則必須利用操作系統(tǒng)提供的消息傳遞方法實現(xiàn)進程通信。
進程通過系統(tǒng)提供的發(fā)送消息和接收消息兩個原語進行數(shù)據(jù)交換
①直接通信方式
發(fā)送進程直接把消息發(fā)送給接收進程,并將它掛在接收進程的消息緩沖隊列上,接收進程從消息緩沖隊列中取得信息。
②間接通信方式
發(fā)送進程把消息發(fā)送到某個中間實體,接收進程從中間實體取得消息,這種中間實體一般稱為信箱,這種通信方式又成為信箱通信方式。
該通信方式廣泛應用于計算機網(wǎng)絡中,相應的通信系統(tǒng)稱為電子郵件系統(tǒng)。
管道通信
管道通信是消息傳遞的一種特殊方式
所謂“管道”是指用于連接一個讀進程和一個寫進程,以實現(xiàn)它們之間的通信的一個共享文件,又名pipe文件。向管道(共享文件)提供輸入的發(fā)送進程(寫進程),以字符流形式將大量的數(shù)據(jù)送入寫通道,而接收管道輸出的接收進程(讀進程)則從管道中接收(讀)數(shù)據(jù),為了協(xié)調(diào)雙方的通信,管道機制必須提供以下三個方面的協(xié)調(diào)能力:互斥、同步和確定對方存在。
以Linux中的管道為例:
在Linux中管道是一種使用非常頻繁的通信機制,從本質(zhì)上說管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題:
①限制管道的大小。
實際上管道是一個固定大小的緩沖區(qū),在Linux中該緩沖區(qū)的大小為4,kb,這是它的大小,不像穩(wěn)健那樣不加檢驗的增長,使用單個固定緩沖區(qū)也會帶來問題,比如在斜管道時可能變滿,這種情況發(fā)生時隨后對管道的right調(diào)用將默認的被阻塞,等待某些數(shù)據(jù)被讀取,以便騰出足夠的空間共write調(diào)用。
②獨進程也可能工作的比寫進程快。
當所有當前進程數(shù)據(jù)已被讀取時,管道變空,當這種情況發(fā)生時,一個隨后的read調(diào)用將默認的被阻塞,等待某些數(shù)據(jù)被寫入,這解決了瑞的調(diào)用返回文件結(jié)束的問題。
管道可以理解為共享存儲的優(yōu)化和發(fā)展。因為在共享存儲中,若某進程要訪問共享存儲空間,則必須沒有其他進程在該共享存儲空間中進行寫操作,否則訪問行為就會被阻塞,而管道通信中存儲空間進化成了緩沖區(qū),緩沖區(qū)只允許一邊寫入另一邊讀出,因此只要緩沖區(qū)中有數(shù)據(jù)進程就能從緩沖區(qū)中讀出,而不必擔心會被其他進程在另一在其中進行寫操作而遭到阻塞。因為寫進程會先把緩沖區(qū)寫滿,然后才讓讀進程讀,當緩沖區(qū)中還有數(shù)據(jù)時寫進程不會往緩沖區(qū)寫數(shù)據(jù),這也決定了管道通信必然是半雙工通信。
線程概念和多線程模式
線程的基本概念
引入進程的目的是為了更好地使多道程序并發(fā)執(zhí)行,提高資源利用率和系統(tǒng)吞吐量,而引入線程的目的則是為了減小程序在并發(fā)執(zhí)行時所付出的時空開銷,提高操作系統(tǒng)的并發(fā)性能。
線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單元,由線程ID、程序計數(shù)器、寄存器集合和堆棧組成。
線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤銷另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。
引入線程后,進程只作為除CPU外的系統(tǒng)資源的分配單元,而線程則作為處理機的分配單元。由于一個進程內(nèi)部有多個線程,若線程的切換發(fā)生在同一個進程內(nèi)部,則只需要很少的時空開銷。
線程與進程
1 )調(diào)度
在傳統(tǒng)的操作系統(tǒng)中,擁有資源和獨立調(diào)度的基本單位都是進程。
在引入線程的操作系統(tǒng)中,線程是獨立調(diào)度的基本單位,進程是擁有資源的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同進程中進行線程切換,如從個進程內(nèi)的線程切換到另一個進程中的線程時,會引起進程切換。
2 )擁有資源
不論是傳統(tǒng)操作系統(tǒng)還是設(shè)有線程的操作系統(tǒng),進程都是擁有資源的基本單位,而線程不擁有系統(tǒng)資源(也有點兒必不可少的資源) ,但線程可以訪問其隸屬進程的系統(tǒng)資源。要知道,若線程也是擁有資源的單位,則切換線程就需要較大的時空開銷,線程這個概念的提出就沒有意義。
3 )并發(fā)性
在引入線程的操作系統(tǒng)中,不僅進程之間可以并發(fā)執(zhí)行,而且多個線程之間也可以并發(fā)執(zhí)行,從而使操作系統(tǒng)具有更好的并發(fā)性,提高了系統(tǒng)的吞吐量。
4 )系統(tǒng)開銷
由于創(chuàng)建或撤銷進程時,系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間、I/O設(shè)備等,因此操作系統(tǒng)所付出的開銷遠大于創(chuàng)建或撤銷線程時的開銷。類似地,在進行進程切換時,涉及當前執(zhí)行進程CPU環(huán)境的保存及新調(diào)度到進程CPU環(huán)境的設(shè)置,而線程切換時只需保存和設(shè)置少量寄存器內(nèi)容,開銷很小。此外,由于同進程內(nèi)的多個線程共享進程的地址空間,因此這些線程之間的同步與通信非常容易實現(xiàn),甚至無須操作系統(tǒng)的干預。
5 )地址空間和其他資源(如打開的文件)
進程的地址空間之間互相獨立,同一進程的各線程間共享進程的資源,某進程內(nèi)的線程對于其他進程不可見。
6 )通信方面
進程間通信(IPC) 需要進程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性,而線程間可以直接讀/寫進程數(shù)據(jù)段(如全局變量)來進行通信。
線程屬性
多線程操作系統(tǒng)把線程作為獨立運行(或調(diào)度)的基本單位,此時的進程已不再是一個基本的可執(zhí)行實體,但它仍具有與執(zhí)行相關(guān)的狀態(tài)。所謂進程處于“執(zhí)行”狀態(tài),實際上是指該進程中的某線程正在執(zhí)行。線程的主要屬性如下:
1 )線程是一個輕型實體, 它不擁有系統(tǒng)資源,但每個線程都應有一一個唯一的標識符和一一個線程控制塊,線程控制塊記錄了線程執(zhí)行的寄存器和棧等現(xiàn)場狀態(tài)。
2 )不同的線程可以執(zhí)行相同的程序,即同一個服務程序被不同的用戶調(diào)用時,操作系統(tǒng)把它們創(chuàng)建成不同的線程。
3 )同一進程中的各個線程共享該進程所擁有的資源。
4 )線程是處理機的獨立調(diào)度單位,多個線程是可以并發(fā)執(zhí)行的。
在單CPU的計算機系統(tǒng)中,各線程可交替地占用CPU;在多CPU的計算機系統(tǒng)中,各線程可同時占用不同的CPU,若各個CPU同時為一個進程內(nèi)的各線程服務,則可縮短進程的處理時間。
5 )一個線程被創(chuàng)建后,便開始了它的生命周期,直至終止。線程在生命周期內(nèi)會經(jīng)歷阻塞態(tài)、就緒態(tài)和運行態(tài)等各種狀態(tài)變化。
線程的提出有利于提高系統(tǒng)并發(fā)性
由于有了線程,線程切換時,有可能會發(fā)生進程切換,也有可能不發(fā)生進程切換,平均而言每次切換所需的開銷就變小了,因此能夠讓更多的線程參與并發(fā),而不會影響到響應時間等問題。
線程實現(xiàn)方式
線程的實現(xiàn)可以分為兩類:用戶級線程(User-Level Thread, ULT)和內(nèi)核級線程(Kermel-Level Thread, KLT)。內(nèi)核級線程又稱內(nèi)核支持的線程。
1)在用戶級線程中
有關(guān)線程管理(線程的創(chuàng)建、撤銷和切換等)的所有工作都由應用程序完成,內(nèi)核意識不到線程的存在。應用程序可以通過使用線程庫設(shè)計成多線程程序。應用程序從單線程開始,在該線程中開始運行,在其運行的任何時刻,可以通過調(diào)用線程庫中的派生例程創(chuàng)建一個在相同進程中運行的新線程。
2)在內(nèi)核級線程中
線程管理的所有工作由內(nèi)核完成,應用程序沒有進行線程管理的代碼,只有一個到內(nèi)核級線程的編程接口。內(nèi)核為進程及其內(nèi)部的每個線程維護上下文信息,調(diào)度也在內(nèi)核基于線程架構(gòu)的基礎(chǔ)上完成。
3)有些系統(tǒng)中使用組合方式的多線程實現(xiàn)
線程創(chuàng)建完全在用戶空間中完成,線程的調(diào)度和同步也在應用程序中進行。一個應用程序中的多個用戶級線程被映射到一些(小于等于用戶級線程的數(shù)目)內(nèi)核級線程上。
多線程模式
有些系統(tǒng)同時支持用戶線程和內(nèi)核線程,由此產(chǎn)生了不同的多線程模型,即實現(xiàn)用戶級線程和內(nèi)核級線程的連接方式。
1)多對一模型
將多個用戶級線程映射到一個內(nèi)核級線程,線程管理在用戶空間完成。此模式中,用戶級線程對操作系統(tǒng)不可見(即透明)。
優(yōu)點:線程管理是在用戶空間進行的,因而效率比較高。
缺點:一個線程在使用內(nèi)核服務時被阻塞,整個進程都會被阻塞;多個線程不能并行地運行在多處理機上。
2)一對一模型
將每個用戶級線程映射到一個內(nèi)核級線程。
優(yōu)點:當一個線程被阻塞后,允許另一個線程繼續(xù)執(zhí)行,所以并發(fā)能力較強。
缺點:每創(chuàng)建一個用戶級線程都需要創(chuàng)建一個內(nèi)核級線程與其對應,這樣創(chuàng)建線程的開銷比較大,會影響到應用程序的性能。
3)多對多模型
將n個用戶級線程映射到m個內(nèi)核級線程上(m≤n)
特點:多對多模型是多對一模型和一對一模型的折中,既克服了多對模型并發(fā)度不高的缺點,又克服了一對一模型的一個用戶進程占用太多內(nèi)核級線程而開銷太大的缺點。此外,還擁有多對一模型和一對一模型各自的優(yōu)點。
小結(jié)
1)為什么要引入進程?
在多道程序同時運行的背景下,進程之間需要共享系統(tǒng)資源,因此會導致各程序在執(zhí)行過程中出現(xiàn)相互制約的關(guān)系,程序的執(zhí)行會表現(xiàn)出間斷性的特征。這些特征都是在程序的執(zhí)行過程中發(fā)生的,是動態(tài)的過程,而傳統(tǒng)的程序本身是一組指 令的集合,是一 一個靜態(tài)的概念,無法描述程序在內(nèi)存中的執(zhí)行情況,即我們無法從程序的字面上看出它何時執(zhí)行、何時停頓,也無法看出它與其他執(zhí)行程序的關(guān)系,因此,程序這個靜態(tài)概念已不能如實反映程序并發(fā)執(zhí)行過程的特征。為了深刻描述程序動態(tài)執(zhí)行過程的性質(zhì)乃至更好地支持和管理多道程序的并發(fā)執(zhí)行,人們引入了進程的概念。
2)什么是進程?進程由什么組成?
進程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它可以申請和擁有系統(tǒng)資源,是一個動態(tài)的概念,是一 一個活動的實體。它不只是程序的代碼本身,還包括當前的活動,通過程序計數(shù)器的值和處理寄存器的內(nèi)容來表示。
一個進程實體由程序段、相關(guān)數(shù)據(jù)段和PCB三部分構(gòu)成,其中PCB是標志一個進程存在的唯一標識,程序段是進程運行的程序的代碼,數(shù)據(jù)段則存儲程序運行過程中相關(guān)的一些數(shù)據(jù)。
3)進程是如何解決問題的?
進程把能夠識別程序運行態(tài)的一些變量存放在PCB中,通過這些變量系統(tǒng)能夠更好地了解進程的狀況,并在適當時進行進程的切換,以避免一些資源的浪費,甚至劃分為更小的調(diào)度單位一線程來提高系統(tǒng)的并發(fā)度。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: 【OS】操作系统体系结构
- 下一篇: 【OS】处理机调度