Linux 進(jìn)程編程ppt課件_第1頁(yè)
Linux 進(jìn)程編程ppt課件_第2頁(yè)
Linux 進(jìn)程編程ppt課件_第3頁(yè)
Linux 進(jìn)程編程ppt課件_第4頁(yè)
Linux 進(jìn)程編程ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux 進(jìn)程編程 Linux Process program定義形狀進(jìn)程ID進(jìn)程互斥臨界資源臨界區(qū)進(jìn)程同步進(jìn)程調(diào)度搶占式,非搶占式n (1) (1) 非搶占式優(yōu)先權(quán)算法又稱不可剝奪調(diào)度:非搶占式優(yōu)先權(quán)算法又稱不可剝奪調(diào)度:Nonpreemptive Nonpreemptive SchedulingScheduling)n 在這種方式下,系統(tǒng)一旦將處理機(jī)在這種方式下,系統(tǒng)一旦將處理機(jī)CPUCPU分配給運(yùn)行隊(duì)列中優(yōu)先權(quán)分配給運(yùn)行隊(duì)列中優(yōu)先權(quán)最高的進(jìn)程后,該進(jìn)程便一直執(zhí)行下去,直至完成;最高的進(jìn)程后,該進(jìn)程便一直執(zhí)行下去,直至完成;n 或因發(fā)生某事件使該進(jìn)程放棄處理機(jī)時(shí),系統(tǒng)方可將處理機(jī)分配給另

2、或因發(fā)生某事件使該進(jìn)程放棄處理機(jī)時(shí),系統(tǒng)方可將處理機(jī)分配給另一個(gè)優(yōu)先權(quán)高的進(jìn)程。一個(gè)優(yōu)先權(quán)高的進(jìn)程。n 這種調(diào)度算法主要用于批處理系統(tǒng)中,也可用于某些對(duì)實(shí)時(shí)性要求不這種調(diào)度算法主要用于批處理系統(tǒng)中,也可用于某些對(duì)實(shí)時(shí)性要求不嚴(yán)的實(shí)時(shí)系統(tǒng)中。嚴(yán)的實(shí)時(shí)系統(tǒng)中。n (2) (2) 搶占式優(yōu)先權(quán)調(diào)度算法又稱可剝奪調(diào)度:搶占式優(yōu)先權(quán)調(diào)度算法又稱可剝奪調(diào)度:Preemptive Preemptive SchedulingScheduling)n 該算法的本質(zhì)就是系統(tǒng)中當(dāng)前運(yùn)行的進(jìn)程永遠(yuǎn)是可運(yùn)行進(jìn)程中優(yōu)先權(quán)該算法的本質(zhì)就是系統(tǒng)中當(dāng)前運(yùn)行的進(jìn)程永遠(yuǎn)是可運(yùn)行進(jìn)程中優(yōu)先權(quán)最高的那個(gè)。最高的那個(gè)。n 在采用這種調(diào)度

3、算法時(shí),每當(dāng)出現(xiàn)一新的可運(yùn)行進(jìn)程,就將它和當(dāng)前在采用這種調(diào)度算法時(shí),每當(dāng)出現(xiàn)一新的可運(yùn)行進(jìn)程,就將它和當(dāng)前運(yùn)行進(jìn)程進(jìn)行優(yōu)先權(quán)比較,如果高于當(dāng)前進(jìn)程,將觸發(fā)進(jìn)程調(diào)度。這運(yùn)行進(jìn)程進(jìn)行優(yōu)先權(quán)比較,如果高于當(dāng)前進(jìn)程,將觸發(fā)進(jìn)程調(diào)度。這種方式的優(yōu)先權(quán)調(diào)度算法,能更好的滿足緊迫進(jìn)程的要求,種方式的優(yōu)先權(quán)調(diào)度算法,能更好的滿足緊迫進(jìn)程的要求,n 故而常用于要求比較嚴(yán)格的實(shí)時(shí)系統(tǒng)中,以及對(duì)性能要求較高的批處故而常用于要求比較嚴(yán)格的實(shí)時(shí)系統(tǒng)中,以及對(duì)性能要求較高的批處理和分時(shí)系統(tǒng)中。理和分時(shí)系統(tǒng)中。LinuxLinux也采用這種調(diào)度算法。也采用這種調(diào)度算法。進(jìn)程算法n 程序的優(yōu)先級(jí):程序的優(yōu)先級(jí): nice,

4、reniceroot test /root # ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD100 S 0 5624 5606 0 70 0 - 608 wait4 pts/0 00:00:00 bash000 R 0 6944 5624 0 76 0 - 769 - pts/0 00:00:00 psn PRI 代表這個(gè)程序可被執(zhí)行的優(yōu)先級(jí)越小越早被執(zhí)行代表這個(gè)程序可被執(zhí)行的優(yōu)先級(jí)越小越早被執(zhí)行. NI 代表這個(gè)程序的代表這個(gè)程序的 nice 值值.由于由于 PRI 是越小越快被執(zhí)行,而由于我們加入是越小越快被執(zhí)行,而由

