linux進(jìn)程線程管理試驗(yàn)報(bào)告1_第1頁(yè)
linux進(jìn)程線程管理試驗(yàn)報(bào)告1_第2頁(yè)
linux進(jìn)程線程管理試驗(yàn)報(bào)告1_第3頁(yè)
linux進(jìn)程線程管理試驗(yàn)報(bào)告1_第4頁(yè)
linux進(jìn)程線程管理試驗(yàn)報(bào)告1_第5頁(yè)
已閱讀5頁(yè),還剩5頁(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、西安垂院操作系統(tǒng)LINUX實(shí)驗(yàn)報(bào)告題目1:崢_題目2:線程管理題目3:互斥.系部名稱:計(jì)算機(jī)學(xué)院專業(yè)名稱:軟件工程班級(jí)0802學(xué)號(hào)學(xué)生姓名:郭爽樂(lè)時(shí)間2010-10-31實(shí)驗(yàn)一:進(jìn)程管理實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)觀察、分析實(shí)驗(yàn)現(xiàn)象,深入理解進(jìn)程及進(jìn)程在調(diào)度執(zhí)行和內(nèi)存空間等方面的特點(diǎn),掌握在POSIX規(guī)范中fork和kill系統(tǒng)調(diào)用的功能和使用。二.實(shí)驗(yàn)要求2.1實(shí)驗(yàn)環(huán)境要求1 .硬件(1)主機(jī):PentiumIII以上;(2)內(nèi)存:128MB以上;(3)顯示器:VGA或更高;(4)硬盤空間:至少100MB以上剩余空間。2 .軟件Linux操作系統(tǒng),內(nèi)核2.4.26以上,預(yù)裝有X-Window、vi、gcc、

2、gdb和任意web瀏覽器。2.2實(shí)驗(yàn)前的準(zhǔn)備工作學(xué)習(xí)man命令的用法,通過(guò)它查看fork和kill系統(tǒng)調(diào)用的在線幫助,并閱讀參考資料,學(xué)會(huì)fork與kill的用法。復(fù)習(xí)C語(yǔ)言的相關(guān)內(nèi)容。三、實(shí)驗(yàn)內(nèi)容3.1補(bǔ)充POSIX下進(jìn)程控制的殘缺版實(shí)驗(yàn)程序3.2回答下列問(wèn)題:1.%2.你最初認(rèn)為運(yùn)行結(jié)果會(huì)怎么樣?2.%2 .實(shí)際的結(jié)果什么樣?有什么特點(diǎn)?試對(duì)產(chǎn)生該現(xiàn)象的原因進(jìn)行分析。3.%2 .proc_number這個(gè)全局變量在各個(gè)子進(jìn)程里的值相同嗎?為什么?4.%2.kill命令在程序中使用了幾次?每次的作用是什么?執(zhí)行后的現(xiàn)象是什么?5.%2.使用kill命令可以在進(jìn)程的外部殺死進(jìn)程。進(jìn)程怎樣能主動(dòng)

3、退出?這兩種退出方式哪種更好一些?四、實(shí)驗(yàn)結(jié)果1.1補(bǔ)充完全的源程序#include#include#include#include#include#defineMAX_CHILD_NUMBER10/*允許建立的子進(jìn)程個(gè)數(shù)最大值*/#defineSLEEP_INTERVAL1/*子進(jìn)程睡眠時(shí)間*/intproc_number=0;/*子進(jìn)程的編號(hào),從0開始*/voiddo_something();main(intargc,char*argv)(intchild_proc_number=MAX_CHILD_NUMBER;/*子進(jìn)程個(gè)數(shù)*/inti,ch;pid_tchild_pid;pid_tp

