因此Linux的作法是(TODO 這一塊還不是很明白)node
進程描述符是一個數據結構(c的struct,相似Python的字典)linux
進程描述符裏面有特定的字段,記錄每一個進程的父進程,兄弟進程和子進程redis
有時候內核須要根據pid來獲取進程描述符
因此內核會保存一個pidhash數據結構,是個hash表(c裏面的hash表的實現和redis的hash表實現相似),key是pid,value是進程描述符緩存
進程切換,任務切換,上下文切換是同樣的數據結構
每一個進程都有本身的地址空間(在內存),可是進程之間是共享寄存器的,因此進程的切換須要(硬件上下文是寄存器的數據):併發
上面的操做使用一個switch_to宏來實現,傳入參數prev,next,prev。傳入兩次prev是怕切換上下文後,把第一個prev丟了。異步
Linux進程的特性:socket
建立進程的系統調用:函數
close()ui
vfork close函數的封裝
內核進程是一直運行在內核態的
進程0
進程0是linux啓動後的第一個進程,由它建立進程1
進程1
進程1也叫init進程,進程1會一直運行知道linux關閉
進程執行完指定的代碼後,就會終止,這時必須通知內核回收進程的資源。
通常是exit系統調用,c編譯程序會本身動把exit函數插入到main函數最後
內核能夠強迫整個線程組死掉(例如收到kill -9)
進程刪除 當進程終止後,進程會進入僵死狀態,直到父進程調用wait4來獲取進程的狀態數據,而後進程就會被刪除。 若是父進程已經不存在,進程會交給init進程託管,init進程會按期執行wait4命令來查看進程的狀態,若是進程已經終止,就會刪除這個進程