1、進程緩存
1.進程就是出於執行期的程序函數
2.執行線程,簡稱線程,是在進程中活動的對象spa
3.進程提供兩種虛擬機制:虛擬處理器和虛擬內存線程
2、進程描述符和任務結構指針
1.內核把進程的列表存放在焦做任務隊列的雙向循環鏈表中,其中每一項都是類型爲task_struct、稱爲進程描述符的結構對象
2.進程描述符的分配和存放:隊列
(1)目的:Linux經過slab分配task_struct結構,以達到對象複用以及和緩存着色的目的(避免資源動態分配和釋放帶來的資源消耗)進程
(2)分配:每一個任務的堆棧尾端(好比,對於向上增加的堆棧來講,就是在堆棧的棧頂)有結構體thread_info,它指向了task_struct結構體內存
(3)查找:資源
1)內核中的大部分處理處理進程的代碼都是經過task_struct進行的;所以,須要經過current宏查找到當前正在運行進程的進程描述符
2)X86系統中,current把棧指針的後13個有效位屏蔽掉,用來計算出thread_info的偏移(經過current_thread_info函數)
3.進程狀態
進程在任什麼時候刻,都一定處於五種狀態中的一種
(1)TASK_RUNNING
(2)TASK_INTERRUPT
(3)TASK_UNINTERRUPT
(4)TASK_TRACED
(5)TASK_STOPPED
4.設置進程當前狀態
(1)調用set_task_state(task,state)函數將進程設置爲指定狀態
5.進程上下文
(1)可執行代碼從一個可執行文件載入到進程的地址空間執行。當一個程序執行了系統調用,內核就會「表明進程執行」並處於進程上下文中
(2)對比:在中斷上下文中,系統不表明進程執行——不會有進程去幹擾這些中斷處理程序
3、進程建立
1.Unix系統的進程建立方式
(1)fork()經過拷貝當前進程建立一個子進程
(2)exec()負責讀取可執行文件並將其載入地址空間開始運行
(3)寫時拷貝
1)Linux的fork()使用寫時拷貝推遲甚至免除拷貝。內核在建立新進程的時候並不複製整個地址空間,而是讓父進程和子進程共享同一個拷貝;直到子進程/父進程須要寫入的時候才進行拷貝
2)於是,fork的實際開銷只是複製父進程的頁表以及給子進程建立惟一的進程描述符
2.fork函數
(1)Linux經過clone系統調用實現fork
(2)由clone去調用do_fork()
(3)定義在<kernel/fork.c>中的do_fork()完成建立中的大部分工做,它調用copy_process函數,而後讓進程開始運行
4、內核線程
1.內核線程:獨立運行在內核空間的標準進程。
2.內核線程沒有獨立的地址空間,只在內核空間運行,歷來不切換到用戶空間,能夠被調度和被搶佔。
3.內核線程只能由其餘內核線程建立
5、進程終結
1.進程終結時,內核必須釋放它所佔有的資源並告知父進程。
2.進程終結的緣由:通常是來自自身,發生在調用exit()系統調用時。
3.刪除進程描述符
經過release_task()實現進程描述符的刪除,至此,全部資源都被釋放了
4.解決孤兒進程
(1)父進程在進程以前退出,就會遺留下子進程,也就是孤兒進程
(2)解決方法:在當前的線程組內給孤兒進程尋找新的父進程;
直接以init做爲其父進程