Linux內核之pid爲0和pid爲1【轉】

(轉自:https://blog.csdn.net/jingyilin2008/article/details/7815508?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159222398219725222455913%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159222398219725222455913&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-7815508.first_rank_v2_rank_v25&utm_term=Linux%E5%86%85%E6%A0%B8%E4%B9%8Bpid%E4%B8%BA0%E5%92%8Cpid%E4%B8%BA1

1. idle是什麼

  簡單的說idle是一個進程,其pid號爲 0。其前身是系統創建的第一個進程,也是唯一一個沒有通過fork()產生的進程。在smp系統中,每個處理器單元有獨立的一個運行隊列,而每個運行隊列上又有一個idle進程,即有多少處理器單元,就有多少idle進程。系統的空閒時間,其實就是指idle進程的"運行時間"。既然是idle是進程,那我們來看看idle是如何被創建,又具體做了哪些事情?

  2. idle的創建

  我們知道系統是從BIOS加電自檢,載入MBR中的引導程序(LILO/GRUB),再加載linux內核開始運行的,一直到指定shell開始運行告一段落,這時用戶開始操作Linux。而大致是在vmlinux的入口startup_32(head.S)中爲pid號爲0的原始進程設置了執行環境,然後原是進程開始執行start_kernel()完成Linux內核的初始化工作。包括初始化頁表,初始化中斷向量表,初始化系統時間等。繼而調用 fork(),創建第一個用戶進程:

  kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

  這個進程就是着名的pid爲1的init進程,它會繼續完成剩下的初始化工作,然後execve(/sbin/init), 成爲系統中的其他所有進程的祖先。關於init我們這次先不研究,回過頭來看pid=0的進程,在創建了init進程後,pid=0的進程調用 cpu_idle()演變成了idle進程。

  current_thread_info()->status |= TS_POLLING;

  在 smp系統中,除了上面剛纔我們講的主處理器(執行初始化工作的處理器)上idle進程的創建,還有從處理器(被主處理器activate的處理器)上的idle進程,他們又是怎麼創建的呢?接着看init進程,init在演變成/sbin/init之前,會執行一部分初始化工作,其中一個就是 smp_prepare_cpus(),初始化SMP處理器,在這過程中會在處理每個從處理器時調用

  task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0);

  init_idle(task, cpu);

  即從init中複製出一個進程,並把它初始化爲idle進程(pid仍然爲0)。從處理器上的idle進程會進行一些Activate工作,然後執行cpu_idle()。

  整個過程簡單的說就是,原始進程(pid=0)創建init進程(pid=1),然後演化成idle進程(pid=0)。init進程爲每個從處理器(運行隊列)創建出一個idle進程(pid=0),然後演化成/sbin/init。

  3. idle的運行時機

  idle 進程優先級爲MAX_PRIO,即最低優先級。早先版本中,idle是參與調度的,所以將其優先級設爲最低,當沒有其他進程可以運行時,纔會調度執行idle。而目前的版本中idle並不在運行隊列中參與調度,而是在運行隊列結構中含idle指針,指向idle進程,在調度器發現運行隊列爲空的時候運行,調入運行。

  小結:

  1.idle是一個進程,其pid爲0。

  2.主處理器上的idle由原始進程(pid=0)演變而來。從處理器上的idle由init進程fork得到,但是它們的pid都爲0。

  3.Idle進程爲最低優先級,且不參與調度,只是在運行隊列爲空的時候才被調度。

  4.Idle循環等待need_resched置位。默認使用hlt節能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章