實驗三020740309趙玉健

實驗三020740309趙玉健

ID:11558373

大小:53.00 KB

頁數(shù):9頁

時間:2018-07-12

實驗三020740309趙玉健_第1頁
實驗三020740309趙玉健_第2頁
實驗三020740309趙玉健_第3頁
實驗三020740309趙玉健_第4頁
實驗三020740309趙玉健_第5頁
資源描述:

《實驗三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)

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。