生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告-3_第1頁(yè)
生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告-3_第2頁(yè)
生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告-3_第3頁(yè)
生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告-3_第4頁(yè)
生產(chǎn)者消費(fèi)者實(shí)驗(yàn)報(bào)告-3_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

操作系統(tǒng)實(shí)驗(yàn)報(bào)告2012年11月12日學(xué)號(hào)10081141081008114120姓名宋芳芳王林燕時(shí)間11月12日專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)計(jì)科二班實(shí)驗(yàn)題目:生產(chǎn)者-消費(fèi)者問題的實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康模?.熟悉臨界資源、信號(hào)量及PV操作的定義與物理意義;2.了解進(jìn)程通信的方法;3.掌握進(jìn)程互斥與進(jìn)程同步的相關(guān)知識(shí);4.掌握用信號(hào)量機(jī)制解決進(jìn)程之間的同步與互斥問題;5.實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問題,深刻理解進(jìn)程同步問題。實(shí)驗(yàn)內(nèi)容與步驟:實(shí)驗(yàn)內(nèi)容:說明:有界緩沖區(qū)內(nèi)設(shè)有5個(gè)存儲(chǔ)單元,放入/取出的數(shù)據(jù)項(xiàng)設(shè)定為1-5這5個(gè)整型數(shù)。實(shí)驗(yàn)要求:(1)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題模擬,顯示每次添加和讀取數(shù)據(jù)時(shí)緩沖區(qū)的狀態(tài),生產(chǎn)者和消費(fèi)者用進(jìn)程模擬,緩沖區(qū)用共享內(nèi)存來實(shí)現(xiàn)。每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的全部?jī)?nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者線程的標(biāo)識(shí)符。Buffer(共享內(nèi)存)生產(chǎn)者進(jìn)程消費(fèi)者進(jìn)程(2)一個(gè)大小為5的緩沖區(qū),初始為空;1個(gè)生產(chǎn)者:隨機(jī)等待一段時(shí)間,往緩沖區(qū)添加數(shù)據(jù),若緩沖區(qū)已滿,等待消費(fèi)者取走數(shù)據(jù)后再添加,重復(fù)5次。1個(gè)消費(fèi)者:隨機(jī)等待一段時(shí)間,從緩沖區(qū)讀取數(shù)據(jù),若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)后再讀取,重復(fù)5次。實(shí)驗(yàn)原理:(1)通過一個(gè)有界緩沖區(qū)把生產(chǎn)者消費(fèi)者聯(lián)系起來。假定生產(chǎn)者消費(fèi)者的優(yōu)先級(jí)是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費(fèi)者就可以從緩沖區(qū)中取走產(chǎn)品。應(yīng)該禁止生產(chǎn)者向滿的緩沖區(qū)送入產(chǎn)品,同時(shí)也應(yīng)該禁止消費(fèi)者從空的緩沖區(qū)中取出產(chǎn)品,這一機(jī)制有生產(chǎn)者線程和消費(fèi)者線程之間的互斥關(guān)系來實(shí)現(xiàn)。生產(chǎn)者和消費(fèi)者兩進(jìn)程P和C之間應(yīng)滿足下列兩個(gè)同步條件:①只有在緩沖池中至少有一個(gè)緩沖區(qū)已存入消息后,消費(fèi)者才能從中提取信息,否則消費(fèi)者必須等待。②只有緩沖池中至少有一個(gè)緩沖區(qū)是空時(shí),生產(chǎn)者才能把消息放入緩沖區(qū),否則生產(chǎn)者必須等待。為了滿足第一個(gè)同步條件,設(shè)置一個(gè)同步信號(hào)量full,它代表的資源是緩沖區(qū)滿,它的初始值為0,它的值為n==5時(shí)整個(gè)緩沖池滿。這個(gè)資源是消費(fèi)者進(jìn)程所有,消費(fèi)者進(jìn)程可以申請(qǐng)?jiān)撡Y源,對(duì)它施加P操作,生產(chǎn)者進(jìn)程P對(duì)它施加V操作。為了滿足第二個(gè)同步條件,設(shè)置另一個(gè)同步信號(hào)量empty,它代表的資源是緩沖空區(qū),它的初始值為n,表示緩沖池中所有緩沖區(qū)空。信號(hào)量full表示可用緩沖區(qū)數(shù)量,信號(hào)量empty表示緩沖區(qū)數(shù)量,設(shè)置整型變量:存入指針in和取出指針out。(2)設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(qū)的數(shù)目,用g_hFullSemaphore表示,其初始值為有界緩沖區(qū)的大小SIZE_OF_BUFFER;另一個(gè)表示緩沖區(qū)中產(chǎn)品的數(shù)目,用g_hEmptySemaphore表示,其初始值為0.另外,由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,所以還需要在設(shè)置一個(gè)互斥信號(hào)量Mutex,初始值為1.(3)程序中各主要函數(shù)的功能如下:生成信號(hào)量:intsem_creat(key_tkey,intvalue)刪除信號(hào)量:voiddel_sem(intsemid)p操作intp(intsemid){structsembufsops={0,-1,SEM_UNDO};return(semop(semid,&sops,1));}v操作intv(intsemid){structsembufsops={0,+1,SEM_UNDO};return(semop(semid,&sops,1));}生產(chǎn)者執(zhí)行的代碼:voidproducer(key_tkeyFull,key_tkeyEmpty,key_tkeymutex)消費(fèi)者執(zhí)行的代碼:voidconsumer(intfull,intempty,intmutex)實(shí)驗(yàn)步驟:打開Unix系統(tǒng),新建Pro.c文件,存入根目錄root。點(diǎn)擊右鍵,有新建終端選項(xiàng),進(jìn)入vi編輯器。輸入指令vipro.c,鍵入i進(jìn)入編輯狀態(tài),輸入如下代碼:用gccgcc命令編譯源文件pro.c。具體指令為gcc-opropro.c-lrt./pro.c實(shí)驗(yàn)結(jié)果:程序代碼:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/mman.h>//提供了共享內(nèi)存的相關(guān)操作#include<fcntl.h>#include<sys/stat.h>unionsemun{intval;structsemid_ds*buf;unsignedshort*array;}arg;//生成信號(hào)量intsem_creat(key_tkey,intvalue){unionsemunsem;intsemid;sem.val=value;semid=semget(key,1,IPC_CREAT|0666);if(-1==semid){printf("createsemaphoreerror\n");exit(-1);}semctl(semid,0,SETVAL,sem);returnsemid;}//刪除信號(hào)量voiddel_sem(intsemid){unionsemunsem;sem.val=0;semctl(semid,0,IPC_RMID,sem);}//p操作intp(intsemid){structsembufsops={0,-1,SEM_UNDO};return(semop(semid,&sops,1));}//v操作intv(intsemid){structsembufsops={0,+1,SEM_UNDO};return(semop(semid,&sops,1));}int*buffer;//int*pData;intin=0,out=0;intvalue_read=0,value_write=0;intfull,empty,mutex;voidproducer(key_t,key_t,key_t);//生產(chǎn)者所執(zhí)行的代碼voidconsumer(int,int,int);intmain(void){ key_tkeyFull,keyEmpty,keymutex; intfd; pid_tpid;void*ptr;//指向共享內(nèi)存的指針/*shm_open是一個(gè)POSIX函數(shù),用來打開或創(chuàng)建一個(gè)與“/shm”關(guān)聯(lián)的共享內(nèi)存區(qū)*/ if((fd=shm_open("/shm",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR))==-1) { printf("shm_openerror\n");/*出錯(cuò)提示*/ } if(ftruncate(fd,5*sizeof(int))==-1)/*截短共享內(nèi)存的長(zhǎng)度到我們所需要的長(zhǎng)度*/ { printf("ftruncateerror\n"); } if((ptr=mmap(0,5*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED)/*將共享內(nèi)存映射到進(jìn)程地址空間*/ { printf("mmaperror"); } buffer=(int*)ptr; keyFull=ftok("/",0);keyEmpty=ftok("/",1);keymutex=ftok("/",3);full=sem_creat(keyFull,0);empty=sem_creat(keyEmpty,5);mutex=sem_creat(keymutex,1); switch(pid=fork()) { case-1:/*生成子進(jìn)程失敗*/ break; case0:/*子進(jìn)程*/ producer(keyFull,keyEmpty,keymutex);/*子進(jìn)程是生產(chǎn)者*/ sleep(2); break; default: consumer(full,empty,mutex);/*父進(jìn)程是消費(fèi)者*/ break;}wait(0);shm_unlink("/shm");/*刪除共享內(nèi)存區(qū),程序中基本上保證了子進(jìn)程先退出,因此父進(jìn)程中無wait操作且這部操作放在父進(jìn)程這里*/ //shmctl(shmid,IPC_RMID,&buf); //del_sem(semid); return0;}/*生產(chǎn)者寫5次后退出*/voidproducer(key_tkeyFull,key_tkeyEmpty,key_tkeymutex){full=semget(keyFull,1,0);empty=semget(keyEmpty,1,0);mutex=semget(keymutex,1,0); while(value_write<5)/*退出條件判定*/ {printf("PrepareWrite\n");printf("emptynumP1:%d\n",semctl(empty,0,GETVAL,0)); p(empty);/*是否有空緩沖區(qū),有則占有,無則被掛起,是原子操作*/ printf("emptynumP2:%d\n",semctl(empty,0,GETVAL,0));printf("mutexnum1%d\n",semctl(mutex,0,GETVAL,0));p(mutex);printf("mutexnum2%d\n",semctl(mutex,0,GETVAL,0)); value_write++; buffer[in]=value_write;printf("write%5dtoposition%5d\n",buffer[in],in+1);in=(in+1)%5; printf("mutexnum1%d\n",semctl(mutex,0,GETVAL,0));v(mutex);printf("mutexnum2%d\n",semctl(mutex,0,GETVAL,0)); printf("fullnumV1:%d\n",semctl(full,0,GETVAL,0)); v(full);/*寫完一個(gè)緩沖區(qū),釋放信號(hào)量full(值加1)*/printf("fullnumV2:%d\n",semctl(full,0,GETVAL,0));printf("WriteFinish\n");//sleep(1); }}/*消費(fèi)者讀5次后退出*/voidconsumer(intfull,intempty,intmutex){while(value_read<5)/*退出條件判定*/ {printf("PrepareRead\n");printf("fullnumP1:%d\n",semctl(full,0,GETVAL,0)); p(full);/*獲取信號(hào)量*/ printf("fullnumP1:%d\n",semctl(full,0,GETVAL,0)); printf("mutexnum1%d\n",semctl(mutex,0,GETVAL,0));p(mutex);printf("mutexnum2%d\n",semctl(mutex,0,GETVAL,0)); printf("read%5dfrompositio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論