下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
實驗四Linux進程互斥一、實驗?zāi)康氖煜inux下信號量機制,能夠使用信號量實現(xiàn)在并發(fā)進程間的互斥和同步。二、實驗題目使用共享存儲區(qū)機制,使多個并發(fā)進程分別模擬生產(chǎn)者一消費者模式同步關(guān)系、臨界資源的互斥訪問關(guān)系,使用信號量機制實現(xiàn)相應(yīng)的同步和互斥。三、背景材料(一)需要用到的系統(tǒng)調(diào)用實驗可能需要用到的主要系統(tǒng)調(diào)用和庫函數(shù)在下面列出,詳細的使用方法說明通過“man2系統(tǒng)調(diào)用名”或者“man3函數(shù)名”命令獲取。fork()創(chuàng)建一個子進程,通過返回值區(qū)分是在父進程還是子進程中執(zhí)行;wait()等待子進程執(zhí)行完成;shmget()建立一個共享存儲區(qū);shmctl()操縱一個共享存儲區(qū);shmat()把一個共享存儲區(qū)附接到進程內(nèi)存空間;shmdt()把一個已經(jīng)附接的共享存儲區(qū)從進程內(nèi)存空間斷開;semget()建立一個信號量集;semctl()操縱一個信號量集,包括賦初值;semop()對信號量集進行wait和signal操作;signal()設(shè)置對信號的處理方式或處理過程。(二)模擬生產(chǎn)者一消費者的示例程序本示例主要體現(xiàn)進程間的直接制約關(guān)系,由于使用共享存儲區(qū),也存在間接制約關(guān)系。進程分為服務(wù)進程和客戶進程,服務(wù)進程只有一個,作為消費者,在每次客戶進程改變共享存儲區(qū)內(nèi)容時顯示其數(shù)值。各客戶進程作為生產(chǎn)者,如果共享存儲區(qū)內(nèi)容已經(jīng)顯示(被消費),可以接收用戶從鍵盤輸入的整數(shù),放在共享存儲區(qū)。編譯后執(zhí)行,第一個進程實例將作為服務(wù)進程,提示:ACTCONSUMER!!!Toend,tryCtrl+Corusekill.服務(wù)進程一直循環(huán)執(zhí)行,直到用戶按Ctrl+C終止執(zhí)行,或使用kill命令殺死服務(wù)進程。其他進程實例作為客戶進程,提示:Actasproducer.Toend,input0whenprompted.客戶進程一直循環(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。允許本進程使用這塊共享內(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)對信號量集進行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è)置信號量集中的一個單獨的信號量的值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的進程按下CTRL+C產(chǎn)生SIGINTsignal(SIGTERM,sigend);請求中止進程,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ù)進程建立并初始化。初始狀態(tài)下共享棧滿,里面順序放置一系列正整數(shù)(自棧頂向下:1,2,3…),代表空閑塊號??蛻暨M程利用共享棧進行數(shù)據(jù)塊的分配和釋放,以得到、歸還一個塊號代表,并不進行任何后續(xù)操作。程序中g(shù)etblock過程從共享棧中彈出一個塊號(分配),relblock過程把一個已分配塊號壓入共享棧(釋放)。為簡單起見,已分配塊號在本地也使用棧結(jié)構(gòu)保存,因而每次釋放的是最后分配的塊號。編譯后執(zhí)行,第一個進程實例將作為服務(wù)進程,提示:NOOTHEROPERATIONbutpressCtrl+Corusekilltoend.服務(wù)進程完成初始化后將進入睡眠狀態(tài),直到用戶按Ctrl+C終止執(zhí)行,或使用kill命令殺死服務(wù)進程。其他進程實例作為客戶進程,進入后首先有命令幫助提示,然后顯示命令提示符“?>,”在命令提示下可以使用的命令包括: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);}四、實驗內(nèi)容本實驗要求內(nèi)容如下:1、模擬生產(chǎn)者一消費者實現(xiàn)相應(yīng)的示例程序功能,記錄執(zhí)行結(jié)果;改造該程序,取消所有的同步機制,記錄執(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國焊點強度推力檢測夾具數(shù)據(jù)監(jiān)測研究報告
- 花店裝修解約協(xié)議書
- 餐飲業(yè)天然氣供應(yīng)運輸協(xié)議
- 2025至2030年中國手機數(shù)據(jù)下載線數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國噴射染色試樣機數(shù)據(jù)監(jiān)測研究報告
- 家電代理居間合同解除
- 2025至2030年中國3.4-二甲氧基苯乙腈數(shù)據(jù)監(jiān)測研究報告
- 2025年中國結(jié)算中心管理系統(tǒng)市場調(diào)查研究報告
- 2025年中國礦用隔爆泵市場調(diào)查研究報告
- 2025年中國玩具充棉機市場調(diào)查研究報告
- 2024版智慧電力解決方案(智能電網(wǎng)解決方案)
- 公司SWOT分析表模板
- 小學(xué)預(yù)防流行性感冒應(yīng)急預(yù)案
- 肺癌術(shù)后出血的觀察及護理
- 生物醫(yī)藥大數(shù)據(jù)分析平臺建設(shè)-第1篇
- 基于Android的天氣預(yù)報系統(tǒng)的設(shè)計與實現(xiàn)
- 沖鋒舟駕駛培訓(xùn)課件
- 美術(shù)家協(xié)會會員申請表
- 聚合收款服務(wù)流程
- 中石化浙江石油分公司中石化溫州靈昆油庫及配套工程項目環(huán)境影響報告書
- 搞笑朗誦我愛上班臺詞
評論
0/150
提交評論