5、于我們加入 nice 值之后,將使得值之后,將使得 PRI 變?yōu)椋鹤優(yōu)椋?PRI(new) = PRI(old) + nicenice 語(yǔ)法:語(yǔ)法: root test /root # nice -n number command 參數(shù)說(shuō)明:參數(shù)說(shuō)明: -n :就是后面那個(gè):就是后面那個(gè) number 即為即為 nice 值!值!renice 語(yǔ)法:語(yǔ)法: root test /root # renice number PID 參數(shù)說(shuō)明:參數(shù)說(shuō)明: 范例:范例: root test /root# renice 5 234 死鎖獲取進(jìn)程ID進(jìn)程創(chuàng)建父、子進(jìn)程之間的區(qū)別n fork的返回值;的返回

6、值; n 進(jìn)程進(jìn)程ID、不同的父進(jìn)程、不同的父進(jìn)程ID;n 父進(jìn)程設(shè)置的鎖,子進(jìn)程不繼承;父進(jìn)程設(shè)置的鎖,子進(jìn)程不繼承;n 子進(jìn)程的未決告警被清除;子進(jìn)程的未決告警被清除;n 子進(jìn)程的未決信號(hào)集設(shè)置為空集。子進(jìn)程的未決信號(hào)集設(shè)置為空集。思考運(yùn)行結(jié)果進(jìn)程的結(jié)構(gòu) n 進(jìn)程在內(nèi)存里有三部份的數(shù)據(jù),就是進(jìn)程在內(nèi)存里有三部份的數(shù)據(jù),就是“數(shù)據(jù)段數(shù)據(jù)段”,“堆棧段和堆棧段和“代碼段代碼段” n “代碼段代碼段”,顧名思義,就是存放了程序代碼的,顧名思義,就是存放了程序代碼的數(shù)據(jù),假如機(jī)器中有數(shù)個(gè)進(jìn)程運(yùn)行相同的一個(gè)程數(shù)據(jù),假如機(jī)器中有數(shù)個(gè)進(jìn)程運(yùn)行相同的一個(gè)程序,那么它們就可以使用同一個(gè)代碼段。序,那么它們就

7、可以使用同一個(gè)代碼段。 堆棧段存放的就是子程序的返回地址、子程序的堆棧段存放的就是子程序的返回地址、子程序的參數(shù)以及程序的局部變量。參數(shù)以及程序的局部變量。n 而數(shù)據(jù)段則存放程序的全局變量,常數(shù)以及動(dòng)態(tài)而數(shù)據(jù)段則存放程序的全局變量,常數(shù)以及動(dòng)態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間比如用數(shù)據(jù)分配的數(shù)據(jù)空間比如用malloc之類的函數(shù)之類的函數(shù)取得的空間)。取得的空間)。進(jìn)程創(chuàng)建-vforkfork VS vforkn 1. fork():子進(jìn)程拷貝父進(jìn)程的數(shù)據(jù)段,堆棧():子進(jìn)程拷貝父進(jìn)程的數(shù)據(jù)段,堆棧段段n vfork():子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段():子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段n 2. fork()父子進(jìn)程的執(zhí)

8、行次序不確定()父子進(jìn)程的執(zhí)行次序不確定n vfork 保證子進(jìn)程先運(yùn)行,在調(diào)用保證子進(jìn)程先運(yùn)行,在調(diào)用 exec 或或 exit 之前與父進(jìn)程數(shù)據(jù)是共享的之前與父進(jìn)程數(shù)據(jù)是共享的,在它調(diào)用在它調(diào)用 exec或或 exit 之后父進(jìn)程才可能被調(diào)度運(yùn)行。之后父進(jìn)程才可能被調(diào)度運(yùn)行。n 3. vfork 保證子進(jìn)程先運(yùn)行,在她調(diào)用保證子進(jìn)程先運(yùn)行,在她調(diào)用 exec 或或 exit 之后父進(jìn)程才可能被調(diào)度運(yùn)行。如果在之后父進(jìn)程才可能被調(diào)度運(yùn)行。如果在 調(diào)用調(diào)用這兩個(gè)函數(shù)之前子進(jìn)程依賴于父進(jìn)程的進(jìn)一步動(dòng)這兩個(gè)函數(shù)之前子進(jìn)程依賴于父進(jìn)程的進(jìn)一步動(dòng)作,則會(huì)導(dǎo)致死鎖。作,則會(huì)導(dǎo)致死鎖。exit和_exit

