国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
linux源碼分析--進(jìn)程
http://blog.chinaunix.net/uid-26772321-id-5087189.html
2015

  最近在回想一些知識(shí)點(diǎn)的時(shí)候,覺(jué)得對(duì)進(jìn)程這一塊有些模糊,特別寫(xiě)一篇隨筆對(duì)進(jìn)程信息進(jìn)行鞏固和復(fù)習(xí)。

 

程序和進(jìn)程

  以我個(gè)人的理解就是,程序是一段二進(jìn)制編碼甚至是一個(gè)簡(jiǎn)單的可執(zhí)行文件,而當(dāng)程序這段二進(jìn)制編碼放入內(nèi)存運(yùn)行時(shí),它就會(huì)產(chǎn)生一個(gè)或多個(gè)進(jìn)程。

 

 

CPU時(shí)間片

  對(duì)于CPU來(lái)說(shuō),它的工作就是不停地執(zhí)行指令,而由于CPU執(zhí)行指令的速度非常快,它可以用5ms的時(shí)間專(zhuān)門(mén)用于執(zhí)行進(jìn)程A,5ms的時(shí)間專(zhuān)門(mén)用于執(zhí)行進(jìn)程B,5ms的時(shí)間專(zhuān)門(mén)用于執(zhí)行進(jìn)程C,然后這樣不停交替執(zhí)行進(jìn)程A、B、C。在我們看來(lái)就像進(jìn)程A、B、C在同時(shí)執(zhí)行一樣,而實(shí)際上同一個(gè)時(shí)間點(diǎn)只有一個(gè)進(jìn)程正在CPU上運(yùn)行。

 

 

進(jìn)程描述符

  就是用于描述一個(gè)進(jìn)程的結(jié)構(gòu)體,每個(gè)進(jìn)程有且只有一個(gè)進(jìn)程描述符,它里面包含了這個(gè)進(jìn)程相關(guān)的所有信息。

  1. struct task_struct {

  2.     ......

  3.     /* 進(jìn)程狀態(tài) */
  4.     volatile long state;
  5.     /* 指向內(nèi)核棧 */
  6.     void *stack;
  7.     /* 用于加入進(jìn)程鏈表 */
  8.     struct list_head tasks;
  9.     ......

  10.     /* 指向該進(jìn)程的內(nèi)存區(qū)描述符 */
  11.     struct mm_struct *mm, *active_mm;

  12.     ........

  13.     /* 進(jìn)程ID,每個(gè)進(jìn)程(線程)的PID都不同 */
  14.     pid_t pid;
  15.     /* 線程組ID,同一個(gè)線程組擁有相同的pid,與領(lǐng)頭線程(該組中第一個(gè)輕量級(jí)進(jìn)程)pid一致,保存在tgid中,線程組領(lǐng)頭線程的pid和tgid相同 */
  16.     pid_t tgid;
  17.     /* 用于連接到PID、TGID、PGRP、SESSION哈希表 */
  18.     struct pid_link pids[PIDTYPE_MAX];

  19.     ........

  20.     /* 指向創(chuàng)建其的父進(jìn)程,如果其父進(jìn)程不存在,則指向init進(jìn)程 */
  21.     struct task_struct __rcu *real_parent;
  22.     /* 指向當(dāng)前的父進(jìn)程,通常與real_parent一致 */
  23.     struct task_struct __rcu *parent;

  24.     /* 子進(jìn)程鏈表 */
  25.     struct list_head children;
  26.     /* 兄弟進(jìn)程鏈表 */
  27.     struct list_head sibling;
  28.     /* 線程組領(lǐng)頭線程指針 */
  29.     struct task_struct *group_leader;

  30.     /* 在進(jìn)程切換時(shí)保存硬件上下文(硬件上下文一共保存在3個(gè)地方: TSS(保存內(nèi)核態(tài)堆棧地址,IO許可權(quán)限位),thread_struct(保存大部分CPU寄存器值),內(nèi)核棧(保存eax,ebx,ecx,edx等通用寄存器值)) */
  31.     struct thread_struct thread;

  32.     /* 當(dāng)前目錄 */
  33.     struct fs_struct *fs;

  34.     /* 指向文件描述符,該進(jìn)程所有打開(kāi)的文件會(huì)在這里面的一個(gè)指針數(shù)組里 */
  35.     struct files_struct *files;

  36.     ........

  37.   /* 信號(hào)描述符,用于跟蹤共享掛起信號(hào)隊(duì)列,被屬于同一線程組的所有進(jìn)程共享,也就是同一線程組的線程此指針指向同一個(gè)信號(hào)描述符 */
  38.   struct signal_struct *signal;
  39.   /* 信號(hào)處理函數(shù)描述符 */
  40.   struct sighand_struct *sighand;

  41.   /* sigset_t是一個(gè)位數(shù)組,每種信號(hào)對(duì)應(yīng)一個(gè)位,linux中信號(hào)最大數(shù)是64
  42.    * blocked: 被阻塞信號(hào)掩碼
  43.    * real_blocked: 被阻塞信號(hào)的臨時(shí)掩碼
  44.    */
  45.   sigset_t blocked, real_blocked;
  46.   sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
  47.   /* 私有掛起信號(hào)隊(duì)列 */
  48.   struct sigpending pending;


  49.     ........
  50. }

  這里只截取了部分之后需要說(shuō)明的字段。在內(nèi)核中,會(huì)有一個(gè)進(jìn)程鏈表通過(guò)使用進(jìn)程描述符中的tasks結(jié)構(gòu)把所有進(jìn)程的進(jìn)程鏈表鏈接起來(lái)。

 

 

