
進(jìn)程類(lèi)似于人類(lèi):他們被產(chǎn)生,有或多或少有效的生命,可以產(chǎn)生一個(gè)或多個(gè)子進(jìn)程,最終都要死亡。一個(gè)微小的差異是進(jìn)程之間沒(méi)有性別差異——每個(gè)進(jìn)程只有一個(gè)父親。

從內(nèi)核的觀(guān)點(diǎn)來(lái)看:進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源的實(shí)體(CPU時(shí)間、內(nèi)存等資源)。
實(shí)現(xiàn)多線(xiàn)程應(yīng)用的一個(gè)簡(jiǎn)單的方式是把輕量級(jí)進(jìn)程與每個(gè)線(xiàn)程關(guān)聯(lián)起來(lái)。這樣線(xiàn)程之間就可以通過(guò)簡(jiǎn)單的共享同一內(nèi)存地址空間、同一打開(kāi)文件集等來(lái)訪(fǎng)問(wèn)相同的應(yīng)用數(shù)據(jù)結(jié)構(gòu)集;同時(shí)每個(gè)線(xiàn)程都可以由內(nèi)核獨(dú)立調(diào)度,以便一個(gè)睡眠的同時(shí)另一個(gè)仍然是可運(yùn)行的。(共享內(nèi)存地址、內(nèi)核獨(dú)立調(diào)度)。
進(jìn)程描述符
進(jìn)程描述符都是task_struct類(lèi)型結(jié)構(gòu),它的字段包含了一個(gè)進(jìn)程相關(guān)的所有信息。
進(jìn)程狀態(tài)
進(jìn)程描述符的state字段描述了進(jìn)程當(dāng)前所處的狀態(tài)。它由一組標(biāo)志組成,其中每個(gè)標(biāo)志描述一種可能的進(jìn)程狀態(tài)。在當(dāng)前l(fā)inux版本中,這些狀態(tài)是互斥的,只能設(shè)置一種狀態(tài);其余的標(biāo)志將被清除。
1、可運(yùn)行TASK_RUNNING 進(jìn)程在CPU上要么正在執(zhí)行,要么準(zhǔn)備執(zhí)行
2、可中斷TASK_INTERUPTIBLE 進(jìn)程被掛起,直到達(dá)到某個(gè)條件。產(chǎn)生一個(gè)硬件中斷,釋放進(jìn)程正等待的系統(tǒng)資源,或傳遞一個(gè)信號(hào)都是可以喚醒進(jìn)程的條件。
3、不可中斷 TASK_UNINTERUPTIBLE 與可中斷狀態(tài)類(lèi)似,但是把信號(hào)傳遞到不可中斷狀態(tài)進(jìn)程時(shí)不能改變其狀態(tài)。例如,當(dāng)進(jìn)程打開(kāi)一個(gè)設(shè)備文件,其相應(yīng)的設(shè)備驅(qū)動(dòng)程序開(kāi)始探測(cè)相應(yīng)的硬件設(shè)備時(shí)會(huì)用到這種狀態(tài)。探測(cè)完成之前,設(shè)備驅(qū)動(dòng)程序不能被中斷,否則,硬件設(shè)備會(huì)處于不可預(yù)知的狀態(tài)。
4、暫停狀態(tài)TASK_STOPPED 進(jìn)程的執(zhí)行被暫停。當(dāng)進(jìn)程受到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信號(hào)后進(jìn)入暫停狀態(tài)
5、TASK_TRACED跟蹤狀態(tài) 進(jìn)程的執(zhí)行已經(jīng)有debugger程序暫停。
以下兩個(gè)進(jìn)程狀態(tài)既可以存放到state字段又可以存放到exit_state字段
6、僵死狀態(tài)(EXIT_ZOMBLE) 進(jìn)程的執(zhí)行被終止,但是父進(jìn)程還沒(méi)有發(fā)布wait4()或waitpid()系統(tǒng)調(diào)用來(lái)返回有關(guān)死亡進(jìn)程的信息。
7、僵死撤銷(xiāo)狀態(tài)(EXIT_DEAD) 最終狀態(tài):由于父進(jìn)程剛發(fā)出wait4()系統(tǒng)調(diào)用,因而進(jìn)程由系統(tǒng)刪除。為了防止其他執(zhí)行線(xiàn)程在同一個(gè)進(jìn)程上也執(zhí)行wait()類(lèi)系統(tǒng)調(diào)用而產(chǎn)生競(jìng)爭(zhēng)條件,而把僵死狀態(tài)改為撤銷(xiāo)狀態(tài)。
標(biāo)識(shí)一個(gè)進(jìn)程
由于循環(huán)使用PID編號(hào),內(nèi)核必須通過(guò)管理一個(gè)pidmap_array的位圖來(lái)標(biāo)識(shí)當(dāng)前已經(jīng)分配的pid號(hào)和閑置的pid號(hào)。因?yàn)橐粋€(gè)頁(yè)框包含4*1024*8個(gè)位,所以32位體系結(jié)構(gòu)中pidmap_array位圖存放在一個(gè)單獨(dú)的頁(yè)中。一個(gè)多線(xiàn)程應(yīng)用中的所有線(xiàn)程都必須有相同的pid。Linux引入線(xiàn)程組:一個(gè)線(xiàn)程組中的所有線(xiàn)程使用和該線(xiàn)程組領(lǐng)頭線(xiàn)程相同的pid。它被存入進(jìn)程描述符的tgid字段中。getpid()系統(tǒng)調(diào)用返回當(dāng)前進(jìn)程的tgid值而不是pid值。
進(jìn)程描述符處理
對(duì)每個(gè)進(jìn)程來(lái)說(shuō),Linux都把兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu)緊湊的放在一個(gè)單獨(dú)為進(jìn)程分配的存儲(chǔ)區(qū)域中:一個(gè)是與進(jìn)程描述符相關(guān)的小數(shù)據(jù)結(jié)構(gòu)thread_Info,一個(gè)是內(nèi)核態(tài)的進(jìn)程堆棧。這塊存儲(chǔ)區(qū)域的大小一般為2頁(yè)。考慮到效率的因素,內(nèi)核讓這個(gè)8k空間占連續(xù)兩個(gè)頁(yè)框并讓第一個(gè)頁(yè)框的起始地址是2^13的倍數(shù)。
因?yàn)閮?nèi)核控制路徑使用很少的棧,因此只需要幾千個(gè)字節(jié)的內(nèi)核態(tài)堆棧。對(duì)已,對(duì)棧和thread_info來(lái)說(shuō),8k足夠了。
thread_info存放在這個(gè)8k內(nèi)存區(qū)域的開(kāi)始,而棧從內(nèi)存區(qū)域的末端向下增長(zhǎng)。
esp寄存器時(shí)CPU棧指針,用來(lái)存放棧頂單元的地址。在80x86系統(tǒng)中,棧起始于末端,并朝這個(gè)內(nèi)存區(qū)域開(kāi)始的方向增長(zhǎng)。從用戶(hù)態(tài)剛切換到內(nèi)核態(tài)后,進(jìn)程的內(nèi)核棧總是空的,因此,esp寄存器這是指向這個(gè)棧的頂端。一旦數(shù)據(jù)寫(xiě)入棧,esp的值就遞減。因?yàn)閠hread_Info的結(jié)構(gòu)式52個(gè)字節(jié)長(zhǎng),因此內(nèi)核棧能擴(kuò)展到8140個(gè)字節(jié)。
標(biāo)識(shí)當(dāng)前進(jìn)程
如果thread_union結(jié)構(gòu)長(zhǎng)度是8k,則內(nèi)核屏蔽掉esp的低13位就可以獲得thread_info的基地址;如果thread_union結(jié)構(gòu)的長(zhǎng)度是4k,內(nèi)核需要屏蔽掉esp的低12位。這項(xiàng)工作由current_thread_info()函數(shù)來(lái)完成,它產(chǎn)生如下匯編指令:
movl $-8192, %ecx //將19個(gè)1+00000000000000(低13位為0)的值保存到ecx寄存器
andl %esp, %ecx //取出ecx中的值與esp中當(dāng)前棧頂單元的地址進(jìn)行位與運(yùn)算,即屏蔽esp的后13位。
movl %ecx ,p //將計(jì)算的結(jié)構(gòu)賦值給p
因?yàn)閠ask字段在thread_info結(jié)構(gòu)中的偏移量為0,所以執(zhí)行完以上指令后,p就包含在cpu上運(yùn)行進(jìn)程的進(jìn)程描述符指針。
雙向鏈表
linux定義了list_head數(shù)據(jù)結(jié)構(gòu),字段next和prev分別表示通用雙向鏈表向前和向后的指針元素。list_head字段的指針中存放的是另一個(gè)list_head字段的地址,而不是含有l(wèi)ist_head結(jié)構(gòu)的整個(gè)數(shù)據(jù)結(jié)構(gòu)的地址。
雙向鏈表處理函數(shù)和宏
list_add(n,p)
list_add_tail(n,p)把n指向的元素插在p指向的元素之前。
list_del(p)
list_empty(p) 檢查由第一個(gè)元素地址p指向的鏈表是否為空
list_entry(p,t,m) 返回類(lèi)型為t的數(shù)據(jù)結(jié)構(gòu)地址,其中類(lèi)型t含有l(wèi)ist_head字段,而list_head字段中含有名字m和地址p
list_for_each(p,h) 對(duì)表頭地址h指定的鏈表進(jìn)行掃描,每次循環(huán)時(shí),通過(guò)p返回指向鏈表元素的list_head結(jié)構(gòu)的指針
list_for_each_entry(p,h,m) 與list_for_each類(lèi)似,但是返回了包含list_head結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)的地址,而不是list_head結(jié)構(gòu)本身的地址
進(jìn)程鏈表
進(jìn)程鏈表的頭是init_task描述符,init_task的tasks.prev字段指向鏈表中最后插入的額進(jìn)程描述符的tasks字段。
SET_LINKS和REMOVE_LINKS宏分別用于從進(jìn)程鏈表中插入和刪除一個(gè)進(jìn)程描述符。
宏for_each_process掃描整個(gè)進(jìn)程鏈表定義如下:
#define for_each_process(p)
for(p=&init_task;(p=list_entry((p)->tasks.next, struct task_struct,tasks))!=&init_task; )
TASK_RUNNING狀態(tài)的進(jìn)程鏈表
提高調(diào)度程序運(yùn)行速度的訣竅是建立多個(gè)可運(yùn)行進(jìn)程鏈表,每種進(jìn)程優(yōu)先級(jí)權(quán)限對(duì)應(yīng)一個(gè)不同的鏈表。每個(gè)task_struct描述符包含一個(gè)list_head類(lèi)型字段run_list。如果進(jìn)程的優(yōu)先權(quán)等于k,run_list字段把進(jìn)程鏈接到優(yōu)先權(quán)為k的可運(yùn)行進(jìn)程鏈表中。所有這些可運(yùn)行進(jìn)程鏈表由一個(gè)單獨(dú)的prio_array_t數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
prio_array_t數(shù)據(jù)結(jié)構(gòu)字段:
int nr_active 鏈表中進(jìn)程描述符的數(shù)量
unsigned long[5] bitmp 優(yōu)先權(quán)位圖;當(dāng)且僅當(dāng)某個(gè)優(yōu)先權(quán)的進(jìn)程鏈表不為空時(shí)設(shè)置相應(yīng)的標(biāo)志位
struct list_head[140] queue 140個(gè)優(yōu)先權(quán)隊(duì)列的頭結(jié)點(diǎn)。
進(jìn)程間的關(guān)系
進(jìn)程描述符中表示進(jìn)程進(jìn)程親屬字段的描述
real_parent 指向創(chuàng)建了p的進(jìn)程描述符,如果p的父進(jìn)程不存在,就指向1的進(jìn)程描述符
parent 指向p的當(dāng)前父進(jìn)程。它的值常常與real_parent一致,偶爾不同:當(dāng)一個(gè)進(jìn)程發(fā)出監(jiān)控p的ptrace()系統(tǒng)請(qǐng)求時(shí)
children 鏈表的頭部,鏈表中的所有元素都是p創(chuàng)建的子進(jìn)程
sibling 指向兄弟進(jìn)程鏈表中的下一元素或前一個(gè)元素的指針,這些兄弟進(jìn)程的父進(jìn)程都是p
建立非親屬關(guān)系的進(jìn)程描述符字段
group_leader p所在進(jìn)程組的領(lǐng)頭進(jìn)程的描述符指針
signal->pgrp p所在進(jìn)程組領(lǐng)頭進(jìn)程的pid
tgid p所在線(xiàn)程組的領(lǐng)頭進(jìn)程pid
signal->session p所在登錄會(huì)話(huà)領(lǐng)頭進(jìn)程的pid
ptrace_children 鏈表的頭,該鏈表包含所有被debugger程序跟蹤的p的子進(jìn)程
ptrace_list 指向所跟蹤進(jìn)程其實(shí)際父進(jìn)程鏈表的前一個(gè)和下一個(gè)元素
pidhash表及鏈表
內(nèi)核必須能從進(jìn)程的pid導(dǎo)出對(duì)應(yīng)的進(jìn)程描述符指針。順序掃描進(jìn)程鏈表并檢查進(jìn)程描述符的pid字段是可行但是相當(dāng)?shù)牡托А榱思铀俨檎遥肓?個(gè)散列表。
4個(gè)散列表和進(jìn)程描述符中的相關(guān)字段
PIDTYPE_PID pid 進(jìn)程的PID
PIDTYPE_TGID tgid 線(xiàn)程組領(lǐng)頭進(jìn)程的pid
PIDTPE_PGID pgrp 進(jìn)程組領(lǐng)頭進(jìn)程的pid
PIDTYPE_SID session 回話(huà)領(lǐng)頭進(jìn)程的pid
內(nèi)核初始化期間動(dòng)態(tài)的為這4個(gè)散列表分配空間,并把他們的地址存入pid_hash數(shù)組中。一個(gè)散列表的長(zhǎng)度依賴(lài)于可用的ram容量。
用pid_hashfn宏把PID數(shù)值轉(zhuǎn)化為散列表的表索引。
Linux利用鏈表來(lái)處理散列表中沖突的pid:每一個(gè)表項(xiàng)是有沖突的進(jìn)程描述符組成的雙向鏈表。
具有鏈表的散列法比從pid到表索引的線(xiàn)性轉(zhuǎn)換更優(yōu)越,因?yàn)樵谌魏谓o定的實(shí)例中,系統(tǒng)中的進(jìn)程數(shù)總是遠(yuǎn)遠(yuǎn)小于32768。如果在任何給定的實(shí)例中大部分表項(xiàng)都不使用的話(huà),那么把表定義為32768項(xiàng)會(huì)是一種存儲(chǔ)浪費(fèi)。
由于需要跟蹤進(jìn)程間的關(guān)系,pid散列表中使用的數(shù)據(jù)結(jié)構(gòu)非常復(fù)雜。如果根據(jù)線(xiàn)程組號(hào)查找散列表,只能返回一個(gè)進(jìn)程描述符,就是線(xiàn)程組領(lǐng)頭進(jìn)程的描述符。為了能快速返回組中其他所有的進(jìn)程,內(nèi)核就必須為每個(gè)線(xiàn)程組保留一個(gè)鏈表。PID散列表的數(shù)據(jù)結(jié)構(gòu)解決了這個(gè)問(wèn)題。因?yàn)樗麄兛梢詾榘谝粋€(gè)散列表中的任何pid號(hào)定義進(jìn)程鏈表。針對(duì)四中散列表,定義了四個(gè)pid結(jié)構(gòu)的數(shù)組,它在進(jìn)程描述符的pids字段中。
pid結(jié)構(gòu)的字段
int nr pid的數(shù)值
struct h_list_node pid_chain 鏈接散列表的下一個(gè)和前一個(gè)元素
struct list_head pid_list 鏈接相同pid值的進(jìn)程鏈表的標(biāo)頭
如何組織進(jìn)程
運(yùn)行隊(duì)列鏈表把處于TASK_RUNNING狀態(tài)的所有進(jìn)程組織在一起;沒(méi)有為處于TASK_STOPPED、EXIT_ZOMBLE或EXIT_DEAD狀態(tài)的進(jìn)程建立專(zhuān)門(mén)的鏈表。由于對(duì)處于這些狀態(tài)的進(jìn)程訪(fǎng)問(wèn)比較簡(jiǎn)單,或者通過(guò)pid或者通過(guò)特定父進(jìn)程的子進(jìn)程鏈表,所有不必對(duì)這三種狀態(tài)進(jìn)程分組。
根據(jù)不同特殊事件把處于TASK_INTERUPTIBLE和TASK_UNinteruptible狀態(tài)的進(jìn)程細(xì)分為許多類(lèi),將這些進(jìn)程鏈接到等待隊(duì)列。
等待隊(duì)列
等待隊(duì)列由雙向鏈表實(shí)現(xiàn),其元素包括指向進(jìn)程描述符的指針。每個(gè)等待隊(duì)列有一個(gè)等待隊(duì)列頭wait_queue_head_t;因?yàn)榈却?duì)列是有中斷處理程序和主要內(nèi)核函數(shù)修改的,因此必須對(duì)其雙向鏈表進(jìn)行保護(hù),同步是通過(guò)等待隊(duì)列頭中的lock自旋鎖達(dá)到的。等待隊(duì)列鏈表中的元素類(lèi)型為wait_queue_t.
有兩種睡眠進(jìn)程:互斥進(jìn)程(等待隊(duì)列元素的flags字段為1)由內(nèi)核有選擇的喚醒,而非互斥進(jìn)程(flags=0)總是由內(nèi)核在事件發(fā)生時(shí)喚醒。等待訪(fǎng)問(wèn)臨界資源的進(jìn)程是互斥進(jìn)程的例子,等待相關(guān)事件的進(jìn)程是非互斥的。
等待隊(duì)列的操作
定義一個(gè)等待隊(duì)列:DECLARE_WAIT_QUEUE_HEAD(name)定義一個(gè)等待隊(duì)列的頭init_waitqueue_head()可以用來(lái)初始化動(dòng)態(tài)分配的等待隊(duì)列的頭變量。
初始化wait_queue_t結(jié)構(gòu)變量:init_waitqueue_entry(q,p);DEFINE_WAIT宏
插入等待隊(duì)列:add_wait_queue()非互斥 第一個(gè)位置;add_wait_queue_exclusive()互斥最后一個(gè)位置
移除:remove_wait_queue()
判斷隊(duì)列為空:waitqueue_active()
要等待特定條件的進(jìn)程可以條用如下函數(shù):
sleep_on();
interruptible_sleep_on();
sleep_on_timeout();interruptible_sleep_on_timeout();
prepare_to_wait();finsh_wait();prepare_to_wait_exclusive();
wait_event;wait_event_interruptible;
喚醒:各種喚醒函數(shù),不舉例。
喚醒:非互斥進(jìn)程p將有default_wake_function()喚醒
進(jìn)程資源限制
每個(gè)進(jìn)程都由一組相關(guān)資源的限制,限制了進(jìn)程能使用的系統(tǒng)資源數(shù)量。對(duì)當(dāng)前進(jìn)程的資源限制存放在current->signal->rlim字段,即進(jìn)程信號(hào)描述符的一個(gè)字段。該字段類(lèi)型為rlimt結(jié)構(gòu)的數(shù)組,每個(gè)資源限制對(duì)應(yīng)一個(gè)元素:
struct rlimit{
unsigned long rlim_cur;
unsigned long rlim_max;
}
rlim_cur字段是資源的當(dāng)前資源限制。rlim_max字段是組員限制所允許的大值。
進(jìn)程切換
為了控制進(jìn)程的執(zhí)行,內(nèi)核必須有能力掛起當(dāng)前cpu上運(yùn)行的進(jìn)程,并恢復(fù)以前掛起的某個(gè)進(jìn)程執(zhí)行。這種行為被稱(chēng)為進(jìn)程切換、任務(wù)切換或上下文切換。
硬件上下文
進(jìn)程恢復(fù)執(zhí)行前必須裝入寄存器的一組數(shù)據(jù)稱(chēng)為硬件上下文。硬件上下文是進(jìn)程可執(zhí)行上下文的一個(gè)子集,因?yàn)榭蓤?zhí)行上下文包含進(jìn)程執(zhí)行所需要的所有信息。linux中,進(jìn)程硬件上下文的一部分存放在TSS段,而剩余部分存放在內(nèi)核態(tài)的堆棧中。
進(jìn)程切換只發(fā)生在內(nèi)核態(tài)。在執(zhí)行進(jìn)程切換之前,用戶(hù)態(tài)進(jìn)程使用的所有寄存器內(nèi)容已經(jīng)保存在內(nèi)核態(tài)堆棧上,這也包括ss和esp這對(duì)寄存器的內(nèi)容(存儲(chǔ)用戶(hù)態(tài)堆棧指針的地址)。
任務(wù)狀態(tài)段
盡管linux不使用硬件上下文切換,但是強(qiáng)制它為系統(tǒng)中不同的cpu創(chuàng)建一個(gè)TSS。因?yàn)椋?/p>
1、cpu從用戶(hù)態(tài)切換到內(nèi)核態(tài)時(shí),它就從TSS中獲取內(nèi)核態(tài)堆棧的地址。
2、當(dāng)用戶(hù)態(tài)進(jìn)程視圖通過(guò)in或out指令訪(fǎng)問(wèn)一個(gè)I/O端口時(shí),cpu需要訪(fǎng)問(wèn)存放在TSS中的I/O許可權(quán)位圖,以檢查該進(jìn)程是否有訪(fǎng)問(wèn)端口的權(quán)力。
tss_struct結(jié)構(gòu)描述TSS的格式。每次進(jìn)程切換時(shí),內(nèi)核都更新TSS的某些字段以便相應(yīng)的cpu控制單元可以安全的檢索到它需要的信息。因此,TSS反應(yīng)了CPU上當(dāng)前進(jìn)程的特權(quán)級(jí)別,但不必為沒(méi)有運(yùn)行的進(jìn)程保留TSS。
每個(gè)TSS有它自己8字節(jié)的任務(wù)狀態(tài)段描述符。這個(gè)描述符包括指向TSS起始地址的32位base字段,20位limit字段。s標(biāo)志位被清0,以表示相應(yīng)的TSS是系統(tǒng)段。type字段值為11或9以表示這個(gè)段實(shí)際上是TSS。每個(gè)cpu的tr寄存器包含相應(yīng)TSS的TSSD選擇符,也包含了兩個(gè)隱藏的非編程字段base和limit。這樣處理器可以直接對(duì)TSS尋址而不用從GDT中檢索TSS的地址。
thread字段
每個(gè)進(jìn)程描述符包含一個(gè)類(lèi)型為thread_struct的thread字段,只要進(jìn)程被切換出去,內(nèi)核就把硬件上下文保存在這個(gè)結(jié)構(gòu)中。
執(zhí)行進(jìn)程切換
從本質(zhì)上說(shuō),進(jìn)程切換由兩步組成:
1、切換頁(yè)全局目錄以安裝一個(gè)新的地址空間;
2、切換內(nèi)核堆棧和硬件上下文,因?yàn)橛布舷挛奶峁┝藘?nèi)核執(zhí)行新進(jìn)程所需要的所有信息,包含cpu寄存器。
switch_to宏
__switch_to()函數(shù)
創(chuàng)建進(jìn)程
1、copy on write機(jī)制允許父子進(jìn)程讀相同的物理頁(yè)。只要兩者中有一個(gè)視圖寫(xiě)一個(gè)物理頁(yè),內(nèi)核就把這個(gè)頁(yè)的內(nèi)容拷貝到一個(gè)新的物理頁(yè),并把這個(gè)新的物理頁(yè)分配給正在寫(xiě)的進(jìn)程。
2、輕量級(jí)進(jìn)程允許父子進(jìn)程共享每進(jìn)程在內(nèi)核的很多數(shù)據(jù)結(jié)構(gòu),如頁(yè)表、打開(kāi)文件表及信號(hào)處理。
3、vfork()系統(tǒng)調(diào)用創(chuàng)建的進(jìn)程能共享其父進(jìn)程的內(nèi)存地址空間。為了防止父進(jìn)程重寫(xiě)子進(jìn)程需要的數(shù)據(jù),阻塞父進(jìn)程的執(zhí)行,一直到子進(jìn)程退出或執(zhí)行一個(gè)新的程序?yàn)橹埂?/p>
clone()、fork()和vfork()系統(tǒng)調(diào)用
do_fork()函數(shù)負(fù)責(zé)處理clone()、fork()、vfork()系統(tǒng)調(diào)用
copy_process()創(chuàng)建進(jìn)程描述符以及子進(jìn)程執(zhí)行所需要的所有其他數(shù)據(jù)結(jié)構(gòu)
內(nèi)核線(xiàn)程
與普通進(jìn)程的區(qū)別:1、內(nèi)核線(xiàn)程只運(yùn)行在內(nèi)核態(tài),而普通進(jìn)程既可以運(yùn)行在內(nèi)核態(tài),也可以運(yùn)行在用戶(hù)態(tài)。2、內(nèi)核線(xiàn)程只能使用大于PAGE_OFFSET的線(xiàn)性地址空間。
創(chuàng)建一個(gè)內(nèi)核線(xiàn)程
kernel_thread()函數(shù)創(chuàng)建一個(gè)新的內(nèi)核線(xiàn)程
進(jìn)程0和進(jìn)程1以及其他內(nèi)核線(xiàn)程
撤銷(xiāo)進(jìn)程
進(jìn)程終止:exit_group()終止線(xiàn)程組;exit()終止一個(gè)線(xiàn)程
do_group_exit();
do_exit();
進(jìn)程刪除 release_task()函數(shù)從僵死進(jìn)程的描述符中分離出最后的數(shù)據(jù)結(jié)構(gòu);對(duì)僵死進(jìn)程的處理方式:如果父進(jìn)程不需要接受來(lái)自自進(jìn)程的信號(hào),就do_exit();如果已經(jīng)給父進(jìn)程信號(hào),就調(diào)用wait4()或waitpid(),將回收進(jìn)程描述符所占用的內(nèi)存空間。在前一種情況下,內(nèi)存的回收將有進(jìn)程調(diào)度程序來(lái)完成。
網(wǎng)站名稱(chēng):三、進(jìn)程-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://www.jbt999.com/article42/diechc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、商城網(wǎng)站、響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容