1. idle是什么 簡單的說idle是一個(gè)進(jìn)程,其pid號(hào)為0,。其前身是系統(tǒng)創(chuàng)建的第一個(gè)進(jìn)程,,也是唯一一個(gè)沒有通過fork()產(chǎn)生的進(jìn)程。在smp系統(tǒng)中,,每個(gè)處理器單元有獨(dú)立的一個(gè)運(yùn)行隊(duì)列,,而每個(gè)運(yùn)行隊(duì)列上又有一個(gè)idle進(jìn)程,即有多少處理器單元,,就有多少idle進(jìn)程,。系統(tǒng)的空閑時(shí)間,其實(shí)就是指idle進(jìn)程的'運(yùn)行時(shí)間',。既然是idle是進(jìn)程,,那我們來看看idle是如何被創(chuàng)建,,又具體做了哪些事情? 2. idle的創(chuàng)建 我們知道系統(tǒng)是從BIOS加電自檢,,載入MBR中的引導(dǎo)程序(LILO/GRUB),再加載linux內(nèi)核開始運(yùn)行的,,一直到指定shell開始運(yùn)行告一段落,這時(shí)用戶開始操作Linux,。而大致是在vmlinux的入口startup_32(head.S)中為pid號(hào)為0的原始進(jìn)程設(shè)置了執(zhí)行環(huán)境,,然后原是進(jìn)程開始執(zhí)行start_kernel()完成Linux內(nèi)核的初始化工作。包括初始化頁表,,初始化中斷向量表,,初始化系統(tǒng)時(shí)間等。繼而調(diào)用fork(),創(chuàng)建第一個(gè)用戶進(jìn)程: kernel_thread(kernel_init, NULL, CLONE_FS |CLONE_SIGHAND); 這個(gè)進(jìn)程就是著名的pid為1的init進(jìn)程,,它會(huì)繼續(xù)完成剩下的初始化工作,,然后execve(/sbin/init),成為系統(tǒng)中的其他所有進(jìn)程的祖先。關(guān)于init我們這次先不研究,,回過頭來看pid=0的進(jìn)程,,在創(chuàng)建了init進(jìn)程后,pid=0的進(jìn)程調(diào)用cpu_idle()演變成了idle進(jìn)程,。 current_thread_info()->status |=TS_POLLING; 在smp系統(tǒng)中,,除了上面剛才我們講的主處理器(執(zhí)行初始化工作的處理器)上idle進(jìn)程的創(chuàng)建,還有從處理器(被主處理器activate的處理器)上的idle進(jìn)程,,他們又是怎么創(chuàng)建的呢,?接著看init進(jìn)程,init在演變成/sbin/init之前,,會(huì)執(zhí)行一部分初始化工作,,其中一個(gè)就是smp_prepare_cpus(),初始化SMP處理器,,在這過程中會(huì)在處理每個(gè)從處理器時(shí)調(diào)用 task =copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); init_ |
|