進(jìn)程內(nèi)核棧

  我們?cè)诰幊痰臅r(shí)候知道,在進(jìn)程地址空間中有個(gè)棧,用于程序的順利執(zhí)行,而當(dāng)程序陷入內(nèi)核態(tài)之后,就不能夠使用應(yīng)用態(tài)的棧了,所以,對(duì)于每個(gè)進(jìn)程,它在內(nèi)核中也有一個(gè)內(nèi)核態(tài)的棧區(qū),在內(nèi)核中,把棧和thread_info(線程描述符)結(jié)構(gòu)結(jié)合起來(lái)放在一起,這塊存儲(chǔ)區(qū)域通常為8192字節(jié),也就是兩個(gè)頁(yè)框。thread_info結(jié)構(gòu)大小為52字節(jié),也就是說(shuō),進(jìn)程的可用的棧大小為8140個(gè)字節(jié)。因?yàn)檫M(jìn)程在內(nèi)核態(tài)中所需要執(zhí)行的代碼量并不算多,所以這個(gè)8K的內(nèi)核棧已經(jīng)足夠使用。在編譯內(nèi)核時(shí)也可以設(shè)置整個(gè)內(nèi)核棧為一個(gè)頁(yè)框大小(4KB),不過(guò)在這種情況下,內(nèi)核在處理硬中斷和軟中斷時(shí)就不使用進(jìn)程的內(nèi)核棧棧,而是使用額外的兩個(gè)個(gè)棧:硬中斷請(qǐng)求棧(每個(gè)CPU一個(gè),大小4K),軟中斷請(qǐng)求棧(每個(gè)CPU一個(gè),大小4K)。不過(guò)值得注意的是,在進(jìn)行異常處理時(shí)還是會(huì)使用進(jìn)程的內(nèi)核棧。


  如上圖可以看到,進(jìn)程的內(nèi)核棧是向下增長(zhǎng)的,也就是棧底在高位地址,棧頂在低位地址。對(duì)于這個(gè)內(nèi)核棧的作用,我們可以總結(jié)一下:

  • 進(jìn)程陷入內(nèi)核后用于代替應(yīng)用層的棧區(qū)進(jìn)行使用。
  • 中斷發(fā)生時(shí)用于保存進(jìn)程上下文現(xiàn)場(chǎng),并且用于中斷嵌套的現(xiàn)場(chǎng)保存和返回。
  • 當(dāng)發(fā)生進(jìn)程切換時(shí),部分寄存器的值會(huì)保存在進(jìn)程的內(nèi)核棧中。
  • thread_info中保存著一些重要的字段用于維持進(jìn)程的正常運(yùn)行。

 


