linux内核杂记(3)-进程(2)
1、進程狀態
(1)進程描述 符中的state域 描述了進程的當前 狀態 ,一共為5種之一:
TASK_RUNNNG(運行),TASK_INTERRUPTIBLE(可中斷),TASK_UNITERRUPTIBLE,(不可中斷進程必須在等待時不受干擾 或等待事件 很快會發生時出現)_TASK_TRACED(被其他進程跟蹤的進程),_ASK_STOPPED(進程停止 運行)
2、將指定 進程設為某種狀態。
set_current_state(state)和set_task_state(curent,state)
3、進程家庭樹
unix系統的進程 之間存在在一個明顯的繼承,在LINUX系統中也是如此,所有進程都是PID為1的init進程的后代。每個 task_struct都有一個指向父進程task_struct的parent的指針,包含一個children的子進程鏈表。
而init的進程符是init_task靜態分配的。
因為任務 隊列本來主濁一個雙向的循環鏈表。
這2個過程分別通過next_task(task)宏和prev_task(task)宏實現。for_each_process(task)宏提供了依次訪問整個任務隊列的能力 。
一個擁有大量進程的系統中通過重復遍歷所有的進程代價是巨大的。
4、進程創建
傳統的fork()系統調用直接把所有資源復制給新創建的進程,而linux的fork使用寫時拷貝頁來實現 ,讓父進程與子進程共享 一個數據拷貝,直到需要寫入時,數據才被復制,因數如果fork后,立即exec(讀取可執行文件將其載入地址空間開始運行),則不需要復制,實際只是復制了父進程的頁表和給子進程創建唯一的進程描述符。
clone系統調用實現 fork()
do_fork完成了創建中的大部分工作 ,定義在kernel/fork,c中。調用 copy_process函數,
(1)調用 dup_ task_struct()為新進程創建一個內核棧、thread_info結構和task_sruct,這些值與當前進程的值相同。子進程與父進程的描述符是完全相同的。
(2)檢查并確保新創建 這個子進程后,用戶所擁有的進程數目沒有超過給它分配的資源的限制。
(3)子進程著手使自己與父進程區別,進程描述符內許多成員清0
(4)子進程狀態 被 設為TASK_UNITERRUPTIBLE,保證不能運行,因為后續還需要繼續設置
(5)調用 copy_flags更新 task_sruct的flags成員。
(6)調用 alloc_pid()為新進程分配一個有效的PID
(7)根據傳遞給clone() 的參數標志,拷貝和共享 文件系統信息、信號 處理函數、進程地址空間等,以供進程內所有線程共享。
(8)收尾工作 ,并返回一個指向子進程的指針。
此外,vfork和fork功能相同 ,但不拷貝進程的頁表。了進程 在父進程的線程內運行,父進程被阻塞,直至子進程退出或執行exec。
總結
以上是生活随笔為你收集整理的linux内核杂记(3)-进程(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL + MyBatis 批量插入
- 下一篇: linux内核杂记(4)-线程(1)