失败的windows系统服务调用readfile():管道已结束?_操作系统之进程详解(一)
一、進程的概念和特征
進程知識拓撲圖
1. 進程是程序的一次執行過程。
2. 進程是一個程序及其數據在處理機上順序執行時所發生的活動。
3.進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單元。
2. 進程的特征
1. 動態性:進程是程序的一次執行,它有著創建、活動、暫停、終止等過程,具有一定的生命周期,是動態地產生、變化和消亡的。動態性是進程最基本的特征。
2. 并發性:指多個進程實體同時存于內存中,能在一段時間內同時運行。并發性是進程的重要特征,同時也是操作系統的重要特征。引入進程的目的就是為了使程序能與其他進程的程序并發執行,以提高資源利用率。
3. 獨立性:指進程實體是一個能獨立運行、獨立獲得資源和獨立接受調度的基本單元。凡未建立PCB的程序都不能作為一個獨立的單元參與運行。
4. 異步性:由于進程的相互制約,使得進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度向前推進。異步性會導致執行結果的不可再現性,為此在操作系統中必須配置相應的進程同步機制。
5. 結構性:每個進程都配置一個PCB對其進行描述。從結構上看,進程實體是由程序段、數據段和進程控制塊三部分組成的。
二、進程的狀態和轉換
1. 運行態:進程正在處理機上運行。在單機處理機環境下,每個時刻最多只有一個進程處于運行態。
2. 就緒態:進程獲得了除處理機外的一切所需資源,一旦得到處理機,便可立即運行。系統中處于就緒狀態的進程可能有多個,通常將他們排成一個隊列,成為就緒隊列。
3. 阻塞態:又稱等待態。進程正在等待某一事件而暫定運行,如等待某資源為可用或等待輸入/輸出完成。即使處理機空閑,該進程也不能運行。
4. 創建態:進程正在被創建,尚未轉到就緒態。創建進程通常需要多個步驟:首先申請一個空白的PCB,并向PCB中填寫一些控制和管理進程的信息,然后由系統為該進程分配運行時所必須的資源,最后把該進程轉入就緒態。
5. 結束態:進程正從系統中消失,可能是進程正常結束或其他原因中斷退出運行。進程需要結束運行時,系統首先必須置該進程為結束態,然后再進一步處理資源釋放和回收等工作。
以下圖1.1說明了五種狀態的轉換:
圖1.1
就緒態->運行態:處于就緒態的進程被調度后,獲得處理及資源,于是進程由就緒態轉換為運行態。
運行態->就緒態:處于運行態的進程在時間片用完后,不得不讓出處理機,從而進程由運行態轉換為就緒態。此外,在可剝奪的操作系統中,當有更高優先級的進程就緒時,調度程序將正在執行的進程轉換為就緒態,讓更高優先級的進程執行。
運行態->阻塞態:進程請求某一資源的使用和分配或等待某一事件的發生時,它就從運行態轉換為阻塞態。進程以系統調用的形式請求操作系統提供服務,這是一種特殊的、由運行用戶態程序調用操作系統內核過程的形式。
阻塞態->就緒態:進程等待的事件到來時,如I/O操作結束或中斷結束時,中斷處理程序必須把相應進程的狀態由阻塞轉換為就緒態。
三、進程控制
1、進程的創建
1. 為新進程分配一個唯一的進程標識號,并申請一個空白PCB。若PCB申請失敗,則創建失敗。
2. 為進程分配資源,為新進程的程序和數據及用戶棧分配必要的內存空間。若資源不足,則并不是創建失敗,而是處于阻塞態,等待內存資源。
3. 初始化PCB,主要包括初始化標志信息、初始化處理機狀態信息和初始化處理控制信息,以及設置進程的優先級等。
4. 若進程就緒隊列能夠接納新進程,則將新進程插入就緒隊列,等待被調度運行。
2、進程的終止
操作系統終止進程的過程如下:
1. 根據被終止進程的標識符,檢索PCB,從中讀取該進程的狀態。
2. 若被終止進程處于執行狀態,立即終止該進程的執行,將處理機資源分配給其他進程。
3. 若該進程還有子孫進程,則應該將其所有子孫進程終止。
4. 將該進程所擁有的全部資源,或歸還給其父進程,或歸還給操作系統。
5. 將該PCB從所在隊列中刪除。
3、進程的阻塞和喚醒
1. 找到將要被阻塞進程的標識號對應的PCB。
2. 若該進程為運行態,則保護其現場,將其狀態轉為阻塞態,停止運行。
3. 把該PCB插入相應事件的等待隊列,將處理機資源調度給其他就緒進程。
喚醒的執行過程如下:
1. 在該事件的等待隊列中找到相應進程的PCB。
2. 將其從等待隊列中移除,并置其狀態為就緒狀態。
3. 把該PCB插入就緒隊列,等待調度程序調度。
4、進程切換
切換的過程如下:
1. 保存處理機上下文,包括程序計數器和其他寄存器。
2. 更新PCB信息。
3. 把進程的PCB移入相應的隊列,如就緒、在某事件阻塞等隊列。
4. 選擇另一個進程執行,并更新其PCB。
5. 更新內存管理的數據結構。
6. 恢復處理機上下文。
四、進程的組織
1、進程控制塊
進程是一個獨立的運行單位,也是操作系統進行資源分配和調度的基本單元。它由三部分組成,其中最核心的進程控制塊(PCB)。
PCB主要包括描述信息、進程控制和管理信息、資源分配清單和處理機相關信息等。
1. 進程描述信息:進程標識符,標志各個進程,每個進程都有一個唯一的標識號。用戶標識符,進程歸屬的用戶,用戶標識符主要為共享和保護服務。
2. 進程控制和管理信息:進程當前狀態,描述進程的狀態信息,作為處理機分配調度的依據。進程優先級,描述進程搶占處理機的優先級,優先級高的進程可優先獲得處理機。
3. 資源分配清單:用于說明有關內存地址空間或虛擬地址空間的狀況,所打開文件的列表和所使用的輸入/輸出設備信息。
處理機相關信息,主要指處理機中各寄存器的值,當進程被切換時,處理機狀態信息必須保存在相應的PCB中,以便在該進程重新執行時,能從斷點繼續執行。
2、程序段
程序段就是能被進程調度程序調度到CPU執行的程序代碼段。注意,程序可被多個進程共享,即多個進程可以運行同一個程序。
3、數據段
一個進程的數據段,可以是進程對應的程序加工處理的原始數據,也可以是程序執行時產生的中間或最終結果。
五、進程的通信
1、共享存儲
在通信的進程之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作實現進程之間的信息交換,如圖1.2所示,在對共享空間進行寫/讀操作時,需要使用同步互斥工具,對共享空間的寫/讀進行控制。
圖1.2
2、消息傳遞
進程通過系統提供的發送消息和接收消息兩個原語進行數據交換。
1. 直接通信方式:發送進程直接把消息發送給接收進程,并將它掛在接收進程的消息緩存隊列上,接收進程從消息緩沖隊列中取得消息,如圖1.3。
圖1.3
2. 間接通信方式:發送進程把消息發送到某個中間實體,接收進程從中間實體取得消息。這種中間實體一般稱為信箱,這種通信方式又稱信箱通信方式。該通信方式廣泛運用于計算機網絡中,相應的通信系統稱為電子郵件系統。
3、管道通信
管道通信是消息傳遞的一種特殊方式。所謂“管道”,是指用于連接一個讀進程和一個寫進程以實現他們之間的通信的一個共享文件,又稱pipe文件。向管道提供輸入的發送進程,以字符流形式將大量的數據送入管道;而接收管道輸出的接收進程則從管道中接收數據。管道機制必須提供以下三方面的協調能力:互斥、同步和確定對方的存在。
圖1.4
管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題,具體表現如下:
1. 限制管道的大小。實際上,管道是一個固定大小的緩沖區。在linux中,該緩沖區的大小為4kb,這使得它的大小不像文件那樣不加校驗的增長。使用單個固定緩沖區也會帶來問題,比如在寫管道時可能變滿,這種情況發生時,隨后對管道的write()調用將默認地阻塞,等待某些數據被讀取,以便騰出足夠的空間供write()調用寫。
2. 讀進程也可能工作得比寫進程快。當所有當前進程數據已被讀取時,管道變空。當這種情況發生時,一個隨后的read()調用將默認地被阻塞,等待某些數據被寫入,這解決了調用返回文件結束的問題。
更多精彩內容請關注公眾號:計算機基礎愛好者
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的失败的windows系统服务调用readfile():管道已结束?_操作系统之进程详解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 声明及赋值_重述《Effective C
- 下一篇: 三体版权卖了多少钱 传美剧开拍冲上热搜