輕量級(jí)進(jìn)程

  linux使用輕量級(jí)進(jìn)程對(duì)多線程應(yīng)用提供支持,其實(shí)它的創(chuàng)建也是基于fork()系統(tǒng)調(diào)用,只是在進(jìn)程描述符的初始化當(dāng)中有所區(qū)別。首先,輕量級(jí)進(jìn)程也是一個(gè)進(jìn)程,它有它自己的pid,有它自己的內(nèi)核棧和進(jìn)程描述符,甚至還有它自己的調(diào)度策略,而輕量級(jí)進(jìn)程和普通進(jìn)程不同的就是它沒(méi)有自己的進(jìn)程地址空間,并且要響應(yīng)線程組內(nèi)其他線程接收到的信號(hào)(但可以通過(guò)修改信號(hào)屏蔽字屏蔽某些信號(hào))。輕量級(jí)進(jìn)程使用的是父進(jìn)程的內(nèi)存地址空間,也就是在task_struct結(jié)構(gòu)中的mm和active_mm指針都指向父進(jìn)程的mm指針?biāo)傅刂?。而信?hào)描述符指針signal會(huì)指向父進(jìn)程指向的地址。而在應(yīng)用層,線程有自己的棧,我想這個(gè)應(yīng)該是由glibc實(shí)現(xiàn)的。

  輕量級(jí)進(jìn)程和普通進(jìn)程區(qū)別:

  • 沒(méi)有自己的進(jìn)程地址空間,使用父進(jìn)程的進(jìn)程地址空間
  • 與組內(nèi)所有進(jìn)程共享信號(hào)

進(jìn)程狀態(tài)

  • TASK_RUNNING:可運(yùn)行狀態(tài),進(jìn)程要么在CPU上執(zhí)行,要么準(zhǔn)備執(zhí)行。
  • TASK_INTERRUPTIBLE:可中斷的等待狀態(tài),進(jìn)程被掛起(睡眠),直到某個(gè)條件為真,產(chǎn)生一個(gè)硬中斷、釋放進(jìn)程正等待的系統(tǒng)資源、或傳遞一個(gè)信號(hào)都是可以喚醒進(jìn)程的條件。
  • TASK_UNINTERRUPTIBLE:不可中斷的等待狀態(tài),與可中斷等待狀態(tài)類(lèi)似,只是不能被信號(hào)喚醒。在一些特殊情況下會(huì)使用,例如:當(dāng)進(jìn)程打開(kāi)一個(gè)設(shè)備文件,設(shè)備驅(qū)動(dòng)會(huì)開(kāi)始探測(cè)相應(yīng)的硬件時(shí)會(huì)用到這種狀態(tài)。
  • TASK_STOPED:暫停狀態(tài),當(dāng)進(jìn)程接收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信號(hào)后進(jìn)入。
  • TASK_TRACED:跟蹤狀態(tài),進(jìn)程執(zhí)行由debugger程序暫停,當(dāng)一個(gè)進(jìn)程被另一個(gè)進(jìn)程監(jiān)控時(shí),任何信號(hào)都可以把這個(gè)進(jìn)程置于TASK_TRACED狀態(tài)。

  還有兩個(gè)狀態(tài)是既可以存放在進(jìn)程描述符的state字段中,也可以存放在exit_state字段中。從這兩個(gè)字段可以看出,只有當(dāng)進(jìn)程執(zhí)行被終止時(shí),進(jìn)程的狀態(tài)才會(huì)為這兩種狀態(tài)中的一種:

  • EXIT_ZOMBIE:僵死狀態(tài),進(jìn)程將被終止,但父進(jìn)程還沒(méi)有發(fā)布wait4()或者waitpid()系統(tǒng)調(diào)用來(lái)返回關(guān)于死亡進(jìn)程的信息。發(fā)布wait()類(lèi)系統(tǒng)調(diào)用之前,內(nèi)核不能丟棄包含在死進(jìn)程描述符中的數(shù)據(jù),因?yàn)楦高M(jìn)程可能還需要它。
  • EXIT_DEAD:僵死撤銷(xiāo)狀態(tài),進(jìn)程被終止后的最終狀態(tài),父進(jìn)程發(fā)布wait4()或者waitpid()系統(tǒng)調(diào)用后,內(nèi)核刪除此進(jìn)程描述符。

 

  對(duì)于一個(gè)普通進(jìn)程,它的執(zhí)行狀態(tài)如下圖所示:


  我們使用一個(gè)簡(jiǎn)單地例子說(shuō)明這種狀態(tài)的轉(zhuǎn)變,我們有個(gè)程序A,它的工作就是做一些計(jì)算,然后把計(jì)算結(jié)構(gòu)寫(xiě)入磁盤(pán)文件中。我們?cè)趕hell中運(yùn)行它,起初它就是TASK_RUNNING狀態(tài),也就是運(yùn)行態(tài),CPU會(huì)不停地分配時(shí)間片供我們的進(jìn)程A運(yùn)行,每次時(shí)間片耗盡后,進(jìn)程A都會(huì)轉(zhuǎn)變到就緒態(tài)(實(shí)際上還是TASK_RUNNING狀態(tài),只是此時(shí)在等待CPU分配時(shí)間片,暫時(shí)不在CPU上運(yùn)行)。當(dāng)進(jìn)程A使用fwrite或write將數(shù)據(jù)寫(xiě)入磁盤(pán)文件時(shí),就會(huì)進(jìn)入阻塞態(tài)(TASK_INTERRUPTIBLE狀態(tài)),而磁盤(pán)將數(shù)據(jù)寫(xiě)入完畢后,會(huì)通過(guò)一個(gè)中斷告知內(nèi)核,內(nèi)核此時(shí)會(huì)將進(jìn)程A的狀態(tài)由阻塞態(tài)(TASK_INTERRUPTIBLE)轉(zhuǎn)變?yōu)榫途w態(tài)(TASK_RUNNING)等待CPU分配時(shí)間片運(yùn)行。而最后當(dāng)進(jìn)程A需要退出時(shí),內(nèi)核先會(huì)將其設(shè)置為僵死狀態(tài)(EXIT_ZOMBIE),這時(shí)候它所使用的內(nèi)存已經(jīng)被釋放,只保留了一個(gè)進(jìn)程描述符供父進(jìn)程使用,最后當(dāng)父進(jìn)程(也就是我們起初啟動(dòng)它的shell)通過(guò)wait()類(lèi)系統(tǒng)調(diào)用通知內(nèi)核后,內(nèi)后會(huì)將進(jìn)程A設(shè)置為僵死撤銷(xiāo)狀態(tài)(EXIT_DEAD),并釋放其進(jìn)程描述符。到這里進(jìn)程A的整個(gè)運(yùn)行周期完整結(jié)束。

 

 