9、n exit和和_exit用于中止進(jìn)程;用于中止進(jìn)程;n _exit的作用:直接使進(jìn)程停止運(yùn)行,清除其使用的作用:直接使進(jìn)程停止運(yùn)行,清除其使用的內(nèi)存空間,并清除其在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu);的內(nèi)存空間,并清除其在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu);n exit與與_exit函數(shù)不同,函數(shù)不同,exit函數(shù)在調(diào)用函數(shù)在調(diào)用exit系統(tǒng)之系統(tǒng)之前要檢查文件打開(kāi)情況把文件緩沖區(qū)的內(nèi)容寫(xiě)回前要檢查文件打開(kāi)情況把文件緩沖區(qū)的內(nèi)容寫(xiě)回文件中去。如調(diào)用文件中去。如調(diào)用printf()函數(shù)。()函數(shù)。進(jìn)程運(yùn)行調(diào)用退出處理函數(shù)清除I/O緩沖調(diào)用_exit系統(tǒng)調(diào)用進(jìn)程終止運(yùn)行_exitexitn int main()n n printf

10、(this is a testn)n printf(test exit fun);n exit(0);n int main() printf(this is a testn) printf(test exit fun); _exit(0);自己編寫(xiě)這兩個(gè)程序,看有何不同?原因是什么?自己編寫(xiě)這兩個(gè)程序,看有何不同?原因是什么?n 原因就是因?yàn)樽詈笠痪湓捝蠜](méi)有加上特殊的字符,原因就是因?yàn)樽詈笠痪湓捝蠜](méi)有加上特殊的字符,n 如換行和文件結(jié)束符,因?yàn)檫@個(gè)時(shí)候文件是存放如換行和文件結(jié)束符,因?yàn)檫@個(gè)時(shí)候文件是存放再在緩沖區(qū)的,再在緩沖區(qū)的,n 這個(gè)例子中文件就是存放打開(kāi)的顯示設(shè)備的緩沖這個(gè)例子中文件就是

11、存放打開(kāi)的顯示設(shè)備的緩沖區(qū)中的,因?yàn)檩敵龊瘮?shù)要寫(xiě)入,首先要進(jìn)行系統(tǒng)區(qū)中的,因?yàn)檩敵龊瘮?shù)要寫(xiě)入,首先要進(jìn)行系統(tǒng)調(diào)用,這個(gè)時(shí)候系統(tǒng)會(huì)打開(kāi)顯示設(shè)備的緩沖區(qū),調(diào)用,這個(gè)時(shí)候系統(tǒng)會(huì)打開(kāi)顯示設(shè)備的緩沖區(qū),n 而而exit的作用就是結(jié)束,清理,就是說(shuō)先檢查緩的作用就是結(jié)束,清理,就是說(shuō)先檢查緩沖區(qū),把沒(méi)有寫(xiě)入的數(shù)據(jù)寫(xiě)入到文件,沖區(qū),把沒(méi)有寫(xiě)入的數(shù)據(jù)寫(xiě)入到文件,n 而而_exit是立刻關(guān)閉文件,文件緩沖區(qū)的內(nèi)容也就是立刻關(guān)閉文件,文件緩沖區(qū)的內(nèi)容也就消失了,這個(gè)時(shí)候就不可能再輸出到顯示設(shè)備了消失了,這個(gè)時(shí)候就不可能再輸出到顯示設(shè)備了進(jìn)程創(chuàng)建-vforkn Pid = vfork();n if(pid = 0)

