實(shí)驗四 Linux進(jìn)程互斥_第1頁
實(shí)驗四 Linux進(jìn)程互斥_第2頁
實(shí)驗四 Linux進(jìn)程互斥_第3頁
實(shí)驗四 Linux進(jìn)程互斥_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

實(shí)驗四Linux進(jìn)程互斥一、實(shí)驗?zāi)康氖煜inux下信號量機(jī)制,能夠使用信號量實(shí)現(xiàn)在并發(fā)進(jìn)程間的互斥和同步。二、實(shí)驗題目使用共享存儲區(qū)機(jī)制,使多個并發(fā)進(jìn)程分別模擬生產(chǎn)者一消費(fèi)者模式同步關(guān)系、臨界資源的互斥訪問關(guān)系,使用信號量機(jī)制實(shí)現(xiàn)相應(yīng)的同步和互斥。三、背景材料(一)需要用到的系統(tǒng)調(diào)用實(shí)驗可能需要用到的主要系統(tǒng)調(diào)用和庫函數(shù)在下面列出,詳細(xì)的使用方法說明通過“man2系統(tǒng)調(diào)用名”或者“man3函數(shù)名”命令獲取。fork()創(chuàng)建一個子進(jìn)程,通過返回值區(qū)分是在父進(jìn)程還是子進(jìn)程中執(zhí)行;wait()等待子進(jìn)程執(zhí)行完成;shmget()建立一個共享存儲區(qū);shmctl()操縱一個共享存儲區(qū);shmat()把一個共享存儲區(qū)附接到進(jìn)程內(nèi)存空間;shmdt()把一個已經(jīng)附接的共享存儲區(qū)從進(jìn)程內(nèi)存空間斷開;semget()建立一個信號量集;semctl()操縱一個信號量集,包括賦初值;semop()對信號量集進(jìn)行wait和signal操作;signal()設(shè)置對信號的處理方式或處理過程。(二)模擬生產(chǎn)者一消費(fèi)者的示例程序本示例主要體現(xiàn)進(jìn)程間的直接制約關(guān)系,由于使用共享存儲區(qū),也存在間接制約關(guān)系。進(jìn)程分為服務(wù)進(jìn)程和客戶進(jìn)程,服務(wù)進(jìn)程只有一個,作為消費(fèi)者,在每次客戶進(jìn)程改變共享存儲區(qū)內(nèi)容時顯示其數(shù)值。各客戶進(jìn)程作為生產(chǎn)者,如果共享存儲區(qū)內(nèi)容已經(jīng)顯示(被消費(fèi)),可以接收用戶從鍵盤輸入的整數(shù),放在共享存儲區(qū)。編譯后執(zhí)行,第一個進(jìn)程實(shí)例將作為服務(wù)進(jìn)程,提示:ACTCONSUMER!!!Toend,tryCtrl+Corusekill.服務(wù)進(jìn)程一直循環(huán)執(zhí)行,直到用戶按Ctrl+C終止執(zhí)行,或使用kill命令殺死服務(wù)進(jìn)程。其他進(jìn)程實(shí)例作為客戶進(jìn)程,提示:Actasproducer.Toend,input0whenprompted.客戶進(jìn)程一直循環(huán)執(zhí)行,直到用戶輸入0。示例程序代碼如下:#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<stdio.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>

//needtochange//needtochange#defineMY_SHMKEY10071500#defineMY_SEMKEY10071500voidsigend(int);intshmid,semid;intmain(void){int*shmptr,semval,local;structsembufsemopbuf;/*//needtochange//needtochangeif((shmid=shmget(MY_SHMKEYsizeof(int),IPC_CREAT|IPC_EXCL|0666))<0){/*sharedmemoryexists,actasclient*/shmid=shmget(MY_SHMKEYsizeof(int),0666);〃建立一個信號量集函數(shù)執(zhí)行成功,則返回信號量集的標(biāo)識符(一個大于等于0的整數(shù)),失敗,則返回Tsemid=semget(MY_SEMKEY2,0666);〃返回共享內(nèi)存的起始地址。失敗時返回-1。允許本進(jìn)程使用這塊共享內(nèi)存shmptr=(int*)shmat(shmid,0,0);printf("Actasproducer.Toend,input0whenprompted.\n\n");printf("Inputanumber:\n");scanf("%d”,&local);while(local){semopbuf.sem_num=0;semopbuf.sem_op=-1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*P(S1)對信號量集進(jìn)行wait和signal操作;*/*shmptr=local;semopbuf.sem.numT;//正數(shù):釋放相應(yīng)的資源數(shù),將sem_op的值加到信號量的值上semopbuf.sem_op=1;//執(zhí)行釋放的資源semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*V(S2)*/printf("Inputanumber:\n");scanf("%d”,&local);}}else/*actsasserver*/{〃建立一個信號量集〃參數(shù)nsems表示創(chuàng)建的信號量集中的信號量的個數(shù),該參數(shù)只在創(chuàng)建信號量集時有效。semid=semget(MY_SEMKEY2,IPC_CREATI0666);shmptr=(int*)shmat(shmid,0,0);semval=1;〃操縱一個信號量集,包括賦初值;SETVAL設(shè)置信號量集中的一個單獨(dú)的信號量的值semctl(semid,0,SETVAL,semval);/*setS1=1第二個參數(shù)是信號量數(shù)目*/semval=0;semctl(semid,1,SETVAL,semval);/*setS2=0*/〃對信號的處理方式或處理過程signal(SIGINT,sigend);由InterruptKey產(chǎn)生,通常是CTRL+C或者DELETEo發(fā)送給所有ForeGroundGroup的進(jìn)程按下CTRL+C產(chǎn)生SIGINTsignal(SIGTERM,sigend);請求中止進(jìn)程,kill命令缺省發(fā)送printf("ACTCONSUMER!!!Toend,tryCtrl+Corusekill.\n\n");while(1){semopbuf.sem_num=1;semopbuf.sem_op=-1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*P(S2)*/printf("Sharedmemorysetto%d\n",*shmptr);semopbuf.sem_num=0;semopbuf.sem_op=1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*V(S1)*/}}}voidsigend(intsig){shmctl(shmid,IPC_RMID,0);semctl(semid,IPC_RMID,0);exit(0);}(三)模擬臨界資源訪問的示例程序本示例的臨界資源是一個建立在共享存儲區(qū)的棧,由服務(wù)進(jìn)程建立并初始化。初始狀態(tài)下共享棧滿,里面順序放置一系列正整數(shù)(自棧頂向下:1,2,3…),代表空閑塊號??蛻暨M(jìn)程利用共享棧進(jìn)行數(shù)據(jù)塊的分配和釋放,以得到、歸還一個塊號代表,并不進(jìn)行任何后續(xù)操作。程序中g(shù)etblock過程從共享棧中彈出一個塊號(分配),relblock過程把一個已分配塊號壓入共享棧(釋放)。為簡單起見,已分配塊號在本地也使用棧結(jié)構(gòu)保存,因而每次釋放的是最后分配的塊號。編譯后執(zhí)行,第一個進(jìn)程實(shí)例將作為服務(wù)進(jìn)程,提示:NOOTHEROPERATIONbutpressCtrl+Corusekilltoend.服務(wù)進(jìn)程完成初始化后將進(jìn)入睡眠狀態(tài),直到用戶按Ctrl+C終止執(zhí)行,或使用kill命令殺死服務(wù)進(jìn)程。其他進(jìn)程實(shí)例作為客戶進(jìn)程,進(jìn)入后首先有命令幫助提示,然后顯示命令提示符“?>,”在命令提示下可以使用的命令包括:help顯示可用命令list列出所有已分配塊號get分配一個新塊rel釋放最后分配塊號end退出程序示例程序的代碼如下:#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<stdio.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#defineMY_SHMKEY10071800//needtochange#defineMAX_BLOCK1024#defineMAX_CMD8structshmbuf(inttop;intstack[MAX_BLOCK];}*shmptr,local;charcmdbuf[MAX_CMD];intshmid,semid;voidsigend(int);voidrelblock(void);intgetblock(void);voidshowhelp(void);voidshowlist(void);voidgetcmdline(void);intmain(void){if((shmid=shmget(MY_SHMKEYsizeof(structshmbuf),IPC_CREAT|IPC_EXCL|0666))<0){/*sharedmemoryexists,actasclient*/shmid=shmget(MY_SHMKEYsizeof(structshmbuf),0666);shmptr=(structshmbuf*)shmat(shmid,0,0);local.top=-1;showhelp();getcmdline();while(strcmp(cmdbuf,"end\n")){if(!strcmp(cmdbuf,"get\n"))getblock();elseif(!strcmp(cmdbuf,"rel\n"))relblock();elseif(!strcmp(cmdbuf,"list\n"))showlist();elseif(!strcmp(cmdbuf,"help\n"))showhelp();getcmdline();}}else/*actsasserver*/{inti;shmptr=(structshmbuf*)shmat(shmid,0,0);signal(SIGINT,sigend);signal(SIGTERM,sigend);printf("NOOTHEROPERATIONbutpressCtrl+Corusekilltoend.\n");shmptr->top=MAX_BLOCK-1;for(i=0;i<MAX_BLOCK;i++)shmptr->stack[i]=MAX_BLOCK-i;sleep(1000000);/*causesleepforever.*/}}voidsigend(intsig){shmctl(shmid,IPC_RMID,0);semctl(semid,IPC_RMID,0);exit(0);}voidrelblock(void){if(local.top<0){printf("Noblocktorelease!");return;}shmptr->top++;shmptr->stack[shmptr->top]=local.stack[local.top--];}intgetblock(void){if(shmptr->top<0){printf("Nofreeblocktoget!");return;}local.stack[++local.top]=shmptr->stack[shmptr->top];shmptr->top--;}voidshowhelp(void){printf("\navailableCOMMAND:\n\n");printf("help\tlistthishelp\n");printf("list\tlistallgottenblocknumber\n");printf("get\tgetanewblock\n");printf("rel\treleasethelastgottenblock\n");printf("end\texitthisprogram\n");}voidshowlist(void){inti;printf("Listallgottenblocknumber:\n");for(i=0;i<=local.top;i++)printf("%d\t”,local.stack[i]);}voidgetcmdline(void){printf("\n?>");fgets(cmdbuf,MAX_CMD-1,stdin);}四、實(shí)驗內(nèi)容本實(shí)驗要求內(nèi)容如下:1、模擬生產(chǎn)者一消費(fèi)者實(shí)現(xiàn)相應(yīng)的示例程序功能,記錄執(zhí)行結(jié)果;改造該程序,取消所有的同步機(jī)制,記錄執(zhí)行結(jié)果,看

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論