PID和tgid字段

  PID是一個(gè)數(shù)字,用于標(biāo)識(shí)一個(gè)進(jìn)程,就像學(xué)生的學(xué)號(hào)一樣,每個(gè)進(jìn)程都有一個(gè)唯一的編號(hào),保存在進(jìn)程描述符的pid字段中。一般的,在系統(tǒng)運(yùn)行期間,PID都是被順序編號(hào),比如進(jìn)程A的PID為10,那下個(gè)創(chuàng)建的進(jìn)程的PID則為11。不過(guò)PID的值有一個(gè)上限,當(dāng)內(nèi)核使用的PID達(dá)到這個(gè)上限后就會(huì)循環(huán)開(kāi)始找已閑置的小PID號(hào)。在缺省狀態(tài)下,最大PID值為32767(PID_MAX_DEFAULT - 1);可以通過(guò)修改/proc/sys/kernel/pid_max這個(gè)文件來(lái)減小PID上限值。而在64位系統(tǒng)中,PID可擴(kuò)大到4194303。

  內(nèi)核是通過(guò)一個(gè)叫pidmap的位圖來(lái)管理已分配的PID號(hào)和閑置的PID號(hào)。在32位系統(tǒng)中,pidmap的大小就是一個(gè)頁(yè)框的大小(4KB),而一個(gè)頁(yè)框大小為32768位,也就是每一位代表一個(gè)PID號(hào),1代表此PID已經(jīng)被分配,0代表此PID號(hào)未被使用;而在64位系統(tǒng)下,pidmap會(huì)使用多個(gè)頁(yè)框。

  在POSIX標(biāo)準(zhǔn)中規(guī)定了一個(gè)多線程應(yīng)用程序中所有的線程都必須有相同的PID,在linux內(nèi)核中,是使用輕量級(jí)進(jìn)程實(shí)現(xiàn)線程的功能,但是輕量級(jí)進(jìn)程也是一個(gè)進(jìn)程,他們的PID都不相同,為了實(shí)現(xiàn)這一點(diǎn),內(nèi)核在進(jìn)程描述符中引入了tgid字段。在linux的線程組概念中,一個(gè)線程組中所有線程使用的該線程組領(lǐng)頭線程相同的PID,也就是該組第一個(gè)輕量級(jí)進(jìn)程的PID,并保存到進(jìn)程描述符的tgid字段中,如下圖:


  在編程過(guò)程中,我們使用的getpid()函數(shù)返回的值其實(shí)是當(dāng)前進(jìn)程的tgid而不是pid的值,而由于線程組中領(lǐng)頭線程和pid和tgid相同,因而getpid()對(duì)這類(lèi)進(jìn)程所起到的作用和一般進(jìn)程是一樣的。

  接下來(lái)說(shuō)說(shuō)內(nèi)核如何將所有的PID和進(jìn)程描述符組織在一起,方便系統(tǒng)查找和使用。在系統(tǒng)運(yùn)行過(guò)程中,可能會(huì)有成百上千的進(jìn)程在運(yùn)行,這時(shí)候進(jìn)程的查找效率就至關(guān)重要了,比如系統(tǒng)管理員使用kill 1024命令去終止PID=1024的進(jìn)程,內(nèi)核會(huì)從這個(gè)PID導(dǎo)出對(duì)應(yīng)的進(jìn)程描述符進(jìn)行處理。內(nèi)核為了提高查找效率,專(zhuān)門(mén)使用了4個(gè)哈希表用于索引進(jìn)程描述符。為什么要4個(gè),因?yàn)槲覀兛梢杂胮id、tgid、pgrp、session去找進(jìn)程,這幾個(gè)哈希表說(shuō)明如下:


  在內(nèi)核中,這四個(gè)哈希表一共占16個(gè)頁(yè)框,也就是每個(gè)哈希表占4個(gè)頁(yè)框,他們每個(gè)可以擁有2048個(gè)表項(xiàng),內(nèi)核會(huì)把把這四個(gè)哈希表的地址保存到pid_hash數(shù)組中?,F(xiàn)在問(wèn)題來(lái)了,拿pid的哈希表為例,怎么在2048個(gè)表項(xiàng)中保存32767個(gè)PID值,其實(shí)內(nèi)核會(huì)對(duì)每個(gè)已經(jīng)分配的PID值進(jìn)行一個(gè)處理,得到的結(jié)果的數(shù)值就是對(duì)應(yīng)的表項(xiàng),處理結(jié)果相同的PID被串成一個(gè)鏈表,如下:


  當(dāng)我們使用kill 29384命令時(shí),內(nèi)核會(huì)根據(jù)29384處理得出199,然后以199為下標(biāo),獲取PID哈希表中對(duì)應(yīng)的鏈表頭,并在此鏈表中找出PID=29384的進(jìn)程。進(jìn)程描述符中使用struct pid_link pids[PIDTYPE_MAX]鏈入這四個(gè)哈希表。對(duì)于另外三個(gè)哈希表,道理一樣。

 