4、id1O=0;/*存放每個(gè)子進(jìn)程的id*/if(argc1)child_proc_number=atoi(argv1);child_proc_number=(child_proc_number10)?10:child_proc_number;/*命令行參數(shù)中麗一個(gè)參數(shù)表示辿立幾個(gè)子進(jìn)程,最多10個(gè)*/*建立child_proc_number個(gè)子進(jìn)程1子進(jìn)程要執(zhí)行2 proc_number=i;3 do_something();4父進(jìn)程把子進(jìn)程的id保存到pidi*/for(i=0;i0)pidi=child_pid;elseproc_number=i;do_something();/*讓用戶選

5、擇殺死哪個(gè)進(jìn)程。輸入數(shù)字(自編號(hào))表示殺死該進(jìn)程5輸入q退出*/while(ch=getchar()!=q)if(isdigit(ch)kill(pidch-0,SIGTERM);wait(&pidch-0);kill(0,SIGTERM);/*殺死本組的所有進(jìn)程*/return0;voiddo_something()for(;)printf(ThisisprocessNO.%*dn”,proc_number+3,proc_number);sleep(SLEEP_INTERAL);一一1.2回答上述實(shí)驗(yàn)內(nèi)容中的問(wèn)題.預(yù)期結(jié)果:會(huì)持續(xù)輸出0-9號(hào)進(jìn)程,直到輸入數(shù)字鍵+回車,則會(huì)殺死該進(jìn)程

6、,接下來(lái)的輸出將不會(huì)有該進(jìn)程號(hào),當(dāng)輸入q+回車,則退出程序。.實(shí)際結(jié)果:與預(yù)期差不多,因輸入進(jìn)程總數(shù)20大于設(shè)定的最大進(jìn)程數(shù),因此按進(jìn)程數(shù)10來(lái)處理。隨機(jī)輸出0-9號(hào)進(jìn)程,sleep(SLEEP_INTERAL),循環(huán)輸出,直至IJ輸入數(shù)字鍵,則會(huì)殺死該數(shù)字對(duì)應(yīng)的進(jìn)程,直到輸入q退出循環(huán),然后殺死本組所有進(jìn)程。分析:每創(chuàng)建一個(gè)子進(jìn)程時(shí),將其pid存儲(chǔ)在pidi中,i存儲(chǔ)在proc_number,然后調(diào)用死循環(huán)函數(shù)do_something(),輸出該進(jìn)程的代號(hào)proc_number;當(dāng)輸入數(shù)字鍵時(shí),主進(jìn)而會(huì)執(zhí)行kill(pidch-0,SIGTERM),從而殺死(ch-0)號(hào)進(jìn)程。當(dāng)輸入q時(shí)循環(huán)

7、退出,kill(0,SIGTERM),殺死本組所有進(jìn)程。程序退出。.proc_number這個(gè)全局變量在各個(gè)子進(jìn)程里的值相同,因?yàn)樽舆M(jìn)程相互獨(dú)立,資源互示影響。.kill命令在程序中使用了2次:kill(pidch-0,SIGTERM);kill(0,SIGTERM);第一次是殺死該進(jìn)程號(hào)pidch-O,執(zhí)行后接下來(lái)的結(jié)果中不會(huì)有該進(jìn)程號(hào),用另一個(gè)終端打開,使用命令psaux|grepprocess,因?yàn)樽舆M(jìn)程先于父進(jìn)程退出,則被殺死的進(jìn)程為僵死狀態(tài),但我加了行代碼wait(&pidch-0),就會(huì)使該子進(jìn)程真正結(jié)束。第二次是殺死本組所有進(jìn)程。即主進(jìn)程以及它創(chuàng)建的所有子進(jìn)程。執(zhí)行后程序

8、退出,進(jìn)程結(jié)束。.進(jìn)程在main函數(shù)中return,或調(diào)用exit()函數(shù)都可以正常退出。而使用kill命令則是異常退出。當(dāng)然是正常退出比較好,若在子進(jìn)程退出前使用kill命令殺死其父進(jìn)程,則系統(tǒng)會(huì)讓init進(jìn)程接管子進(jìn)程。當(dāng)用kill命令使得子進(jìn)程先于父進(jìn)程退出時(shí),而父進(jìn)程又沒(méi)有調(diào)用wait函數(shù)等待子進(jìn)程結(jié)束,子進(jìn)程處于僵死狀態(tài),并且會(huì)一直保持下去,直到系統(tǒng)重啟。子進(jìn)程處于僵死狀態(tài)時(shí),內(nèi)核只保存該進(jìn)程的必要信息以被父進(jìn)程所需,此時(shí)子進(jìn)程始終占著資源,同時(shí)減少了系統(tǒng)可以創(chuàng)建的最大進(jìn)程數(shù)。實(shí)驗(yàn)二:線程管理一.實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)觀察、分析實(shí)驗(yàn)現(xiàn)象,深入理解線程及線程在調(diào)度執(zhí)行和內(nèi)存空間等方面的特點(diǎn),并掌

9、握線程與進(jìn)程的區(qū)別。 掌握在POSIX規(guī)范中pthread_create()函數(shù)的功能和使用方法。二.實(shí)驗(yàn)要求2.1實(shí)驗(yàn)環(huán)境要求.硬件(1)主機(jī):PentiumIII以上;(2)內(nèi)存:128MB以上;(3)顯示器:VGA或更高;(4)硬盤空間:至少100MB以上剩余空間。.軟件Linux操作系統(tǒng),內(nèi)核2.4.26以上,預(yù)裝有X-Window、vi、gcc、gdb和任意web瀏覽器。2.2實(shí)驗(yàn)前的準(zhǔn)備工作閱讀參考資料,了解線程的創(chuàng)建等相關(guān)系統(tǒng)調(diào)用。三、實(shí)驗(yàn)內(nèi)容補(bǔ)充POSIX下進(jìn)程控制的殘缺版實(shí)驗(yàn)程序回答下列問(wèn)題:.你最初認(rèn)為前三列數(shù)會(huì)相等嗎?最后一列斜杠兩邊的數(shù)字是相等,還是大于或者小于關(guān)系?.

