資源描述:
《實驗三020740309趙玉健》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實驗三:Windows線程及其調(diào)度觀察一、實驗目的:讓同學們了解什么是線程,操作系統(tǒng)是如何調(diào)度它們的。二、實驗要求:程序使用C語言實現(xiàn)。三、實驗過程及程序?qū)崿F(xiàn)intmain(){ inti; if(fork()==0) { for(i=1;i<3;i++) printf("Thisischildprocess"); } else { for(i=1;i<3;i++) printf("Thisisparentprocess"); }} 執(zhí)行結(jié)果為:ThisischildprocessThisischildproces
2、sThisisparentprocessThisisparentprocess fork在英文中是“分叉”的意思,這個名字取得很形象。一個進程在運行中,如果使用了fork,就產(chǎn)生了另一個進程,于是進程就“分叉”了。當前進程為父進程,通過fork()會產(chǎn)生一個子進程。對于父進程,fork函數(shù)返回子程序的進程號而對于子程序,fork函數(shù)則返回零,這就是一個函數(shù)返回兩次的本質(zhì)??梢哉f,fork函數(shù)是Unix系統(tǒng)最杰出的成就之一,它是七十年代Unix早期的開發(fā)者經(jīng)過理論和實踐上的長期艱苦探索后取得的成果?! ∪绻覀儼焉鲜龀绦蛑械难h(huán)放的大一
3、點:intmain(){ inti; if(fork()==0) { for(i=1;i<10000;i++) printf("Thisischildprocess"); } else { for(i=1;i<10000;i++) printf("Thisisparentprocess"); }} 則可以明顯地看到父進程和子進程的并發(fā)執(zhí)行,交替地輸出“Thisischildprocess”和“Thisisparentprocess”?! 〈藭r此刻,我們還沒有完全理解fork()函數(shù),再來看下面的一段程序,看看究竟會
4、產(chǎn)生多少個進程,程序的輸出是什么?intmain(){ inti; for(i=0;i<2;i++) { if(fork()==0) { printf("Thisischildprocess"); } else { printf("Thisisparentprocess"); } }} exec 在Linux中可使用exec函數(shù)族,包含多個函數(shù)(execl、execlp、execle、execv、execve和execvp),被用于啟動一個指定路徑和文件名的進程?! xec函數(shù)族的特點體現(xiàn)在:某進程一旦
5、調(diào)用了exec類函數(shù),正在執(zhí)行的程序就被干掉了,系統(tǒng)把代碼段替換成新的程序(由exec類函數(shù)執(zhí)行)的代碼,并且原有的數(shù)據(jù)段和堆棧段也被廢棄,新的數(shù)據(jù)段與堆棧段被分配,但是進程號卻被保留。也就是說,exec執(zhí)行的結(jié)果為:系統(tǒng)認為正在執(zhí)行的還是原先的進程,但是進程對應的程序被替換了?! ork函數(shù)可以創(chuàng)建一個子進程而當前進程不死,如果我們在fork的子進程中調(diào)用exec函數(shù)族就可以實現(xiàn)既讓父進程的代碼執(zhí)行又啟動一個新的指定進程,這實在是很妙的。fork和exec的搭配巧妙地解決了程序啟動另一程序的執(zhí)行但自己仍繼續(xù)運行的問題,請看下面的例子
6、:charcommand[MAX_CMD_LEN];voidmain(){ intrtn;/*子進程的返回數(shù)值*/ while(1) { /*從終端讀取要執(zhí)行的命令*/ printf(">"); fgets(command,MAX_CMD_LEN,stdin); command[strlen(command)-1]=0; if(fork()==0) { /*子進程執(zhí)行此命令*/ execlp(command,command); /*如果exec函數(shù)返回,表明沒有正常執(zhí)行命令,打印錯誤信息*/ perror(c
7、ommand); exit(errorno); } else { /*父進程,等待子進程結(jié)束,并打印子進程的返回值*/ wait(&rtn); printf("childprocessreturn%d",rtn); } }} 這個函數(shù)基本上實現(xiàn)了一個shell的功能,它讀取用戶輸入的進程名和參數(shù),并啟動對應的進程?! lone clone是Linux2.0以后才具備的新功能,它較fork更強(可認為fork是clone要實現(xiàn)的一部分),可以使得創(chuàng)建的子進程共享父進程的資源,并且要使用此函數(shù)必須在編譯內(nèi)核
8、時設置clone_actually_works_ok選項?! lone函數(shù)的原型為:intclone(int(*fn)(void*),void*child_stack,intflags,void*arg)