【正文】
ls and exception handlers are welldefined interfaces into the kernel. A process can begin executing in kernel. XXX 工業(yè)大學(xué)本科畢業(yè)設(shè)計(jì)外文文獻(xiàn)翻譯 7 進(jìn)程管理 進(jìn)程是 Uinx操作系統(tǒng)最基本的抽象之一。實(shí)際上,進(jìn)程就 是 正在執(zhí)行的程序代碼 的活標(biāo)本。在傳統(tǒng)的 Unix 系統(tǒng)中,一個(gè)進(jìn)程只包含一個(gè)線程,但現(xiàn)在的系統(tǒng)中,包含多個(gè)線程的多線程程序司空見慣。雖然實(shí)際上可能是許多進(jìn)程正在分享一個(gè)處理器,但虛擬處理器給進(jìn)程一種假象, 讓這些進(jìn)程覺得自己在獨(dú)享處理器。實(shí)際上完全可以存在兩個(gè)或者多個(gè)不同的進(jìn)程執(zhí)行的是同一個(gè)程序。調(diào)用 fork()的進(jìn)程被稱為父子進(jìn)程,新產(chǎn)生的進(jìn)程被稱為子進(jìn)程。在現(xiàn)代 Linux 內(nèi)核中, fork()實(shí)際上是由 clone()系統(tǒng)調(diào)用實(shí)現(xiàn)的,后者將在后面討論。進(jìn)程退出執(zhí)行后被置為僵死狀態(tài),直到它的父進(jìn)程調(diào)用wait()或 waitpid()為止。 1 進(jìn)程描述符及任務(wù)結(jié)構(gòu) 內(nèi)核把進(jìn)程存放在叫做任務(wù)隊(duì)列( task list)的雙向循環(huán)鏈表中。但如果考慮到該結(jié)構(gòu)內(nèi)包含了內(nèi)核管理一個(gè)進(jìn)程所需要的所有信息,那么它的大小也相當(dāng)小了。這樣做的目的是為了讓那些像 x86 這樣寄存器較的硬件體系結(jié)構(gòu)只要通過棧指針就能算出它的位置,從而避免使用額外的寄存器專門記錄。 Struct exec_domain *exec_domain。 __s32 preempt_count。 XXX 工業(yè)大學(xué)本科畢業(yè)設(shè)計(jì)外文文獻(xiàn)翻譯 9 __u8 supervisor_stack[0]。 PID 是一個(gè)數(shù),表示為 pid_t 隱含類型,實(shí)際上就是一個(gè) int 類型。盡管 32768 對(duì)一般的桌面系統(tǒng)足夠用了,但是大型服務(wù)器可能需要更新進(jìn)程。實(shí)際上,內(nèi)核中大部分處理進(jìn)程的代碼都是直接通過 task_struct 進(jìn)行的。而有些像 x86 這樣的體系結(jié)構(gòu),就只能在內(nèi)核棧的尾端創(chuàng)建 thread_info 結(jié)構(gòu),通過計(jì)算偏移間接地查找 task_struct 結(jié)構(gòu)。當(dāng) 4KB 的棧啟用時(shí),就用 4096,而不是 8192。與 x86 不一樣, PPC 有足夠多的寄存器,所以它的實(shí)現(xiàn)有這樣的余地。該域的值也必為下列五種狀態(tài)標(biāo)志之一: ( 1) TASK_RUNNING(運(yùn)行) —— 進(jìn)程是可執(zhí)行的,它或者正在執(zhí)行,或者在運(yùn)行隊(duì)列中等待執(zhí)行。處于此狀態(tài)的進(jìn)程也會(huì)因?yàn)榻邮艿叫盘?hào)而提前被喚醒并投入到運(yùn)行。 ( 4) TASK_ZOMBIE(僵死) —— 該進(jìn)程已經(jīng)結(jié)束了, 但是其父進(jìn)程還沒有調(diào)用wait()系統(tǒng)調(diào)用,為了父進(jìn)程能夠獲知它的消息,子進(jìn)程的進(jìn)程描述符仍然被保留著。此外,在調(diào)試期間受到任何信號(hào),都會(huì)使進(jìn)程進(jìn)入這種狀態(tài)。該函數(shù) 將制定的進(jìn)程設(shè)置為給定的狀態(tài)。這些代碼從可執(zhí)行文件載入到進(jìn)程的地址空間執(zhí)行。在此上下文中 current 宏是有效的。 。 系統(tǒng)調(diào)用和異常處理程序是對(duì)內(nèi)核明確定義的接口。當(dāng)一個(gè)程序調(diào)用執(zhí)行了系統(tǒng)調(diào)用或者觸發(fā)了某個(gè)異常,它就陷入了內(nèi)核空間。方法 set_current_state(state),和 set_task_state(current, state)含義是等同的。這時(shí)最好使用 set_task_state(task, state)。 ( 5) TASK_STOPPED(停止) —— 進(jìn)程停止執(zhí)行,進(jìn)程沒有投入運(yùn)行也不能投入欲行。這個(gè)狀態(tài)通常在進(jìn)程必須在等待時(shí)不受干擾或等待時(shí)間很快就會(huì)發(fā)生時(shí)出現(xiàn)。 ( 2) TASK_INTERRUPTIBLE(可中斷) —— 進(jìn)程正在睡眠(也就是說它被阻塞),等待某些條件的達(dá)成。 4 進(jìn)程狀態(tài) 進(jìn)程描述符中的 state 域描述了進(jìn)程的當(dāng)前狀態(tài)。 對(duì)比一下這部分在 PowerPC 上的實(shí)現(xiàn)( IBM 基于 RISC 的現(xiàn)代微處理器),我們可以發(fā)現(xiàn)當(dāng)前 task_struct 的地址是保存在一個(gè)寄存器中的。該操作通過 current_thread_info()函數(shù)完成的。硬件體系結(jié)構(gòu)不同,該宏的實(shí)現(xiàn)也就不同,它必須針對(duì)專門的硬件體系結(jié)構(gòu)作處理。如果確實(shí)需要的話,可以不考慮與老式系統(tǒng)的兼容,由系統(tǒng)管理員通過修改 /proc/sys/kernel/pid_max 來提高上限。內(nèi)核把每個(gè)進(jìn)程 PID 存放在他們各自的進(jìn)策劃那個(gè)描述符中。結(jié)構(gòu)中 task域中存放的是指向該任務(wù)實(shí)際 task_struct 的指針。 Struct restart_block restart_block。 Unsigned long status。這個(gè)新的結(jié)構(gòu)能使在匯編代碼中計(jì)算器偏移變得相當(dāng)?shù)娜菀住? 2 進(jìn)程描述符 Linux 通過 slab 非配器分配 task_struct 結(jié)構(gòu),這樣能達(dá)到對(duì)象復(fù)用和緩存著色的目的。進(jìn)程描述符中包含一個(gè)具體進(jìn)程的所有信息。 Linux 內(nèi)核通常把進(jìn)程也叫做任務(wù)。這個(gè)函數(shù)會(huì)終結(jié)進(jìn)程并將其占有的資源釋放掉。 Fork()系統(tǒng)調(diào)用從內(nèi)核返回兩次:一次回到父進(jìn)程,另一個(gè)回到新誕生的子進(jìn)程。無疑,進(jìn)程在它被創(chuàng)建的時(shí)刻開始存活。有趣的是,注意在線程之間(這里是指包含在同一個(gè)進(jìn)程中的進(jìn)程)可以共享虛擬內(nèi)存,但擁有各自的虛擬處理器。對(duì)Linux而言,線程只不過是一種特殊的進(jìn)程罷了。每個(gè)線程用由一個(gè)獨(dú)立的程序計(jì)數(shù)器、進(jìn)程棧和一組進(jìn)程寄存器。但進(jìn)程并不僅僅局限于一段可執(zhí)行程序( Unix 稱其為代碼段( text section))。 This function sets the given task to the given state. If applicable, it also provides a memory barrier to force ordering on other processors (this is only needed on SMP systems). Otherwise, it is equivalent to taskstate = state。s state to TASK_RUNNING. The process also awakes prematurely and bees runnable if it receives a signal. (3) TASK_UNINTERRUPTIBLE This state is identical to TASK_INTERRUPTIBLE except that it does not wake up and bee runnable if it receives a signal. This is used in situations where the process must wait without interruption or when the event is expected to occur quite quickly. Because the task does not respond to signals in this state, this state is less often used than TASK_INTERRUPTIBLE (4)TASK_ZOMBIE The task has terminated,