《Linux内核设计与实现》读书笔记(三)- Linux的进程
進程是所有操作系統的核心概念,同樣在linux上也不例外。
主要內容:
- 進程和線程
- 進程的生命周期
- 進程的創建
- 進程的終止
1. 進程和線程
進程和線程是程序運行時狀態,是動態變化的,進程和線程的管理操作(比如,創建,銷毀等)都是有內核來實現的。
Linux中的進程于Windows相比是很輕量級的,而且不嚴格區分進程和線程,線程不過是一種特殊的進程。
所以下面只討論進程,只有當線程與進程存在不一樣的地方時才提一下線程。
?
進程提供2種虛擬機制:虛擬處理器和虛擬內存
每個進程有獨立的虛擬處理器和虛擬內存,
每個線程有獨立的虛擬處理器,同一個進程內的線程有可能會共享虛擬內存。
?
內核中進程的信息主要保存在task_struct中(include/linux/sched.h)
進程標識PID和線程標識TID對于同一個進程或線程來說都是相等的。
Linux中可以用ps命令查看所有進程的信息:
ps -eo pid,tid,ppid,comm?
2. 進程的生命周期
進程的各個狀態之間的轉化構成了進程的整個生命周期。
?
3. 進程的創建
Linux中創建進程與其他系統有個主要區別,Linux中創建進程分2步:fork()和exec()。
fork: 通過拷貝當前進程創建一個子進程
exec: 讀取可執行文件,將其載入到內存中運行
創建的流程:
創建進程的fork()函數實際上最終是調用clone()函數。
創建線程和進程的步驟一樣,只是最終傳給clone()函數的參數不同。
比如,通過一個普通的fork來創建進程,相當于:clone(SIGCHLD, 0)
創建一個和父進程共享地址空間,文件系統資源,文件描述符和信號處理程序的進程,即一個線程:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)
在內核中創建的內核線程與普通的進程之間還有個主要區別在于:內核線程沒有獨立的地址空間,它們只能在內核空間運行。
這與之前提到的Linux內核是個單內核有關。
?
4. 進程的終止
和創建進程一樣,終結一個進程同樣有很多步驟:
?
子進程上的操作(do_exit)
子進程進入EXIT_ZOMBIE之后,雖然永遠不會被調度,關聯的資源也釋放掉了,但是它本身占用的內存還沒有釋放,
比如創建時分配的內核棧,task_struct結構等。這些由父進程來釋放。
父進程上的操作(release_task)
父進程受到子進程發送的exit_notify()信號后,將該子進程的進程描述符和所有進程獨享的資源全部刪除。
從上面的步驟可以看出,必須要確保每個子進程都有父進程,如果父進程在子進程結束之前就已經結束了會怎么樣呢?
子進程在調用exit_notify()時已經考慮到了這點。
如果子進程的父進程已經退出了,那么子進程在退出時,exit_notify()函數會先調用forget_original_parent(),然后再調用find_new_reaper()來尋找新的父進程。
find_new_reaper()函數先在當前線程組中找一個線程作為父親,如果找不到,就讓init做父進程。(init進程是在linux啟動時就一直存在的)
轉載于:https://www.cnblogs.com/Marineking/archive/2013/04/25/3043049.html
總結
以上是生活随笔為你收集整理的《Linux内核设计与实现》读书笔记(三)- Linux的进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消费者关注的 Win8 问题汇总(中)
- 下一篇: 集成信息医院需要什么样的集成平台