【學習時間:1小時30分 撰寫博客時間:2小時】linux
【學習內容:進程描述符、進程的建立及終結、線程的建立】緩存
進程是Unix操做系統抽象概念中最基本的一種。進程管理是全部操做系統的心臟所在。函數
1. 進程是處於執行期的程序。除了可執行程序代碼,還包括打開的文件、掛起的信號、內核內部數據、一個或者多個執行線程等多種資源學習
2. 線程:是進程中活動的對象。每一個線程都有一個獨立的程序計數器,進程棧和一組進程寄存器。內核調度的對象是線程。spa
3. 在現代操做系統中,進程提供兩種虛擬機制:虛擬處理器和虛擬內存。同一進程中的線程之間能夠共享虛擬內存,可是每一個都擁有本身的虛擬存儲器操作系統
4. 進程的生命週期線程
5. 進程在建立它的時刻開始存活,這一般是調用fork系統的結果。該系統調用經過複製一個現有進程來建立一個全新的進程。fork系統調用從內核返回兩次,一次到父進程,另外一次回到新產生的子進程。3d
進程描述符:進程列表存放在任務隊列(task list)這一雙向鏈表中,鏈表的項是task_struct即進程描述符的結構。該類型定義在<linux/sched.h>中。進程描述符包含的數據能完整地描述一個正在執行的程序:指針
1. 內核中的大部分處理處理進程的代碼都是經過task_ struct進行的;所以,須要經過current宏查找到當前正在運行進程的進程描述符code
2. X86系統中,current把棧指針的後13個有效位屏蔽掉,用來計算出thread_ info的偏移(經過current_ thread_ info函數)
movl $-8192, %eax andl %esp,%eax3.進程狀態
進程在任什麼時候刻,都一定處於五種狀態中的一種
調用set_ task_ state(task,state)函數將進程設置爲指定狀態
對於給定的進程,獲取鏈表中下一個進程:
list_ entry(task->tasks.prev,struct task_struct,tasks)
Unix系統的進程建立方式
最後copy_process返回的就是指向子進程的指針
除了不拷貝父進程的頁表項外,vfork()系統調用和fork()功能相同。子進程做爲父進程的一個單獨的線程在它的地址空間裏運行,父進程被阻塞,直到子進程退出或執行exec()。
vfork()系統調用的實現是經過向clone()系統調用傳遞一個特殊標誌來進行的:
線程機制提供了在同一程序內共享內存地址空間運行的一組線程。在Linux系統中,線程僅僅被視爲一個與其餘進程共享某些資源的進程。每一個線程都有本身的task_struct。
1. 線程的建立與普通進程相似,只不過在調用clone()的時候須要傳遞一些參數標誌來指明共享的資源
2. 傳遞給clone()的參數標誌決定了新建立進程的行爲方式和父子進程之間共享的資源種類
內核線程與普通進程的區別只在於內核線程沒有獨立的地址空間:
終結進程大部分依賴於do_exit()來完成:
1. 孤兒進程:父進程在進程以前退出,就會遺留下子進程,也就是孤兒進程
2. 解決方法:在當前的線程組內給孤兒進程尋找新的父進程;不然直接以init做爲其父進程
一旦系統爲進程成功地找到和設置了新的父進程,就不會再有出現駐留僵死進程的危險了。init進程會例行調用wait()來檢查其子進程,清除全部與其相關的僵死進程。
經過本章的學習,我深刻理解了操做系統的核心概念——進程,以及進程與線程之間的關係。同時掌握了在Linux中使用task_ struct和thread_info存放和表示進程,經過fork()建立進程的具體過程。進程是一個很是基礎的抽象概念,對有關進程調度的理解有相當重要的做用。