10、最后的結(jié)果如你所料嗎?有什么特點(diǎn)?試對(duì)原因進(jìn)行分析。.thread的CPU占用率是多少?為什么會(huì)這樣?.thread_worker()內(nèi)是死循環(huán),它是怎么退出的?你認(rèn)為這樣退出好嗎?四、實(shí)驗(yàn)結(jié)果補(bǔ)充完全的源程序#include#include#include#include#include#defineMAX_THREAD3/*線程的個(gè)數(shù)*/unsignedlonglongmain_counter,counterMAX_THREAD;/*unsignedlonglong是比long還長(zhǎng)的整數(shù)*/void*thread_worker(void*);intmain(intargc,charargv

11、)inti,rtn;charch;pthread_tpthread_idMAX_THREAD=0;/*存放每個(gè)線程的id*/for(i=0;iMAX_THREAD;i+)pthread_create(&pthread_idi,NULL,thread_worker,(void*)i);/*用pthread_create建一個(gè)普通的線程,線程id存入pthread_idi,線程執(zhí)行的函數(shù)是thread_worker,并i作為參數(shù)傳遞給線程*/*用戶按一次回車執(zhí)行下面的循環(huán)體一次。按q退出*/dounsignedlonglongsum=0;for(i=0;iMAX_THREAD;i+)sum

12、+=counteri;/*求所有線程的counter的和*/printf(counter%d=%llun,i,counteri);printf(main_counter=%llu/sum=%llun,main_counter,sum);while(ch=getchar()!=q);return0;void*thread_worker(void*p)intthread_num;thread_num=(int)p;/*把main中的i的值傳遞給thread_num*/for(;)main_counter+;counterthread_num+;4.3回答上述實(shí)驗(yàn)內(nèi)容中的問(wèn)題.試驗(yàn)運(yùn)行前我認(rèn)為前三列

13、數(shù)不會(huì)相等,因?yàn)槿齻€(gè)線程運(yùn)行次數(shù)是隨機(jī)的,結(jié)果不可預(yù)料, 當(dāng)然counteri值不會(huì)一定相等。 而我認(rèn)為main_counter與sum值應(yīng)該是相等的。因?yàn)槎际侨齻€(gè)線程的counter之和。.而實(shí)驗(yàn)結(jié)果是前三列數(shù)確實(shí)不相等。不過(guò)main_counter與sum的值也不相等,main_countersum,經(jīng)分析討論得出解釋:因?yàn)槿齻€(gè)線程在共同爭(zhēng)取運(yùn)行thread_worker()函數(shù),比如main_counter初值為0,pthread_id0執(zhí)行之后main_counter+1,止匕時(shí)還未來(lái)得及將值賦給main_counter,這時(shí)的main_counter還是0;pthread_id1也執(zhí)

14、行這個(gè)函數(shù),main_counter+1,若此時(shí)在1號(hào)線程將main_counter+1的值還未賦給main_counter,即這時(shí)的main_counter還是0,pthread_id2也來(lái)執(zhí)行這個(gè)函數(shù),main_counter+1,此時(shí)三個(gè)線程才將加完之后的值賦給main_counter,則main_counter=0+1=1,而真正執(zhí)行次數(shù)sum=0+1+1+1=3。main_countersunrb.thread的CPU占用率在我的機(jī)子上執(zhí)行結(jié)果是181,因?yàn)槿齻€(gè)線程是無(wú)限循環(huán)的運(yùn)行,使得cpu占用率很高。.thread_worker()函數(shù)內(nèi)是死循環(huán),退出時(shí)因?yàn)橹骱瘮?shù)中設(shè)置的輸入q時(shí)

