linux 0號進程 1號進程 區別(轉)


 系統允許一個進程創建新進程,新進程即為子進程,子進程還可以創建新的子進程,形成進程樹結構模型。整個linux系統的所有進程也是一個樹形結構。樹根是系統自動構造的,即在內核態下執行的0號進程,它是所有進程的祖先。由0號進程創建1號進程(內核態),1號負責執行內核的部分初始化工作及進行系統配置,並創建若干個用於高速緩存和虛擬主存管理的內核線程。隨后,1號進程調用execve()運行可執行程序init,並演變成用戶態1號進程,即init進程。它按照配置文件/etc/initab的要求,完成系統啟動工作,創建編號為1號、2號...的若干終端注冊進程getty。

        每個getty進程設置其進程組標識號,並監視配置到系統終端的接口線路。當檢測到來自終端的連接信號時,getty進程將通過函數execve()執行注冊程序login,此時用戶就可輸入注冊名和密碼進入登錄過程,如果成功,由login程序再通過函數execv()執行shell,該shell進程接收getty進程的pid,取代原來的getty進程。再由shell直接或間接地產生其他進程。

 

  上述過程可描述為:0號進程->1號內核進程->1號用戶進程(init進程)->getty進程->shell進程

   注意,上述過程描述中提到:1號內核進程調用執行init並演變成1號用戶態進程(init進程),這里前者是init是函數,后者是進程。兩者容易混淆,區別如下:

   1.init()函數在內核態運行,是內核代碼

   2.init進程是內核啟動並運行的第一個用戶進程,運行在用戶態下。

   3.一號內核進程調用execve()從文件/etc/inittab中加載可執行程序init並執行,這個過程並沒有使用調用do_fork(),因此兩個進程都是1號進程。

 轉自:http://blog.csdn.net/yjzl1911/article/details/5613569


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM