Linux編程徐欽桂課后參考答案_第1頁
Linux編程徐欽桂課后參考答案_第2頁
Linux編程徐欽桂課后參考答案_第3頁
Linux編程徐欽桂課后參考答案_第4頁
Linux編程徐欽桂課后參考答案_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章8.答:ls–a顯示當(dāng)前目錄下所有文件信息,包括隱藏文件,而”.”、”.”分別為當(dāng)前目錄及其父目錄,是從當(dāng)前目錄下可以訪問的,因此作為兩個項目放置在當(dāng)前目錄列表中。9.答:當(dāng)前用戶為can,當(dāng)前工作目錄為/home/can/work時,則文件/home/can/work/lib/wrapper.h的相對路徑是lib/wrapper.h,文件~/a.out的絕對路徑是/home/can/work/a.out。12.答:(1)mkdirworkcp-rf/home/NachOS-4.1work(2)rm-rf/home/can/work/NachOS-4.1/14.答:(1)0644(2)rwxr-xr-x,075515.答:(1)rmf**.o(2)ls??20.答:命令及輸出當(dāng)前用戶對目錄/root缺少何種缺陷所致$cd/rootbash:cd:/root:Permissiondenied缺少x權(quán)限$ls/rootls:cannotopendirectory/root:Permissiondenied缺少r權(quán)限$mkdir/root/workmkdir:cannotcreatedirectory‘/root/work’:Permissiondenied缺少w權(quán)限21.答:(1)john的家在/home/john;root的家在/root(2)若當(dāng)前工作目錄是/home/john,mike的相對路徑為../mike,絕對路徑為/home/mikeusr的相對路徑為../../usr,絕對路徑為/usr第3章17.解: 4complexparampraram2param1PHONE=10086第4章1.答:modeumask實際權(quán)限077700220755066600770600S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTHS_IWGRP|S_IWOTH06443.答:(1)abcd(2)abcd1234ijklmnopqrstuvwxyz4.答:定位前位置定位操作定位后指針位置50lseek(fd,20,SEEK_SET);2050lseek(fd,-20,SEEK_SET);5050lseek(fd,-20,SEEK_CUR);3050lseek(fd,20,SEEK_END);7050lseek(fd,120,SEEK_END);17050lseek(fd,-120,SEEK_CUR);505.答:ABCDEFGHIJ12345OPQRST8.答:123456799.答:會包含亂碼,因為結(jié)構(gòu)體中的整數(shù)20、2000、25、3000以二進(jìn)制形式寫入文件后,gedit以文本方式打開時,這些值可能不是可打印字符。10.答:將變量所在存儲區(qū)內(nèi)容直接寫入文件,占據(jù)文件存儲區(qū)會小一些,而轉(zhuǎn)換成字符串寫入時,文件會大一些。11.答:f2出現(xiàn)亂碼,因為文件f2的內(nèi)容是整數(shù)30000的值,2個字節(jié),16進(jìn)制字節(jié)值分別為0xC3和0x50,其中C3超過了7f,將顯示為亂碼。14.答:fd3=415.答:fd1=3fd4=4fd3=5fd4=016.答:intfd;fd=open("dup2.c",O_RDONLY,0);dup2(fd1,0)18.答:先從1號磁盤塊讀出”/”的目錄表,找到etc行,獲得etc目錄表所在磁盤塊號7;然后將7號磁盤塊度如內(nèi)存,從中找到passwd行,獲得passwd數(shù)據(jù)所在磁盤塊號192;最后將192號磁盤塊內(nèi)容讀入內(nèi)存,從中讀出passwd第1行19.答:INT(pos/512)20.答:先歸還文件分配給f2存儲數(shù)據(jù)的磁盤塊2和7,再在can的目錄表中刪去f2的屬性行21.答:(1)相對塊號為:INT(1000/512)=1INT(1499/512)=2對應(yīng)的盤塊號為7、11因此,需讀盤2次,將7、11號盤塊讀入內(nèi)存。(2)相對塊號為:INT(2000/512)=3INT(2499/512)=4對應(yīng)的盤塊號為25、87因此,需執(zhí)行2次讀盤和2次寫盤操作,磁盤塊25、87被更新了。22.答:(1)254*64/512=31.75,分解前查找該目錄中某個文件控制塊的平均訪問磁盤次數(shù)為16.5254*10/512=4.96,分解后查找該目錄中某個文件控制塊的平均訪問磁盤次數(shù)為326.答:設(shè)置一個當(dāng)前目錄,可大大減少打開一個文件時,需要搜索的目錄數(shù)。27.答:(1)邏輯地址磁盤塊號019120221322(2)INT(1000/512)=1,在20號盤塊中28.解:(1)邏輯地址磁盤塊號0911621310425(2)INT(1000/512)=1,數(shù)據(jù)在16號盤塊中(3)略29.解:(1)256MB/4KB=64K64K*16/2=128KB(2)500MB/1KB=500K500K*16/2=1MB30.解:(10+1024+10242+10243)×4KB=40KB+4MB+4GB+4TB31.解:(1)INT(9000/4K)=2,數(shù)據(jù)塊的磁盤塊號登記在addr(2)中,為直接索引,僅需讀1個磁盤塊(2)INT(180000/4K)=43,數(shù)據(jù)塊登記在一級間接索引塊狀,需讀2次磁盤塊(3)INT(4200000/4K)=1025,1025-10<1023,數(shù)據(jù)塊登記在一級間接索引塊狀,需讀2次磁盤塊32.解:(1)分配34、54號磁盤塊(2)將行18、列12的位清033.解:(1)12、56、49、50、51(2)334、404、405、78236.答:loc1=10ch=k,loc2=2740.答:open()執(zhí)行過程:當(dāng)程序中執(zhí)行open函數(shù)打開時文件時,系統(tǒng)首先檢查該文件的v_node是否存在,若不存在,則先為其創(chuàng)建其v_node,將文件的屬性從外存讀入v-node;接著,創(chuàng)建其文件表(filetable)表項,設(shè)置讀寫方式、讀寫位置、v-node指針,訪問計數(shù)器置為1;然后,在進(jìn)程的描述符表中找到索引號最小的空閑表項,在其中填入文件表表項的指針,返回描述符表項的索引號。close()執(zhí)行過程:先檢查fd指向的文件對象,其計數(shù)器大于1,則減1,否則撤銷文件對象;然后檢查對應(yīng)的v-node,如果其計數(shù)器大于1,則減1,否則撤銷v-node;最后將fd對應(yīng)的描述符置為空閑。如果撤銷v-node,應(yīng)將變化后的內(nèi)容更新到外存。41.答:Theoldfd1filedescriptor=3Theoldfd2filedescriptor=4Thenewfdfiledescriptor=5Thenewfd2filedescriptor=0Ihavereadfroma.txt:abcdefgh42.答:060143.解:89abc44.答:fd1=3fd2=4fd3=345.答: fd2=546.答: c1=s c2=s47.解: fd2=4 fd3=048.解:2016LINUXEXAMGOOD!GOOD!49.解:(1)M=(M2-M1)/N(2)func真實執(zhí)行時間T測量誤差δ=|Δ1+Δ2|/N,由于Δ1為不變值,通過增大N可減少測量誤差51.答:100/512=19.53邏輯塊號為1953.答:分解式目錄當(dāng)前目錄54.解:(1)pos,pos+len-1(2)~55.解:(1)pos,pos+len-1(2)~56.解:(1)500/8=62.5,需要63字節(jié)(2)16i+j57.解:(1)起始字節(jié)相對塊號9000/1024=8.7即8號塊末字節(jié)相對塊號10024/1024=10.25,為10號塊要讀8、9.、10三個數(shù)據(jù)塊 8、9號數(shù)據(jù)塊分別位于addr(8)和addr(9)號索引塊中10號數(shù)據(jù)塊位于一級間接索引下共需讀4次磁盤,三個數(shù)據(jù)塊,一個索引塊(2)起始字節(jié)相對塊號180000/1024=175.78即175號塊末字節(jié)相對塊號10024/1024=177.24,為177號塊 要讀175、176、177三個數(shù)據(jù)塊,它們都在一級間接索引塊狀。 共需讀4次磁盤,三個數(shù)據(jù)塊,一個索引塊(3)起始字節(jié)相對塊號4200000/1024=4101.5即4101號塊 末字節(jié)相對塊號4201499/1024=4103.02,為4103號塊 要讀4101、4102、4103三個數(shù)據(jù)塊 4102-1034=30683068%1024=1020 三個數(shù)據(jù)塊登記在二級間接索引的同一索引塊下 需讀盤5次,三個數(shù)據(jù)塊,2次索引塊58.解:(1)3555(2)(62,8)59.答:14160.答:(1)文件Wang的路徑是/D/DC/DDA/Wang(2)系統(tǒng)需要讀取4個目錄文件后才能查到Wang:/、/D、/D/DC、/D/DC/DDA(3)系統(tǒng)找到文件Wang,至少需讀7個磁盤塊(4)采用分解法管理文件目錄61.答:組織方式在開始增加一塊在中間增加一塊在末端增加一塊在開始刪除一塊在中間刪除一塊在末端刪除一塊連續(xù)1015119949或500鏈接150100150100單級索引111000第5章5.1答:ABBC5.2答:無運行阻塞狀:運行中才能執(zhí)行等待事件的操作無阻塞就緒狀:等待事件發(fā)生后,CPU可能被其他進(jìn)程占用,被喚醒進(jìn)程加入就緒隊列,就不會出現(xiàn)沖突5.3答: scanf:導(dǎo)致調(diào)用進(jìn)程從運行到阻塞 fork:導(dǎo)致調(diào)用進(jìn)程從運行到就緒 read、write、、wait、sleep、pause:導(dǎo)致調(diào)用進(jìn)程從運行到阻塞 exit:導(dǎo)致調(diào)用進(jìn)程從運行到終止5.9答:父:x=0子:x=2x=15.11答: 只有p1和p11一定并發(fā)5.12答exfork1.c:16行exfork2.c:4行exfork3.c:無窮多行5.14答:6種:abcbcacabacbbaccba5.15答:3種Hello10Bye2ByeHello01Bye2ByeHello1Bye02Bye5.20答:1)x=0;y=10;z=y/x;2)int*p;*p=100;5.25答:可能輸出結(jié)果:2種2111215.26.答:(1)包含哪些屬性:…(2)不可少屬性:進(jìn)程狀態(tài)、存儲器信息、CPU現(xiàn)場信息5.27.答:就緒:進(jìn)程獲得除CPU之外的所有資源,一旦獲得CPU即可運行運行:進(jìn)程獲得所需一切資源,正在CPU上運行阻塞:進(jìn)程在等待資源或事件5.28答:(1)運行到就緒:時間片用完(2)創(chuàng)建到就緒:執(zhí)行fork(3)運行到阻塞:printf、scanf、read(4)阻塞到就緒:用戶提供了輸入、printf輸出完成、進(jìn)程獲得read想讀的信息(5)運行到終止:調(diào)用exit、調(diào)用abort、收到9號信號、用戶按下Ctrl_C5.29答:進(jìn)程控制塊進(jìn)程狀態(tài)進(jìn)程隊列fork創(chuàng)建一個新PCB新PCB狀態(tài)為ready新PCB進(jìn)入就緒隊列exit當(dāng)前進(jìn)程歸還多數(shù)系統(tǒng)資源當(dāng)前進(jìn)程狀態(tài)變?yōu)榻K止?fàn)顟B(tài)運行進(jìn)程從運行隊列退出wait被回收進(jìn)程PCB撤銷調(diào)用進(jìn)程進(jìn)入阻塞狀態(tài)調(diào)用進(jìn)程進(jìn)入阻塞隊列5.33答:90種5.33答:8行5.34答:6行5.35答:三種:4324232435.36答:3行5.37答:2n行5.38答:12鐘 axbcaxcbbcaxcbaxbaxccaxb acxbacbxabxcabcxacbxabcx5.39答:5.40答:5.41答:234hellofatherprocess5.42答:原因:用戶點按Cntl_C時,子進(jìn)程收也先收到了SIGINT信號,按缺省方式處理而終止,當(dāng)父進(jìn)程向子進(jìn)程發(fā)送SIGINT信號時,子進(jìn)程已經(jīng)終止修改方法是創(chuàng)建子進(jìn)程前,忽略SIGINT信號,代碼如下:pid_tpid;voidpa(intsig){kill(pid,SIGUSR1);}voidchild(intsig){if(sig==SIGUSR1){printf("killedbypaprocess);exit(0);}intmain(){signal(SIGINT,SIG_IGN);pid=fork();if(pid==0){usleep(1);signal(SIGUSR1,child);pause();exit(0);}else{signal(SIGINT,pa);pause();exit(0);}}5.43答:ACE5.45答:(1)父子進(jìn)程都有兩種輸出:abcdefghij(2)abcde(3)cdefghijkljklmn5.46.答:父進(jìn)程:90子進(jìn)程1:30子進(jìn)程2:80 第6章6.2.答:A.原因是對等線程尚未執(zhí)行printf操作,主線程執(zhí)行exit(0)已經(jīng)讓進(jìn)程終止了,進(jìn)程終止時也終止了所有線程B.pthread_exit(NULL)或pthread_join(tid,NULL);C.僅去掉exit(0)并不能修復(fù)該錯誤,因為如果一個程序的main函數(shù)最后沒有exit(0)函數(shù)調(diào)用,編譯程序會自動添加exit(0)函數(shù)調(diào)用6.3.答:主線程和對等線程每執(zhí)行一次循環(huán)迭代就調(diào)用printf函數(shù)輸出一行,就執(zhí)行usleep睡眠阻塞,放棄CPU,另一個線程獲得CPU也執(zhí)行一次循環(huán)迭代,調(diào)用printf打印一行,這樣兩個線程的輸出就交錯顯示。6.4答:(1)變量運行實例有:pointer,i.m,tid.m,messages[0].m,messages[1].m,vargp.t0,vargp.t1,mytid.t0,mytid.t1,count(2)變量運行實例引用情況:pointer:m,t0,t1messages[0].m:m,t0messages[1].m,:m,t1count:t0,t1tid.m:main,i.m:mainmytid.t0,vargp.t0:t0mytid.t1,vargp.t1:t1(3)共享變量有:pointer,messages[0].m,messages[1],count6.6答:模式1結(jié)果模式3結(jié)果模式5結(jié)果S1柜臺1賣出票號8S1柜臺1賣出票號8S2柜臺2賣出票號8T1ticket=7S2柜臺2賣出票號8S1柜臺1賣出票號8S2柜臺2賣出票號7T1ticket=7S2ticket=7T2ticket=6T2ticket=6T2ticket=6模式2結(jié)果模式4結(jié)果模式6結(jié)果S2柜臺2賣出票號8S2柜臺2賣出票號8S1柜臺1賣出票號8T2ticket=7S1柜臺1賣出票號8S2柜臺2賣出票號8S1柜臺1賣出票號7T2ticket=7T2ticket=7T1ticket=6T1ticket=6T1ticket=66.7.答:步驟線程指令%eax1%eax2count11H1--021R10-032H20-042R200052C201062W201171C111181W111191T1111102T21116.8.答:隨niters增大,循環(huán)和用時不斷增加,很難在分配給線程的一個CPU時間片內(nèi)完成循環(huán)的執(zhí)行,在執(zhí)行序列R1、C1、W1或R2、C2、W2中間發(fā)生CPU切換,因此開始出現(xiàn)錯誤結(jié)果。6.9.答:(1)線程1的指令R1或R1、C1后,該線程時間片用完,CPU分配給線程2使用;(2)CPU切換的時機有:中斷到達(dá)、優(yōu)先級更高的任務(wù)到達(dá)等。6.10.答:答:(1)原語:原因一般是操作某種特殊共享變量的例程,一般有操作系統(tǒng)內(nèi)核實現(xiàn),其特點是由系統(tǒng)內(nèi)核采用某種手段對同一共享變量的原語例程調(diào)用完全錯開執(zhí)行,保證執(zhí)行原語的并發(fā)流以非并發(fā)方式操作共享變量。(2)原語可用于實現(xiàn)不允許并發(fā)執(zhí)行的函數(shù)例程,如信號量的P、V操作以及用于進(jìn)程在不同狀態(tài)轉(zhuǎn)換的控制函數(shù)。6.11答:max(r-m+n,0)6.12答:答:(1)互斥:任何時候最多只能允許一個線程進(jìn)入臨界區(qū);(2)有限等待:當(dāng)一個線程在等待隊列掛起時,最多等待前面線程完成臨界區(qū)執(zhí)行時間;(3)空閑請進(jìn):若無線程在臨界區(qū)執(zhí)行,一個請求線程立即進(jìn)入其臨界區(qū);(4)讓權(quán)等待:臨界資源忙時,請求線程立即掛起,釋放處理器,避免“循環(huán)測試”6.13解:設(shè)置互斥信號量mutexsemaphoremutex=1;void*increase(void*vargp){unsignedlonglongi,niters=(int)vargp;for(i=0;i<niters;i++){wait(mutex); count++;signal(mutex);}returnNULL;}void*decrease(void*vargp){unsignedlonglongi,niters=(int)vargp);for(i=0;i<niters;i++){wait(mutex); count--;signal(mutex);}returnNULL;}6.14解:semaphoremutex=1;Process_EW(){wait(mutex);Process_EW(){wait(mutex); 過橋;signal(mutex);}Process_WE(){wait(mutex); 過橋;signal(mutex);}semaphoremutex1=mutex2=1,lots=100;//lots為車位數(shù)voidpark(){wait(lots);wait(mutex1);進(jìn)入停車場;signal(mutex1);找到車位停車駛離車位wait(mutex2);出停車場;signal(mutex2);signal(lots);}6.16解:semaphoremutex=1,seats=100;//seats為座位數(shù)voidreader(){wait(seats);wait(mutex);進(jìn)入閱覽室;signal(mutex);找到空座位坐下看書wait(mutex);出閱覽室;signal(mutex);signal(seats);}6.17.解:semaphores12=s13=s24=s34=0;P1(){P1(){T1;signal(s12);signal(s13);}P4(){wait(s23);wait(s24);P4(){wait(s23);wait(s24);T4;}P3(){wait(s13);T3;sgnal(s34);}P2(){wait(s12)T2;signal(s24);}6.18解:semaphoreplate=1,orange=apple=0;father(){while(1){洗水果wait(plate);放水果if(是蘋果)signal(apple);elsesignal(orange);}}Son(){while(1){wait(orrange);取橘子signal(plate);吃水果}}daughter(){while(1){wait(apple);取蘋果signal(plate);吃水果}}6.19.解void*counter(void*no){while(1){sem_wait(&mutex);if(tickets>0){ printf("柜臺%d賣出一張票,票號為%d\n",(int)no,tickets);usleep(1);tickets--;}else{sem_post(&mutex);break;}sem_post(&mutex);usleep(1);}}6.20.解:sem_tmutex=1;void*increase(void*vargp){unsignedlonglongi,niters=(int)vargp;for(i=0;i<niters;i++){sem_wait(&mutex); count++;sem_post(&mutex);}returnNULL;}void*decrease(void*vargp){unsignedlonglongi,niters=(int)vargp;for(i=0;i<niters;i++){sem_wait(&mutex); count--;sem_post(&mutex);}returnNULL;}voidmain(){…sem_init(&mutex,0,1);..}6.21解:pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;void*increase(void*vargp){unsignedlonglongi,niters=(int)vargp;for(i=0;i<niters;i++){pthread_mutex_lock(&mutex); count++;pthread_mutex_lock(&mutex);}returnNULL;}void*decrease(void*vargp){unsignedlonglongi,niters=(int)vargp;for(i=0;i<niters;i++){pthread_mutex_lock(&mutex); count--;pthread_mutex_lock(&mutex);}returnNULL;}voidmain(){…sem_init(&mutex,0,1);..}6.24答:因為雖然多線程都應(yīng)用了共享變量x、r1、r2,但沒有對齊進(jìn)行并發(fā)讀寫操作,因此不需進(jìn)行同步干預(yù)6.25.答:(1)inpos:所有生產(chǎn)者線程共享outpos:所有消費者線程共享buf數(shù)組及其元素:所有生產(chǎn)者、消費者線程共享(2)voidThread_Pi()//生產(chǎn)者線程,有k個{intitem;while(1){item=produce();//產(chǎn)生數(shù)據(jù)wait(slots);wait(mutex1);sbuf_insert(item,buf);//向緩沖區(qū)存放數(shù)據(jù)signal(mutex1);signal(items);}}voidThread_Ci()//消費者線程,有m個{intitem;while(1){wait(items);wait(mutex2);item=sbuf_remove(buf);//從緩沖區(qū)取數(shù)據(jù)signal(mutex2);signal(slots);consume(item);//消費或處理數(shù)據(jù)}}6.26答:A.p=1,c=1,n>1:兩個互斥信號量都可省去B.p=1,c=1,n=1:兩個互斥信號量皆可省去C.p>1,c>1,n=1:兩個互斥信號量都不可省D.p>1,c=1,n>1:消費者的互斥信號量可省去6.28.答:semaphoremutex=1,locs=2,orange=apple=0;;father(){while(1){洗蘋果wait(locs);wait(mutex);放蘋果signal(mutex);Signal(orange);}}Mather(){while(1){洗橘子wait(locs);wait(mutex);放橘子signal(mutex);Signal(orange);}}Son(){while(1){wait(orrange);wait(mutex);取橘子signal(mutex);signal(plate);吃水果}}daughter(){while(1){wait(apple);wait(mutex);取蘋果signal(mutex);signal(plate);吃水果}}6.29答:ctime_ts()函數(shù)包含了共享靜態(tài)變量----ctime()的返回值所在位置,而可重入函數(shù)是沒有共享變量的。6.30答:因為各線程執(zhí)行進(jìn)度是不可預(yù)測的,如果在第15行后就釋放存儲塊,可能這時對等線程還未執(zhí)行第24行,這樣會導(dǎo)致對等線程操作一個不存在的指針,而出現(xiàn)內(nèi)存越界錯誤。6.32.答:(1)用靜態(tài)數(shù)組:#defineN4void*thread(void*vargp);intmain(){pthread_ttid[N];inti,*ptr;intno[N];for(i=0;i<N;i++){ no[i]=i; pthread_create(&tid[i],NULL,thread,&no[i]);}for(i=0;i<N;i++) pthread_join(tid[i],NULL);exit(0);}void*thread(void*vargp){intmyid=*((int*)vargp);usleep(1);printf("Outputfromthread%d\n",myid);returnNULL;}(2)好處:效率高一點,不需動態(tài)申請存儲器不足:存儲器用量大一些,因為動態(tài)申請存儲器會及時將讀完線程id號的單元歸還系統(tǒng)6.33解:線程數(shù)(t)124CPU核數(shù)(p)124運行時間(Tp)1208060加速比(S)11.52效率(Ep)100%75%50%6.34答:.(1)共享變量psum64[]、nelems_per_thread:主線程和所有計算線程共享(2)為何不需加鎖nelems_per_thread:主線程與對等線程不是并發(fā)操作,主線程操作完成后,對等線程才讀它對等線程僅對其進(jìn)行讀操作psum64[]的數(shù)組元素:一個對等線程先完成賦值后,主線程才讀取值,沒有發(fā)生并發(fā)操作6.35.答:沒有共享變量6.37答:三種結(jié)果:K=20k=30k=106.38答:三種結(jié)果:x=5y=10x=5y=15x=15y=106.39答:問題1:flag=16問題2:flag=21問題3:ret=80問題4:flag=65或71或216.40解:(1)對每個進(jìn)程來說,變量運行實例有:變量實例引用線程mainP0p1p2p3sum√a[]√√√√√cnt[]√√√√√i.main√√√√√tid.main√myid.p0k.povargp.p0√myid.p1k.p1vargp.p1√myid.p2k.p2vargp.p2√myid.p3k.p3vargp.p3√因此,共享變量有i、a[]、cnt[](2)被并發(fā)讀寫的共享變量只有i。6.42.解:semaphoremutex;ProcessA()ProcessA(){Wait(mutex);打印輸出;Signal(mutex);}ProcessB(){Wait(mutex);打印輸出;Signal(mutex);}ProcessC(){Wait(mutex);打印輸出;Signal(mutex);}6.43.解:(1)可能出現(xiàn)錯誤結(jié)果,因為兩個進(jìn)程存在對共享變量的并發(fā)操作(2)可能出現(xiàn)金額有三種:100,200,300四種,正確值是200(3)intamount=0;//全局變量,賬號余額,初值為0semaphoremutex;voidSave(intm1){Wait(mutex);m1=amount;m1=m1+100;amount=m1signal(mutex);}voidTake(intm2){Wait(mutex);m2=amount;m2=m2-100;amount=m2signal(mutex);}6.44.解:Semaphoremutex1=mutex2=1,baskets=N,sem=100;Customer(){Wait(sem);Wait(baskets);去購物籃Wait(mutex1);進(jìn)入商場Signal(mutex1);購物結(jié)賬Wait(mutex2);出商場Signal(mutex2);歸還籃子Signal(baskets);Signal(sem);}6.45.解:Semaphoresem=3,mutex=1;Train(){Wait(sem);Wait(mutex);進(jìn)站Signal(mutex);停車Wait(mutex);出站Signal(mutex);Signal(sem);}46.答:[max(0,m-n),m]6.47.答:信號量值為0,有2個等待進(jìn)程6.48答:Sem_ts1,s2,s3;void*thread1(void*vargp){inti;for(i=0;i<10;i++){Sem_wait(&s1);Printf(“A”);Sem_post(&s2);}}void*thread1(void*vargp){inti;for(i=0;i<10;i++){Sem_wait(&s2);Printf(“B”);Sem_post(&s3);}}void*thread1(void*vargp){inti;for(i=0;i<10;i++){Sem_wait(&s3);Printf(“C”);Sem_post(&s1);}}intmain(){pthread_tt1,t2,t3;sem_init(&s1,0,1);sem_init(&s2,0,0);sem_init(&s3,0,0);pthread_create(&t1,NULL,thread1,NULL);pthread_create(&t1,NULL,thread2,NULL);pthread_create(&t1,NULL,thread3,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_join(t3,NULL);}6.49.ProcessA()ProcessA()Wait(mAC);readF;signal(mAC);}ProcessB(){wait(mBD);readF;signal(mBD);}ProcessC(){Wait(mAC);readF;signal(mAC);}ProcessD(){wait(mBD);readF;signal(mBD);}6.50.解:semaphoreclose=0,stop=0;司機()司機(){while(1){Wait(close);<<啟動車輛>><<正常行駛>><<到站停車>>Signal(stop);}}售票員(){while(1){<<關(guān)車門>>Signal(close);<<售票>>Wait(stop);<<開車門>>}}6.51.解:Semaphores12=s13=s24=s25=s46=s56=s36=0;T1(){S1;Signal(s12);Signal(s13);}T2(){Wait(s12);S2;Signal(s24);Signal(s25);}T3(){Wait(s13);S3;Signal(s36);{T4(){Wait(s24);S4;Signal(s46);}T5(){Wait(s25);S5;Signal(s56);}T6(){Wait(s36);Wait(s46);Wait(s56);S6;}6.52.Semaphorecage=1,pig=tiger=0;Hunter(){While(1){打老虎Wait(cage);放老虎到籠子中Signal(tiger);}}Famer(){While(1){養(yǎng)豬Wait(cage);放豬與籠子中Signal(pig);}}Restaurant(){While(1){Wait(pig);從籠子中抓豬Signal(cage);}}Zoo(){While(1){Wait(tiger);從籠子中去老虎Signal(cage);}}6.53.解(1)Semaphorecells=1,items=0,odd=0,even=0;R(){while(1){產(chǎn)生一個數(shù)nwait(cells);將數(shù)n投入緩沖區(qū)Bif(n是奇數(shù))signal(odd)elsesignal(even);}}W1(){while(1){wait(odd);從B中取出數(shù)nsignal(cells);打印數(shù)n}}W2(){while(1){wait(even);從B中取出數(shù)nsignal(cells);打印數(shù)n}}6.54.答:(1)信號量還是帶加減操作的計數(shù)器,不同的是這里允許計算值小于0。wait是等待和預(yù)留資源,當(dāng)前返回時,資源成功預(yù)留,進(jìn)程往下執(zhí)行;signal歸還資源,如有等待進(jìn)程則喚醒之,并將資源直接轉(zhuǎn)給等待進(jìn)程。因此,用這里定義的信號量和書本定義的信號量來解決同步互斥問題,編程方法完全一致(2)sem的初值是資源數(shù),sem<0時,|sem|為等待資源的進(jìn)程數(shù)6.55.Semaphorecells1=3,cells=3,cell3=2,cells0=0,items1=items2=items3=0,items0=3;P0(){while(1){wait(items0);從M0取一個消息Signal(cells0);加工消息Wait(cell1);將消息發(fā)往M1Signal(item1);}}P1(){while(1){Wait(items1);從M1取一個消息Signal(cells1);加工消息Wait(cell2);將消息發(fā)往M2Signal(item2);}}P2(){while(1){wait(items2);從M2取一個消息signal(cells2);加工消息wait(cell3);將消息發(fā)往M3signal(item3);}}P3(){while(1){wait(items3);從M3取一個消息signal(cells3);加工消息wait(cell0);將消息發(fā)往M0signal(item0);}}6.56.解:Semaphorecells=10,items=0,vat=1,well=1,barrels=3;YoungMonki(){Wait(cells);Wait(barrels);取水桶Wait(well);從水井打水Signal(well);回寺廟Wait(vat);向水缸倒水Signal(vat);還水桶Signal(barrels);Signal(items);}OldMonki(){Wait(items);Wait(barrels);取水桶Wait(vat);從水缸取水Signal(vat);Signal(cells);喝水還水桶Signal(barrels);}6.57解:semaphorePA=M-1,PB=N-1,mutex=1; 產(chǎn)品A入庫過程{while(1){生產(chǎn)產(chǎn)品A;P(PA);P(mutex);產(chǎn)品A入庫V(mutex);V(PB);}產(chǎn)品B入庫過程{while(1){生產(chǎn)產(chǎn)品B;P(PB);P(mutex);產(chǎn)品B入庫V(mutex);V(PA);}6.58解:semaphoreavail=m,SA=n,SB=n,IA=0,IB=0;裝配(){while(1){P(IA)P(IB)裝配V(avail)V(avail)}}進(jìn)貨零件A(){while(1){P(avail);P(SA);進(jìn)貨零件AV(IA);V(SB);}}進(jìn)貨零件B(){while(1){P(avail);P(SB);進(jìn)貨零件AV(IB);V(SA);}}6.60.解:voidsbuf_deinit(sbuf_t*sp)/*清理緩沖區(qū)*/{/*在下面填寫清除緩沖區(qū)代碼*/Free(sp->buf);Pthread_destroy(&sp->mutex);Pthread_destroy(&sp->slots);Pthread_destroy(&sp->items);}voidsbuf_insert(sbuf_t*sp,intitem)/*向緩沖區(qū)隊列sp末尾插入數(shù)據(jù)item*/{/*在下面填寫向緩沖區(qū)插入數(shù)據(jù)的代碼*/sem_wait(&sp->slots);sem_wait(&sp->mutex);buf[inpos]=item;inpos=(inpos+1)%N;sem_post(&sp->mutex);sem_post(&sp->items);}intsbuf_remove(sbuf_t*sp)/*從緩沖區(qū)隊列sp移去和返回隊首數(shù)據(jù)項*/{/*在下面填寫從緩沖區(qū)取一個數(shù)據(jù)的代碼*/intitem;sem_wait(&sp->items);sem_wait(&sp->mutex);item=buf[outpos];outpos=(outpos+1)%N;returnitem;inpos=(inpos+1)%N;sem_post(&sp->mutex);sem_post(&sp->slots);}6.61.答:不可以。假設(shè)同步信號量初值sem=0;在第22行后添加signal(sem),第5行前添加wait(sem)。如果進(jìn)程連續(xù)產(chǎn)生了兩個子進(jìn)程,但僅執(zhí)行一次addworder,將第1個子進(jìn)程添加到工作進(jìn)程池,但第2個子進(jìn)程先終止,父進(jìn)程執(zhí)行信號處理函數(shù),調(diào)用rmworkder(pid)時,因子進(jìn)程2尚未添加到工作進(jìn)程池而出錯。6.62.不可以因為主線程for語句中的操作i++與對等線程的操作intmyid=*((int*)vargp);并發(fā)訪問共享變量i。i++前后很難加wait、signanl調(diào)用。63,64.答:semaphoremutex1=mutex2=wmutex=1;intcount1=count2=0;EasttoWest(){wait(mutex1);count1++;if(count1==1)wait(wmutex);signal(mutex1);汽車走過單行道wait(mutex1);count1--;if(count1==0)signal(wmutex);signal(mutex1);}WesttoEaset(){wait(mutex2);count2++;if(count2==1)wait(wmutex);signal(mutex2);汽車走過單行道wait(mutex2);count2--;if(count2==0)signal(wmutex);signal(mutex2);}6.66解:semaphorecustomers=barbers=0,mutex=0;intwaiting=0;barber(){while(1){wait(customers);//等待顧客,睡覺wait(mutex);waiting=wating-1;signal(barbers);//喚醒一個等待顧客signal(mutex);<<理發(fā)>>}}Customer(){wait(mutex);if(waiting<n){waiting=waiting+1;signal(customer);//告知理發(fā)師signal(mutex);wait(barbers);//坐下等待理發(fā)<<接受理發(fā)服務(wù)>>exit(0);//離開理發(fā)店}signal(mutex);//直接離開}6.67.答:(1)是線程安全函數(shù),也是可重入函數(shù)(2)、(3)、(4)都不是線程安全函數(shù),因為都有共享變量,也不是可重入函數(shù)改寫成線程安全函數(shù)方法:(2)程序2:staticintsum_value=0;voidsum_counter(){wait(mutex);sum_value++;signal(mutex);}(3)程序3:char*strtoupper(char*string){charbuffer[MAX_STRING_SIZE];intindex;for(index=0;string[index];index++)buffer[index]=toupper(string[index]);buffer[index]=0;returnbuffer;}(4)程序4:externunsignedcharkey;

溫馨提示

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

評論

0/150

提交評論