15、循環(huán)退出。輸仄q時(shí)主進(jìn)程執(zhí)行退出,return退出程序,則子線程也強(qiáng)制退出。這樣退出不好。實(shí)驗(yàn)三:互斥一.實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)觀察、分析實(shí)驗(yàn)現(xiàn)象,深入理解理解互斥鎖的原理及特點(diǎn)掌握在POSIX規(guī)范中的互斥函數(shù)的功能及使用方法二.實(shí)驗(yàn)要求2.1實(shí)驗(yàn)環(huán)境要求.硬件(1)主機(jī):PentiumIII以上;(2)內(nèi)存:128MB以上;(3)顯示器:VGA或更高;(4)硬盤空間:至少100MB以上剩余空間。.軟件Linux操作系統(tǒng),內(nèi)核2.4.26以上,預(yù)裝有X-Window、vi、gcc、gdb和任意web瀏覽器。2.2實(shí)驗(yàn)前的準(zhǔn)備工作準(zhǔn)備好上節(jié)實(shí)驗(yàn)完成的程序thread.c。閱讀參考資料,了解互斥鎖的加解鎖機(jī)

16、制及相關(guān)的系統(tǒng)調(diào)用三、實(shí)驗(yàn)內(nèi)容找到thread.c的代碼臨界區(qū),用臨界區(qū)解決main_counter與sum不同步的問(wèn)題。閱讀下列代碼,回答問(wèn)題:#include#include#include#include#include#defineLOOP_TIMES1000pthread_mutex_tmutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex2=PTHREAD_MUTEX_INITIALIZER;void*thread_worker(void*);voidcritical_section(intthreadd_num,inti);in

17、tmain(intargc,char*argv)intrtn,i;pthread_tpthread_id=0;rtn=pthread_create(&pthread_id,NULL,thread_worker,NULL);if(rtn!=0)printf(pthread_createERROR!n);return-1;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);critical_section(1,i);pthread_mutex_unlock(&m

18、utex2);pthread_mutex_unlock(&mutex1);pthread_mutex_destroy(&mutex1);pthread_mutex_destroy(&mutex2);return0;void*thread_worker(void*p)inti;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex2);pthread_mutex_lock(&mutex1);critical_section(2,i);pthread_mutex_unlock(&mutex2);pthread

19、_mutex_unlock(&mutex1);)一一)voidcritical_section(intthread_num,inti)printf(Thread%d:%dn,thread_num,i);一.你預(yù)想deadlock.c的運(yùn)行結(jié)果會(huì)如何?.deadlock.c的實(shí)際運(yùn)行結(jié)果如何?多次運(yùn)行每次的現(xiàn)象都一樣嗎?為什么會(huì)這樣?四、實(shí)驗(yàn)結(jié)果通過(guò)加鎖可修改thread.c程序,使得main_counter與sum值同步,源代碼如#include#include#include#include#include#defineMAX_THREAD3unsignedlonglongmain_

20、counter,counterMAX_THREAD;void*thread_worker(void*);pthreadmutextmaincountermutex=PTHREADMUTEXINITIALIZER;pthreadmutextcountermutex=PTHREADMUTEXINITIALIZER;intmain(intargc,charargv)inti,rtn;charch;pthread_tpthread_idMAX_THREAD=0;for(i=0;iMAX_THREAD;i+)pthread_create(&pthread_idi,NULL,thread_work

21、er,(void*)i);dounsignedlonglongsum=0;pthread_mutex_lock(&counter_mutex);for(i=0;iMAX_THREAD;i+)-sum+=counteri;printf(counter%d=%llun,i,counteri);printf(main_counter=%llu/sum=%llun,main_counter,sum);pthread_mutex_unlock(&counter_mutex);while(ch=getchar()!=q);return0;void*thread_worker(void*p)

22、intthread_num;thread_num=(int)p;for(;)pthreadmutexlock(&maincountermutex);main_counter+;pthreadmutexunlock(&maincountermutex);pthreadmutexlock(&countermutex);counterthread_num+;pthreadmutexunlock(&countermutex);回答上述實(shí)驗(yàn)要求中的問(wèn)題:.程序運(yùn)行會(huì)出現(xiàn)中止現(xiàn)象,可能會(huì)資源互斥。.實(shí)際運(yùn)行時(shí)程序會(huì)在運(yùn)行期間中止,出現(xiàn)死鎖現(xiàn)象。多次運(yùn)行之后現(xiàn)象都一樣。解釋如

23、下:主線程中請(qǐng)mutex1資源,而子線程中請(qǐng)mutex2資源,此時(shí)主線程繼續(xù)申請(qǐng)mutex2資源, 子線程來(lái)申請(qǐng)mutex1資源, 而mutex2資源還未被子線程釋放, 主線程無(wú)法申請(qǐng)到,同樣的,mutex1資源未被主線程釋放則子線程也無(wú)法中請(qǐng)到, 此時(shí)便處于無(wú)限循環(huán)等待,形成死鎖。修改后的程序:#include#include#include#include#include#defineLOOP_TIMES1000pthread_mutex_tmutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex2=PTHREAD_MUTEX_INITIALIZER;void*t

溫馨提示

  • 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)論