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