嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號

所有學嵌入式Linux系統的看過來了,以下內容是每一位想學習Linux嵌入式系統想要了解的內容,真的很想要分享給大家! 本文分享的內容主要如下幾個方面:

4.1 進程理論

4.1.1 進程和進程控制塊

4.1.2 進程狀態

4.1.3 進程五狀態模型

4.1.4 進程控制結構

4.1 查看進程

4.1.1 進程 ID

4.1.2 查看活動進程

4.1.3 中止一個進程

4.2 創建進程

4.2.1 使用 system

4.2.2 使用 fork 和 exec

4.2.3 進程調度

4.3 信號

4.4 進程終止

4.4.1 等待進程結束

4.4.2 wait 系統調用

4.4.3 殭屍進程

4.4.4 異步清理子進程


一個程序的一份運行中的實例叫做一個進程。如果你屏幕上顯示了兩個終端窗口,你很可能同時將一

個終端程序運行了兩次——你有兩個終端窗口進程。每個窗口可能都運行著一個 shell;每個運行中的

shell 都是一個單獨的進程。當你從一個 shell 裡面調用一個程序的時候,對應的程序在一個新進程中

運行;運行結束後 shell 繼續工作。

高級程序員經常在一個應用程序中同時啟用多個協作的進程以使程序可以並行更多任務、使程序更健

壯,或者可以直接利用已有的其它程序。

本章中將要介紹的各種進程操作函數與其它 UNIX 操作系統中的進程操作函數非常相似。多數函數都

在這個包含文件中聲明瞭原型;檢查對應的手冊頁以確保無誤。


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號

圖 4-6 顯示了導致進程狀態轉換的事件類型。可能的轉換如下:

 空 -> 新建:創建執行一個程序的新進程。該事件在表 2-1 中所列出的原因下都會發生。

 新建 -> 就緒:操作系統準備好再接納一個進程時,把一個進程從新建態轉換到就緒態。大多數系統

基於現有的進程數或分配給現有進程的虛存數量設置一些限制,以確保不會因為活躍進程的數量過

多而導致系統的性能下降。

 就緒 -> 運行:需要選擇一個新進程運行時,操作系統選擇一個處於就緒態的進程,這是調度器或分

派器的工作。

 運行 -> 退出:如果當前正在運行的進程表示自己已經完成或取消,則它將被操作系統終止,見表

4-2。

 運行- -> > 就緒:這類轉換最常見的原因是,正在運行的進程到達了“允許不中斷執行”的最長時間段;

實際上所有多道程序操作系統都實行了這類時間限定。這類轉換還有很多其他原因,但它們不是在

所有的操作系統中都實現了。如果操作系統給不同的進程分配不同的優先級,進程就有可能被搶佔。

假設進程 A 在一個給定的優先級運行,且具有更高優先級的進程 B 正處於阻塞態。如果操作系統知

道進程 B 等待的事件已經發生了,則將 B 轉換到就緒態,然後因為優先級的原因中斷進程 A 的執行,

將處理器分派給進程 B,我們說操作系統搶佔了進程 A。最後一種情況是,進程自願釋放對處理器

的控制,例如一個週期性地進行審計和維護的後臺進程。

 運行- -> > 阻塞:如果進程請求它必須等待的某些事件,則進入阻塞態。對操作系統的請求通常以系統服務調用的形式發出,也就是說,正在運行的程序請求調用操作系統中一部分代碼所發生的過程。

例如,進程可能請求操作系統的一個服務,但操作系統無法立即予以服務,它也可能請求了一個無

法立即得到的資源,如文件或虛存中的共享區域;或者也可能需要進行某種初始化的工作,如 I/O

操作所遇到的情況,並且只有在該初始化動作完成後才能繼續執行。當進程互相通信,一個進程等

待另一個進程提供輸入時,或者等待來自另一個進程的信息時,都可能被阻塞。

阻塞 -> 就緒:當所等待的事件發生時,處於阻塞態的進程轉換到就緒態。

就緒 -> 退出:為了清楚起見,狀態圖中沒有表示這種轉換。在某些系統中,父進程可以在任何時刻

終止一個子進程。如果一個父進程終止,與該父進程相關的所有子進程都將被終止。

阻塞 -> 退出:前面一項提供了註釋。

4.1.4 進程控制結構

操作系統在管理和控制進程時,首先必須知道進程的位置;再者,它必須知道在管理時所必需的進程

屬性(如進程 ID、進程狀態)。

(1)進程位置

進程最少必須包括一個或一組被執行的程序,以及與這些程序相關聯的局部變量、全局變量和任何已

定義常量的數據單元。因此,一個進程至少包括足夠的內存空間,以保存該進程的程序和數據;此外,程序的執行通常涉及到用於跟蹤過程調用和過程間參數傳遞的棧。最後,與每個進程相關聯的還有操作系統用於控制進程的許多屬性,通常,屬性的集合稱為進程控制塊(Process Control Block,PCB)。程序、數據、棧和屬性的集合稱為 進程映像(見表 4-4)。

進程映像的位置依賴於使用的內存管理方案。對於最簡單的情況,進程映像保存在鄰近的或連續的存

儲塊中,進程映像保存在輔存中(通常是磁盤)。因此,如果操作系統要管理進程,其進程映像至少有一部分必須位於主存中。為執行此進程,整個進程映像必須載入主存中或至少載入虛擬內存中。因此,操作系統需要知道每個進程在磁盤中的位置,並且對於在主存中的每個進程,操作系統需要知道其在主存中的位置。來看一下第 1 章中 CTSS 操作系統關於這個方案的一個稍微複雜些的變體。在 CTSS 中,當進程被換出時,部分進程映像可保留在主存中。因此,操作系統必須跟蹤每個進程映像的哪一部分仍然在主存中。


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


嵌入式Linux系統編程——linux大神深度給你講解進程、調度、信號


分享到:


相關文章: