成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分析linux內(nèi)核的idle的知識(shí)

系統(tǒng) Linux
Linux系統(tǒng)越來(lái)越受到電腦用戶的歡迎,于是很多人開(kāi)始學(xué)習(xí)Linux時(shí),學(xué)習(xí)linux,你可能會(huì)遇到linux內(nèi)核問(wèn)題,這里將介紹linux內(nèi)核中idle知識(shí),在這里拿出來(lái)和大家分享一下。

Linux系統(tǒng)越來(lái)越受到電腦用戶的歡迎,于是很多人開(kāi)始學(xué)習(xí)Linux時(shí),學(xué)習(xí)linux,你可能會(huì)遇到linux內(nèi)核問(wèn)題,這里將介紹linux內(nèi)核中idle知識(shí),在這里拿出來(lái)和大家分享一下。

1. idle是什么
簡(jiǎn)單的說(shuō)idle是一個(gè)進(jìn)程,其pid號(hào)為 0。其前身是系統(tǒng)創(chuàng)建的第一個(gè)進(jìn)程,也是唯一一個(gè)沒(méi)有通過(guò)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)程,那我們來(lái)看看idle是如何被創(chuàng)建,又具體做了哪些事情?

2. idle的創(chuàng)建
我們知道系統(tǒng)是從BIOS加電自檢,載入MBR中的引導(dǎo)程序(LILO/GRUB),再加載linux內(nèi)核開(kāi)始運(yùn)行的,一直到指定shell開(kāi)始運(yùn)行告一段落,這時(shí)用戶開(kāi)始操作Linux。而大致是在vmlinux的入口startup_32(head.S)中為pid號(hào)為0的原始進(jìn)程設(shè)置了執(zhí)行環(huán)境,然后原是進(jìn)程開(kāi)始執(zhí)行start_kernel()完成Linux內(nèi)核的初始化工作。包括初始化頁(yè)表,初始化中斷向量表,初始化系統(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我們這次先不研究,回過(guò)頭來(lái)看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處理器,在這過(guò)程中會(huì)在處理每個(gè)從處理器時(shí)調(diào)用
task = copy_process(CLONE_VM, 0, idle_regs(&regs), 0, NULL, NULL, 0);
init_idle(task, cpu);
即從init中復(fù)制出一個(gè)進(jìn)程,并把它初始化為idle進(jìn)程(pid仍然為0)。從處理器上的idle進(jìn)程會(huì)進(jìn)行一些Activate工作,然后執(zhí)行cpu_idle()。

整個(gè)過(guò)程簡(jiǎn)單的說(shuō)就是,原始進(jìn)程(pid=0)創(chuàng)建init進(jìn)程(pid=1),然后演化成idle進(jìn)程(pid=0)。init進(jìn)程為每個(gè)從處理器(運(yùn)行隊(duì)列)創(chuàng)建出一個(gè)idle進(jìn)程(pid=0),然后演化成/sbin/init。

3. idle的運(yùn)行時(shí)機(jī)
idle 進(jìn)程優(yōu)先級(jí)為MAX_PRIO,即最低優(yōu)先級(jí)。早先版本中,idle是參與調(diào)度的,所以將其優(yōu)先級(jí)設(shè)為最低,當(dāng)沒(méi)有其他進(jìn)程可以運(yùn)行時(shí),才會(huì)調(diào)度執(zhí)行idle。而目前的版本中idle并不在運(yùn)行隊(duì)列中參與調(diào)度,而是在運(yùn)行隊(duì)列結(jié)構(gòu)中含idle指針,指向idle進(jìn)程,在調(diào)度器發(fā)現(xiàn)運(yùn)行隊(duì)列為空的時(shí)候運(yùn)行,調(diào)入運(yùn)行。

4. idle的workload
從上面的分析我們可以看出,idle在系統(tǒng)沒(méi)有其他就緒的進(jìn)程可執(zhí)行的時(shí)候才會(huì)被調(diào)度。不管是主處理器,還是從處理器,最后都是執(zhí)行的cpu_idle()函數(shù)。所以我們來(lái)看看cpu_idle做了什么事情。
因?yàn)閕dle進(jìn)程中并不執(zhí)行什么有意義的任務(wù),所以通常考慮的是兩點(diǎn):1.節(jié)能,2.低退出延遲。
其核心代碼如下:

  1. void cpu_idle(void)  
  2. {  
  3.  int cpu = smp_processor_id();  
  4.  
  5.  current_thread_info()->status |= TS_POLLING;  
  6.  
  7.  /* endless idle loop with no priority at all */  
  8.  while (1) {  
  9.   tick_nohz_stop_sched_tick(1);  
  10.   while (!need_resched()) {  
  11.  
  12.    check_pgt_cache();  
  13.    rmb();  
  14.  
  15.    if (rcu_pending(cpu))  
  16.     rcu_check_callbacks(cpu, 0);  
  17.  
  18.    if (cpu_is_offline(cpu))  
  19.     play_dead();  
  20.  
  21.    local_irq_disable();  
  22.    __get_cpu_var(irq_stat).idle_timestamp = jiffies;  
  23.    /* Don't trace irqs off for idle */  
  24.    stop_critical_timings();  
  25.    pm_idle();  
  26.    start_critical_timings();  
  27.   }  
  28.   tick_nohz_restart_sched_tick();  
  29.   preempt_enable_no_resched();  
  30.   schedule();  
  31.   preempt_disable();  
  32.  }  
  33. }  

循環(huán)判斷need_resched以降低退出延遲,用idle()來(lái)節(jié)能。
默認(rèn)的idle實(shí)現(xiàn)是hlt指令,hlt指令使CPU處于暫停狀態(tài),等待硬件中斷發(fā)生的時(shí)候恢復(fù),從而達(dá)到節(jié)能的目的。即從處理器C0態(tài)變到C1態(tài)(見(jiàn) ACPI標(biāo)準(zhǔn))。這也是早些年windows平臺(tái)上各種"處理器降溫"工具的主要手段。當(dāng)然idle也可以是在別的ACPI或者APM模塊中定義的,甚至是自定義的一個(gè)idle(比如說(shuō)nop)。

小結(jié):
1.idle是一個(gè)進(jìn)程,其pid為0。
2.主處理器上的idle由原始進(jìn)程(pid=0)演變而來(lái)。從處理器上的idle由init進(jìn)程fork得到,但是它們的pid都為0。
3.Idle進(jìn)程為最低優(yōu)先級(jí),且不參與調(diào)度,只是在運(yùn)行隊(duì)列為空的時(shí)候才被調(diào)度。
4.Idle循環(huán)等待need_resched置位。默認(rèn)使用hlt節(jié)能。

希望通過(guò)本文你能全面了解linux內(nèi)核中idle知識(shí)。

【編輯推薦】

  1. 詳解Linux系統(tǒng)修改環(huán)境變量PATH路徑的方法
  2. Linux里防范arp病毒攻擊
  3. Linux Opera輕松應(yīng)用scim
  4. 輕松完成Linux安裝Flash Media Server
  5. 闡述Linux系統(tǒng)時(shí)鐘同步服務(wù)NTPD配置技巧
責(zé)任編輯:小霞 來(lái)源: 電子工業(yè)出版社
相關(guān)推薦

2014-07-29 15:44:33

Linux內(nèi)核Crash

2023-04-28 08:42:08

Linux內(nèi)核SPI驅(qū)動(dòng)

2009-06-19 20:32:00

Linux

2017-08-16 16:20:01

Linux內(nèi)核態(tài)搶占用戶態(tài)搶占

2021-09-06 07:45:08

LinuxLinux內(nèi)核

2021-09-28 07:12:09

Linux內(nèi)核入口

2013-11-05 09:58:39

Linux內(nèi)核

2013-11-12 11:01:46

Linux內(nèi)核

2013-11-06 13:03:10

Linux內(nèi)核

2013-11-25 14:07:11

Linux內(nèi)核內(nèi)核特性

2013-11-07 13:59:56

Linux內(nèi)核

2017-04-12 14:30:45

Linux內(nèi)核DebugFS

2011-01-11 13:45:06

2017-03-17 15:05:05

Linux內(nèi)核源碼do_fork

2013-05-13 09:52:52

Windows內(nèi)核Linux內(nèi)核

2010-05-05 13:13:55

Unix內(nèi)核

2013-11-05 09:55:37

2013-10-31 14:09:14

Linux內(nèi)核

2009-10-16 09:45:41

Linux內(nèi)核操作系統(tǒng)

2022-02-15 14:53:38

Linux內(nèi)核API
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精精精精xxxx免费视频 | 国产日韩欧美精品 | julia中文字幕久久一区二区 | 国产中文字幕在线观看 | 午夜合集 | 亚洲高清在线 | 伊人焦久影院 | 国产超碰人人爽人人做人人爱 | 日韩一区二区在线视频 | 欧美一区二区免费 | 欧美激情综合 | 久久精品亚洲精品 | 91精品国产一区二区在线观看 | 欧美在线看片 | 日本三级电影在线观看视频 | 欧美日韩在线不卡 | 一区二区免费 | 97国产精品视频 | 成人在线播放 | 99re6在线视频精品免费 | 国产精品毛片无码 | 中文字幕在线第一页 | 免费看黄色片 | 日韩一级一区 | 自拍 亚洲 欧美 老师 丝袜 | 91视频免费黄 | av黄色在线 | 一级毛片视频 | 91久久精品一区二区二区 | 日本aa毛片a级毛片免费观看 | 日本精品一区二区在线观看 | 亚洲一区二区在线播放 | 国产精品资源在线观看 | 久久综合一区 | 国产精品三级 | 精品久久久久久久久久久下田 | 一区二区三区在线免费看 | 日韩一区二区三区视频在线播放 | 中文字幕一区在线观看视频 | 一级a爱片性色毛片免费 | 国产精品久久国产精品 |