進程的概念

進程的概念:

OS:程序的一個執行實例。正在執行的程序。能分配處理器並由處理器執行的實體。

內核:擔當分配系統資源的實體。

進程的兩個基本元素是程序代碼和代碼相關聯數據集。進程是一種動態描敘,但不代表所有的進程都在運行。

進程描述:

大體上說,進程的信息被放在一個進程控制塊的數據結構之中,可以認爲進程屬性的集合。

進程控制塊:

每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。

task_struct是Linux內核的一種數據結構,它會被裝載到RAM裏幷包含着進程的信息。每個進程都把信息放到這個數據結構裏。

task_struct包含的內容:

標示符:描述進程的唯一標示符,用來區別其他進程。

狀態:任務狀態,退出碼,退出信號等。

優先級:相對於其他進程的優先級。

程序計數器:程序中即將被執行的下一條指令的地址。

內存指針:包括程序代碼和進程相關數據的指針、和其他進程共享的內存塊指針。

上下文數據:進程執行時處理器的寄存器的數據。

I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。

記賬信息:可能包括處理器的時間總和,使用的時鐘數總和,時間限制,記賬號等。

task_struct可以在include/linux/sched.h中找到

進程內存映象:

Linux下C程序生成要經過預編譯、編譯、彙編、鏈接。

程序執行時,操作系統將可執行程序複製到內存中,程序轉爲進程經過幾個步驟:內核將程序讀入內存,爲程序分配內存空間;內核爲該程序保存PID及相關的狀態信息,把進程放到運行隊列中等待

執行,程序轉化進程後就可以被操作系統的調度程序執行了。

進程的內存映象:內核在內存中如何存放可執行程序文件。在將程序轉化爲進程的過程中,操作系統將可執行從硬盤複製到內存中。

進程映象的位置依賴於使用的內存管理方案。

可執行程序與進程內存映象的不同之處在於:

可執行程序位於磁盤中而內存映象位於內存;可執行程序沒有堆棧,因爲程序被加載到內存中才會分配堆棧;可執行程序雖然也有未初始化數據段但它並不被存儲在位於硬盤中的可執行文件裏;可執行程序是靜態的、不變的,而內存映象隨着程序的執行是在動態變化的,例如數據段隨着程序的執行要存儲行的變量值,棧在函數調用時也是不斷在變化的。

進程的狀態:

運行狀態:並不表示進程一定在運行中,它表示進程在運行或者在運行隊列裏。

睡眠狀態:進程在等待事件完成。

磁盤休眠狀態:進程等待IO的結束。

進程優先級:進程cpu資源的分配就是進程的優先級,優先級高的進程有優先執行的權利。

UID:執行者的身份。

PID:進程的代號。

PPID:父進程的代號,本身是子進程。

PRI:代表進程可被執行的優先級,值越小越早被執行。

NI:進程的nice值。

進程創建執行:

創建進程的方法有fork()和execve(),都是系統調用。

fork():子進程獲得父進程的數據段、棧段和堆區的一份拷貝。子進程可以修改這些內存段,但是文本段是父子進程共享的內存段,不能被子進程修改。

execve():銷燬所有的內存段去重新創建一個新的內存段。但是,execve()需要一個可執行文件或者腳本作爲參數。

殭屍進程:子進程在父進程沒有調用wait()或waitpid()的情況下退出,那麼子進程就是殭屍進程。如果父進程還存在但是一直沒有調用wait()或waitpid(),則該殭屍進程將無法回收,等到父進程退出後該殭屍進程被init回收。

孤兒進程:一個父進程退出,但是它的子進程還在運行,那麼那些子進程會成爲孤兒進程。孤兒進程將會被init進程(進程號爲1)收養,並由init進程對他們完成狀態收集工作。

內存分配:

malloc函數分配指定字節數的空間,未初始化;calloc函數爲指定類型和數量分配空間,空間內每一位都初始化爲0;realloc函數改變空間大小(可大可小),新增空間未初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章