進程管理:
線程,每一個線程都擁有一個獨立的程序計數器,進程棧和一組進程寄存器。內核調度的對象是線程。
進程提供兩種機制:虛擬處理器和虛擬內存,給進程一種假象,感覺是在獨享處理器和內存。
程序並不是進程,進程是處於執行期的程序及其包含的資源的總稱。
內核把進程存放在任務隊列(task list)的雙向循環鏈表中,鏈表中的結構爲task_struct(進程描述符),task_struct是通過slab分配器分配的
pid最大值默認爲32768,爲了與老版本UNIX和Linux兼容
進程的五種狀態:運行,可中斷,不可中斷,僵死,停止
所有的進程都是init進程的子進程,所有的進程都具有父進程。
Linux的fork採用的是寫實拷貝的機制,只有在寫入操作是纔會發生複製
線程在內核的角度上來看,就是與其他進程共享某些資源的普通進程。每個線程都具有自己的進程描述符,對於那些支持線程的系統中,通常會有一個包涵四個不同線程的指針的統一進程描述符。線程的創建與進程創建的區別在於調用clone()的時候需要傳遞一些參數指明需要共享的資源
內核線程:它和普通進程之間的區別在於沒有獨立的地址空間,只在內核空間運行,可以被調度和搶佔。
進程退出:內核釋放其佔有的所有資源,並把這一消息告知父進程,處於僵死狀態,可以保留進程描述符,爲父進程提供信息,父進程可以刪除子進程的進程描述符,當父進程退出時,會給其子進程尋找進程組內的其他進程來作爲父進程,或者之間讓init進程做父進程。這樣不會造成子進程僵死,白白耗費內存。