|  | |
| Linux下的進程結構 | |
| 進(jin)程不但包括程序的(de)(de)指令和(he)數據,而且包括程序計數器(qi)(qi)和(he)處(chu)理器(qi)(qi)的(de)(de)所有寄(ji)存器(qi)(qi)及存儲臨時數據的(de)(de)進(jin)程堆棧,因此正在執行的(de)(de)進(jin)程包括處(chu)理器(qi)(qi)當前(qian)的(de)(de)一切(qie)活(huo)動。 因為Linux是一(yi)個(ge)多(duo)進(jin)程的操(cao)作系統,所以其他(ta)的進(jin)程必須等到系統將處(chu)理器(qi)(qi)使用權(quan)分(fen)配(pei)(pei)給(gei)自己(ji)之后才能運(yun)行(xing)。當正(zheng)在運(yun)行(xing)的進(jin)程等待(dai)其他(ta)的系統資源(yuan)時,Linux內核(he)將取得處(chu)理器(qi)(qi)的控制(zhi)權(quan),并將處(chu)理器(qi)(qi)分(fen)配(pei)(pei)給(gei)其他(ta)正(zheng)在等待(dai)的進(jin)程,它按照內核(he)中的調度算(suan)法(fa)決定將處(chu)理器(qi)(qi)分(fen)配(pei)(pei)給(gei)哪一(yi)個(ge)進(jin)程。 內核將(jiang)所(suo)有進(jin)(jin)(jin)程(cheng)存(cun)放(fang)在雙(shuang)向循環鏈表(biao)(進(jin)(jin)(jin)程(cheng)鏈表(biao))中(zhong)(zhong),其中(zhong)(zhong)鏈表(biao)的(de)(de)(de)(de)頭是init_task描(miao)述(shu)符。鏈表(biao)的(de)(de)(de)(de)每一項都是類型為task_struct,稱為進(jin)(jin)(jin)程(cheng)描(miao)述(shu)符的(de)(de)(de)(de)結構,該(gai)結構包含(han)了與一個(ge)進(jin)(jin)(jin)程(cheng)相(xiang)關(guan)的(de)(de)(de)(de)所(suo)有信(xin)(xin)息(xi)(xi),定義(yi)在<include/linux/sched.h>文(wen)件(jian)中(zhong)(zhong)。task_struct內核結構比(bi)較大,它(ta)能完(wan)整地描(miao)述(shu)一個(ge)進(jin)(jin)(jin)程(cheng),如進(jin)(jin)(jin)程(cheng)的(de)(de)(de)(de)狀態(tai)、進(jin)(jin)(jin)程(cheng)的(de)(de)(de)(de)基本信(xin)(xin)息(xi)(xi)、進(jin)(jin)(jin)程(cheng)標(biao)識符、內存(cun)相(xiang)關(guan)信(xin)(xin)息(xi)(xi)、父進(jin)(jin)(jin)程(cheng)相(xiang)關(guan)信(xin)(xin)息(xi)(xi)、與進(jin)(jin)(jin)程(cheng)相(xiang)關(guan)的(de)(de)(de)(de)終端信(xin)(xin)息(xi)(xi)、當前(qian)工作目(mu)錄、打開(kai)的(de)(de)(de)(de)文(wen)件(jian)信(xin)(xin)息(xi)(xi)、所(suo)接收的(de)(de)(de)(de)信(xin)(xin)號(hao)信(xin)(xin)息(xi)(xi)等。   下面詳細講解task_struct結構中為重要的兩個(ge)域:state(進程狀態)和pid(進程標識符)。 1)進(jin)程狀態     Linux中的進程有以下幾種狀態。  它(ta)們之間的轉換(huan)關(guan)系(xi)如(ru)圖3.2所示。 
   內核(he)可(ke)以使用set_task_state和set_current_state宏(hong)來改變指定進程的狀態(tai)和當前執(zhi)行進程的狀態(tai)。 2)進程標識符 Linux內核(he)通(tong)過唯一(yi)的(de)(de)(de)(de)進(jin)程(cheng)標識符PID來標識每(mei)個進(jin)程(cheng)。PID存放在進(jin)程(cheng)描述(shu)符的(de)(de)(de)(de)pid字段中,新(xin)創(chuang)建(jian)的(de)(de)(de)(de)PID通(tong)常(chang)是前(qian)一(yi)個進(jin)程(cheng)的(de)(de)(de)(de)PID加1,不過PID的(de)(de)(de)(de)值有(you)上(shang)限(大值 = PID_MAX_DEFAULT – 1,通(tong)常(chang)為32767),讀者可(ke)以查看/proc/sys/kernel/pid_max來確定該系統的(de)(de)(de)(de)進(jin)程(cheng)數(shu)上(shang)限。 當系(xi)統啟動后,內核通常作為某一個進(jin)程(cheng)的(de)(de)代(dai)表。一個指向task_struct的(de)(de)宏(hong)current用來(lai)記錄正(zheng)在運行的(de)(de)進(jin)程(cheng)。current經常作為進(jin)程(cheng)描述(shu)符結構指針的(de)(de)形式出現在內核代(dai)碼中,例如,current->pid表示(shi)處理(li)器(qi)正(zheng)在執行的(de)(de)進(jin)程(cheng)的(de)(de)PID。當系(xi)統需要查看所(suo)有的(de)(de)進(jin)程(cheng)時,則調(diao)用for_each_process()宏(hong),這將(jiang)比系(xi)統搜(sou)索(suo)數組的(de)(de)速(su)度要快得多。 在Linux中獲得當前進程(cheng)(cheng)的進程(cheng)(cheng)號(PID)和(he)父(fu)進程(cheng)(cheng)號(PPID)的系統(tong)調用函數(shu)分別為getpid()和(he)getppid()。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接:     
         1、Linux下多任務系統之進程的基本概念 |