進(jìn)程間關(guān)系

  在系統(tǒng)中,除了進(jìn)程0,一個(gè)進(jìn)程是由另一個(gè)進(jìn)程創(chuàng)建,它們都具有父子關(guān)系。如果一個(gè)進(jìn)程創(chuàng)建多個(gè)子進(jìn)程,則子進(jìn)程之間有兄弟關(guān)系。在整個(gè)系統(tǒng)啟動(dòng)期間,會(huì)初始化系統(tǒng)的第一個(gè)進(jìn)程init_task,這個(gè)進(jìn)程屬于內(nèi)核中的一個(gè)進(jìn)程,它算是所有進(jìn)程的祖先,之后它會(huì)啟動(dòng)PID為1的init進(jìn)程和PID為2的kthreadd,這兩個(gè)進(jìn)程之后啟動(dòng)的所有進(jìn)程,而init_task之后會(huì)轉(zhuǎn)變?yōu)橐粋€(gè)idle進(jìn)程用于CPU空閑時(shí)運(yùn)行。在進(jìn)程描述符中,使用real_parent、parent、children、sibling這幾個(gè)指針將進(jìn)程關(guān)系組織在一起,我們看看這幾個(gè)指針的說(shuō)明:


  而如果一個(gè)進(jìn)程P0創(chuàng)建了進(jìn)程P1、P2、P3,進(jìn)程P3又創(chuàng)建了進(jìn)程P4,它們整個(gè)鏈表情況是這樣的