12、n n count +;n printf(count = %dn, count);n _exit(0);n n else if(pid 0)n n count +;n printf(count = %dn, count);n n return 0;n Exec 函數(shù)族e(cuò)xec函數(shù)族裝入并運(yùn)行程序pathname,并將參數(shù)arg0(arg1,arg2,argv,envp)傳遞給子程序,出錯(cuò)返回-1。在exec函數(shù)族中,后綴l、v、p、e添加到exec后,所指定的函數(shù)將具有某種操作能力有后綴:Exec 函數(shù)族e(cuò)xecln int main()n n if(fork()=0)n n printf(e

13、xecl.n);n if(execl(/bin/ls,ls,-a,NULL)0)n n execlpn if(fork()=0)n n printf(execlp.n);n if(execlp(ls,ls,-a,NULL)0)n n fprintf(stderr,execl failed:%s,strerror(errno);n return -1;n execv char *arg=ls,-a,NULL; if(fork()=0)printf(execv.n);if(execv(/bin/ls,arg)0)fprintf(stderr,execl failed:%sn,strerror(er

14、rno);return -1;execvp char *arg=ls,-a,NULL; if(fork()=0)printf(execvp.n);if(execvp(ls,arg)0)fprintf(stderr,execl failed:%sn,strerror(errno);return -1;execleexecven if(fork()=0)n n printf(execve.n);n if(execve(/bin/ls,arg,envp)0)n n fprintf(stderr,execl failed:%sn,strerror(errno);n return -1;n n exec

15、le和和execve,都使用了,都使用了char *envp來(lái)傳遞環(huán)境變量。來(lái)傳遞環(huán)境變量。在全部在全部6個(gè)函數(shù)中,只有個(gè)函數(shù)中,只有execle和和execve需要傳遞環(huán)境變需要傳遞環(huán)境變量,其它的量,其它的4個(gè)函數(shù)都沒(méi)有這個(gè)參數(shù),這并不意味著它們個(gè)函數(shù)都沒(méi)有這個(gè)參數(shù),這并不意味著它們不傳遞環(huán)境變量,這不傳遞環(huán)境變量,這4個(gè)函數(shù)將把默認(rèn)的環(huán)境變量不做任個(gè)函數(shù)將把默認(rèn)的環(huán)境變量不做任何修改地傳給被執(zhí)行的應(yīng)用程序。而何修改地傳給被執(zhí)行的應(yīng)用程序。而execle和和execve會(huì)會(huì)用指定的環(huán)境變量去替代默認(rèn)的那些。用指定的環(huán)境變量去替代默認(rèn)的那些。 Exec 函數(shù)族Exec 函數(shù)族進(jìn)程等待n 子進(jìn)

16、程的結(jié)束狀態(tài)返回后存于子進(jìn)程的結(jié)束狀態(tài)返回后存于status, 有幾個(gè)宏可判別結(jié)束情況:有幾個(gè)宏可判別結(jié)束情況:WIFEXITEDstatus)n 如果子進(jìn)程正常結(jié)束則為非如果子進(jìn)程正常結(jié)束則為非0 值。值。n WEXITSTATUSstatus)n 取得子進(jìn)程取得子進(jìn)程exit()返回的結(jié)束代碼,一()返回的結(jié)束代碼,一般會(huì)先用般會(huì)先用WIFEXITED 來(lái)判斷是否正常結(jié)束才能使用此宏。來(lái)判斷是否正常結(jié)束才能使用此宏。n WIFSIGNALEDstatus)n 如果子進(jìn)程是因?yàn)樾盘?hào)而結(jié)束則此宏值為真如果子進(jìn)程是因?yàn)樾盘?hào)而結(jié)束則此宏值為真n WTERMSIGstatus) n 取得子進(jìn)程因信號(hào)

17、而中止的信號(hào)代碼,一般會(huì)先用取得子進(jìn)程因信號(hào)而中止的信號(hào)代碼,一般會(huì)先用WIFSIGNALED 來(lái)判斷后才使用此宏。來(lái)判斷后才使用此宏。nWIFSTOPPEDstatus)n 如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用WUNTRACED 時(shí)才會(huì)有此情況。時(shí)才會(huì)有此情況。n WSTOPSIGstatus) n 取得引發(fā)子進(jìn)程暫停的信號(hào)代碼,一般會(huì)先取得引發(fā)子進(jìn)程暫停的信號(hào)代碼,一般會(huì)先用用WIFSTOPPED 來(lái)判斷后才使用此宏。來(lái)判斷后才使用此宏。進(jìn)程等待waitpidWaitpid 使用實(shí)例請(qǐng)根據(jù)流程圖,寫(xiě)出相應(yīng)的程序,請(qǐng)根據(jù)流程

18、圖,寫(xiě)出相應(yīng)的程序,并分別寫(xiě)出阻塞和非阻塞版本!并分別寫(xiě)出阻塞和非阻塞版本!n waitpid 和和 wait 的區(qū)別的區(qū)別 : n waitpid 提供了提供了 wait 函數(shù)不能實(shí)現(xiàn)的函數(shù)不能實(shí)現(xiàn)的 3 個(gè)功能個(gè)功能 : n 1 ) waitpid 等待特定的子進(jìn)程等待特定的子進(jìn)程 , 而而 wait 則返回則返回任一終止?fàn)顟B(tài)的子進(jìn)程第一個(gè)結(jié)束的進(jìn)程)任一終止?fàn)顟B(tài)的子進(jìn)程第一個(gè)結(jié)束的進(jìn)程) ; n 2 ) waitpid 提供了一個(gè)提供了一個(gè) wait 的非阻塞版本的非阻塞版本 ; n 3 ) waitpid 支持作業(yè)控制支持作業(yè)控制 ( 以以 WUNTRACED 選項(xiàng)選項(xiàng) )n它涉及到一些跟蹤調(diào)試方面的知識(shí),極它涉及到一些跟蹤調(diào)試方面的知識(shí),極少用到少用到 .思索n void mai

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論