內核態建立進程使用kernel_thread
,用戶態建立進程使用fork
kernel_thread
會建立 init 進程 和 ktheadd 內核線程就是常說的 1號進程和2號進程html
這二個進程維護系統的全部進程shell
此時1號進程仍是在內核空間。execve
函數把控制器從內核空間切換到用戶空間。
經過加裝用戶空間的應用程序(exec 加裝應用文件),而後 kernel_thread
建立的init
進程,就變成了用戶空間的第一個進程。segmentfault
圖:能夠看出 1號進程和2號進程的父子關係bash
圖:全部進程的父進程,起源都是1號進程和2號進程。併發
1號進程到了用戶態以後,作了什麼: 完成各類初始化函數
init
進程fork
產生的init
進程會轉換爲守護進程前面的部分已經介紹了 1-3 步驟
第四步:1號進程fork一個子進程,啓動getty。 若是用戶登陸了,就會啓動一個login進程,驗證登陸。學習
因此沒有登陸,沒有到第四步的終端,以下圖spa
第五步:啓動一個bash進程,在bash裏面運行shell命令線程
這個特別須要記住
上面集中是 init 服務進程的演變,各有優缺點。code
由於平常不會再想init徹底過程那樣了,在虛擬終端和僞終端,使用了不一樣的演變方式。
好比 sysvinit
經過加載 init.d
文件。
好比咱們在上面的介紹中,託管子進程是 upstart。它能夠併發運行。
虛擬終端中使用的是 :systemd。(廣爲使用的)
咱們在瞭解的時候,不是靠記憶,而是知道它的原理,而後理解就能夠了。
若有不詳,請參考王老師的精彩講解
學習過程當中,得到了極大的知足感,把以前的一些東西串聯了起來。十分感謝 王利濤老師在此表示感謝。PS:本文中全部的資源和圖片均來自視頻中