組織進(jìn)程

  所有處于TASK_RUNNING狀態(tài)的進(jìn)程都會(huì)被放入CPU的運(yùn)行隊(duì)列,它們有可能在不同CPU的運(yùn)行隊(duì)列中。

  系統(tǒng)沒(méi)有為T(mén)ASK_STOPED、EXIT_ZOMBIE和EXIT_DEAD狀態(tài)的進(jìn)程建立專(zhuān)門(mén)的鏈表,因?yàn)樘幱谶@些狀態(tài)的進(jìn)程訪問(wèn)比較簡(jiǎn)單,可通過(guò)PID和通過(guò)特定父進(jìn)程的子進(jìn)程鏈表進(jìn)行訪問(wèn)。

  所有TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE都會(huì)被放入相應(yīng)的等待隊(duì)列,系統(tǒng)中有很多種等待隊(duì)列,有些是等待磁盤(pán)操作的終止,有些是等待釋放系統(tǒng)資源,有些是等待時(shí)間經(jīng)過(guò)固定的間隔,每個(gè)等待隊(duì)列它的喚醒條件不同,比如等待隊(duì)列1是等待系統(tǒng)釋放資源A的,等待隊(duì)列2是等待系統(tǒng)釋放資源B的。因此,等待隊(duì)列表示一組睡眠進(jìn)程,當(dāng)某一條件為真時(shí),由內(nèi)核喚醒這條等待隊(duì)列上的進(jìn)程。我們看看內(nèi)核中一個(gè)簡(jiǎn)單的sleep_on()函數(shù):


  1. /* wq為某個(gè)等待隊(duì)列的隊(duì)列頭 */
  2. void sleep_on (wait_queue_head_t *wq)
  3. {
  4.     /* 聲明一個(gè)等待隊(duì)列結(jié)點(diǎn) */
  5.     wait_queue_t wait;

  6.     /* 用當(dāng)前進(jìn)程初始化這個(gè)等待隊(duì)列結(jié)點(diǎn) */
  7.     init_waitqueue_entry (&wait, current);

  8.     /* 設(shè)置當(dāng)前進(jìn)程狀態(tài)為T(mén)ASK_UNINTERRUPTIBLE */
  9.     current->state = TASK_UNINTERRUPTIBLE;

  10.     /* 將這個(gè)代表著當(dāng)前進(jìn)程的等待隊(duì)列結(jié)點(diǎn)加入到wq這個(gè)等待隊(duì)列 */
  11.     add_wait_queue (wq, &wait);

  12.     /* 請(qǐng)求調(diào)度器進(jìn)行調(diào)度,執(zhí)行完schedule后進(jìn)程會(huì)被移除CPU運(yùn)行隊(duì)列,只有等待隊(duì)列喚醒后才會(huì)重新回到CPU運(yùn)行隊(duì)列 */
  13.     schedule ();

  14.     /* 這里進(jìn)程已經(jīng)被等待隊(duì)列喚醒,重新移到CPU運(yùn)行隊(duì)列,也就是等待的條件已經(jīng)為真,喚醒后第一件事就是將自己從等待隊(duì)列wq中移除 */
  15.     remove_wait_queue (wq, &wait);
  16. }
  這時(shí)候又有一個(gè)問(wèn)題,比如有等待隊(duì)列是等待系統(tǒng)釋放資源A,而等待隊(duì)列中所有的進(jìn)程都是希望能夠占有這個(gè)資源A的,就像我們編程中用到的信號(hào)量,這時(shí)候系統(tǒng)的做法不是將這個(gè)等待隊(duì)列中所有的進(jìn)程都進(jìn)行喚醒,而是只喚醒一個(gè)。內(nèi)核區(qū)分這種互斥進(jìn)程的原理就是這個(gè)等待隊(duì)列中所有的等待隊(duì)列結(jié)點(diǎn)wait_queue_t中的flags被設(shè)置為1(默認(rèn)是0)。










本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux系統(tǒng)分析之進(jìn)程
進(jìn)程(一):進(jìn)程描述
linux內(nèi)核分析筆記----進(jìn)程管理
linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(四):1.進(jìn)程管理的相關(guān)概念
linux進(jìn)程描述符
Linux2.4內(nèi)核說(shuō)明文檔(進(jìn)程與中斷管理篇)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服