壹. Linux進程背景
按照我的理解,Linux過程上下文是過程組件的集合。包括進程描述符tast_struct、文本段、數據段、堆棧、寄存器內容、頁表等。
1)任務結構
它是壹種數據結構,存儲過程的描述信息,如pid、uid、狀態、信號項、打開文件表等。它是過程管理和調度的重要基礎。
2)用戶堆棧和核心堆棧
顧名思義,用戶棧是進程在用戶模式下運行時使用的壹個棧,它包含了進程在用戶模式下執行時函數調用的參數和局部變量。核心堆棧是進程在核心狀態下運行時使用的堆棧,它存儲用於調用系統函數的參數和調用序列。兩個堆棧指針都存儲在tast_struct結構中。
3)註冊
保存程序計數器、狀態字、通用寄存器和堆棧指針。
4)頁面表
線性地址到物理地址的映射
5)文本段、數據段。
二、Linux進程的現狀
Linux中的進程* * *有五種狀態:就緒、可中斷、未中斷、掛起和死亡。換句話說,linux不區分就緒和運行,它們統稱為就緒狀態。進程的狀態記錄在tast_struct中。
第三,過程控制
1)過程樹的形成
計算機啟動後,BIOS從磁盤的引導扇區加載系統引導程序。它將Linux系統加載到內存中,並跳轉到內核執行。Linux內核執行初始化工作:初始化硬件,初始化內部數據結構,建立進程0。進程0創建進程1,它是所有後續創建進程的祖先,負責初始化所有用戶進程。Process 1創建壹個shell進程,它顯示壹個提示符並等待命令的輸入。
2)流程的創建
任何用戶進程的創建都是由壹個已有的進程完成的,而進程的創建又要經過兩個進程:fork和exec。Fork就是給新流程分配相應的數據結構,復制父流程相應的上下文信息。Exec是將可執行文件的文本和數據轉移到內存中,以覆蓋其原始(從父進程復制而來)並開始執行文本段。
3)過程的終止
系統可以通過調用exit()來終止自身。exit釋放除tast_struct以外的所有上下文,父進程在收到子進程終止的消息後釋放子進程的tast_struct。
4)進程的調度
進程調度由schedule()完成。在壹種情況下,在處理器從內核模式切換到用戶模式之前,它將檢查調度標誌是否為1。如果是1,它將運行schedule()來調度進程。另壹種情況是進程自動放棄處理器,有時候進程是調度的。
進程調度的過程分為兩步。首先,使用相關策略選擇要執行的流程,然後切換上下文。
第四,溝通的過程
進程的通信策略主要包括消息、管道、消息隊列、* *共享存儲區和信號量。
1)信息
消息機制主要用於在進程間傳遞軟中斷信號,通知對方異步事件。發送進程將信號(約定符號)發送給目標進程tast_struct中的信號項,接收進程看到消息後調用相應的處理程序。請註意,處理程序只有在流程執行後才能執行,並且不能立即響應。
2)管道
我理解的是兩個進程在通知緩沖區使用壹個隊列(兩個進程各壹個),發送進程向管道入口發送數據,接收進程從管道出口讀取數據。
3)消息隊列
消息隊列是由操作系統維護的消息鏈表。發送進程根據消息標識符將消息添加到隊列中,接收進程從隊列中讀取消息。
4)***享受儲物區
在內存中打開壹個區域是壹個進程所享有的,也就是說,壹個進程可以把它附加到自己的地址空間中,並操縱這個區域中的數據。
5)旗語
控制流程的同步。