多道程序緩沖區(qū)協(xié)調(diào)操作_第1頁(yè)
多道程序緩沖區(qū)協(xié)調(diào)操作_第2頁(yè)
多道程序緩沖區(qū)協(xié)調(diào)操作_第3頁(yè)
多道程序緩沖區(qū)協(xié)調(diào)操作_第4頁(yè)
多道程序緩沖區(qū)協(xié)調(diào)操作_第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、-PAGE . z. - - . -可修- .操作系統(tǒng)課程設(shè)計(jì) 報(bào)告多道程序緩沖區(qū)協(xié)調(diào)操作班級(jí)學(xué)號(hào)姓名成績(jī)指導(dǎo)教師2013年7月7日-. z.多道程序緩沖區(qū)協(xié)調(diào)操作一概述1.目的:1了解提出信號(hào)量的背景 2掌握信號(hào)量的根本概念及 PV 操作的原理 3進(jìn)一步熟悉信號(hào)量解決的經(jīng)典問(wèn)題 4利用信號(hào)量的原理實(shí)現(xiàn)不同操作系統(tǒng)下同步互斥問(wèn)題2.主要完成的任務(wù):有10個(gè)Put操作要不斷循環(huán)地向InBuffer送數(shù)據(jù),有一個(gè)Move操作要不斷地將InBuffer的數(shù)據(jù)取到OutBuffer,有20個(gè)GET操作要不斷地從OutBuff中取數(shù)據(jù)。InBuffer的容量是10, OutBuff的容量是20, Put

2、、 Move、 Get每次操作一個(gè)數(shù)據(jù),為了在操作的過(guò)程中要保證數(shù)據(jù)不喪失,每個(gè)Buffer每次只能承受一個(gè)Put或一個(gè)Move或一個(gè)Get,多個(gè)操作不能同時(shí)操作同一Buffer(即需要互斥操作)。設(shè)計(jì)一個(gè)多道程序完成上述操作。試用、原語(yǔ)或Wait、Signal協(xié)調(diào)Put、 Move、Get的操作,并說(shuō)明每個(gè)信號(hào)量的含義、初值和值的圍。3.使用的開發(fā)工具:VMware Workstation, ubantu Linu*4.解決的主要問(wèn)題:需求分析 利用信號(hào)量實(shí)現(xiàn)緩沖區(qū)管理臨界區(qū)協(xié)調(diào)問(wèn)題。解決由于進(jìn)程線程共享存而出 現(xiàn)的與時(shí)間有關(guān)的錯(cuò)誤。二使用的根本概念和原理信號(hào)量:為解決多進(jìn)程線程同步與互斥問(wèn)

3、題,讓兩個(gè)或多個(gè)多道進(jìn)程線程通過(guò)特殊的變量展開交互。 線程:是進(jìn)程的一個(gè)實(shí)體,是進(jìn)程上下文中執(zhí)行的代碼序列,是被系統(tǒng)調(diào)度的根本單元。 進(jìn)程:進(jìn)程是正在運(yùn)行的程序?qū)嶓w,并且包括這個(gè)運(yùn)行的程序中占據(jù)的所有系統(tǒng)資源。 互斥與同步:進(jìn)程的同步與互斥是指進(jìn)程在推進(jìn)時(shí)的相互制約關(guān)系。進(jìn)程同步:它主要源于進(jìn)程合作,是進(jìn)程間共同完成一項(xiàng)任務(wù)時(shí)直接發(fā)生相互作用的關(guān)系。進(jìn)程互斥:它主要源于資源共享,是進(jìn)程之間的間接制約關(guān)系。三總體設(shè)計(jì)生產(chǎn)者消費(fèi)者問(wèn)題是相互合作的進(jìn)程關(guān)系的一種抽象,可以利用信號(hào)量機(jī)制來(lái)解決生產(chǎn)者消費(fèi)者問(wèn)題,利用互斥信號(hào)量mute*實(shí)現(xiàn)進(jìn)程對(duì)緩沖池的互斥使用。對(duì)信號(hào)量的操作只能通過(guò)兩個(gè)原子操作:Wa

4、it(s)和Signal(s).Wait(s)是等待信號(hào)的操作,進(jìn)展S=S-1操作;Signal(s)是發(fā)送信號(hào)的操作,進(jìn)展S=S+1操作。wait 假設(shè)s-1后仍大于或等于零,則進(jìn)程繼續(xù)執(zhí)行;假設(shè)s-1后小于零,則該進(jìn)程被阻塞后進(jìn)入與該信號(hào)相對(duì)應(yīng)的隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度;假設(shè)相加結(jié)果大于或等于零,則從該信號(hào)的等待隊(duì)列中喚醒一等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度如下列圖所示,有10個(gè)PUT相當(dāng)于生產(chǎn)者操作要不斷循環(huán)地向Buffer1送數(shù)據(jù),有一個(gè)Move相當(dāng)于搬運(yùn)者操作要不斷地將Buffer1的數(shù)據(jù)取到Buffer2,有20個(gè)GET相當(dāng)于消費(fèi)者操作要不斷地從Buff2中取數(shù)據(jù)。BUF

5、F1是10,BUFF2的容量是20, PUT、 MOVE、 GET每次操作一個(gè)數(shù)據(jù),為了在操作的過(guò)程中要保證數(shù)據(jù)不喪失,每個(gè)Buffer每次只能承受一個(gè)PUT或一個(gè)Move或一個(gè)Get,多個(gè)操作不能同時(shí)操作同一BUFFER。設(shè)計(jì)一個(gè)多道程序完成上述操作。試用、原語(yǔ)協(xié)調(diào)PUT、 MOVE、GET的操作,并說(shuō)明每個(gè)信號(hào)量的含義、初值和值的圍。設(shè)計(jì)總體流程圖如下:四詳細(xì)設(shè)計(jì)4.1線程規(guī)劃我們創(chuàng)立三類線程:1PUT線程往BUFFER1里放數(shù)據(jù),相當(dāng)于生產(chǎn)者。2MOVE線程從BUFFER1里取數(shù)據(jù)并放到BUFFER2里,相當(dāng)于搬運(yùn)者。3GET線程從BUFFER2里取數(shù)據(jù),相當(dāng)于消費(fèi)者。每類線程可由用戶自

6、行設(shè)定線程的個(gè)數(shù)。4.2信號(hào)量的設(shè)置需要設(shè)置六個(gè)信號(hào)量full1 empty1 buff1 full2 empty2 buff2。各信號(hào)量含義及初值如下:full1表示buffer1是否有數(shù)據(jù),初值為0;empty1表示buffer1是否有空間,初值為m;buff1表示buffer1是否可操作,初值為1;full2表示buffer2是否有數(shù)據(jù),初值為0;empty2表示buffer2是否有空間,初值為n;buff2表示buffer2是否可操作,初值為1。4.3 函數(shù)move 函數(shù):創(chuàng)立move線程,使用p.v原語(yǔ)判斷inbuffer是否有數(shù)據(jù),假設(shè)有數(shù)據(jù),則從inbuffer承受數(shù)據(jù);sem_

7、wait(&iFull);sem_wait(&sem1);sleep(1);data2=inBufferiOut;假設(shè)無(wú)數(shù)據(jù),則move程序阻塞。從inbuffer接收到數(shù)據(jù)之后,假設(shè)outbuffer有空間則將接收到的數(shù)據(jù)輸入到outbuffer。sem_wait(&oEmpty);sem_wait(&sem2);sleep(1);outBufferoIn=data2;Put函數(shù):分配空間給buffer1。wait(s) 假設(shè)s-1后仍大于或等于零,則進(jìn)程繼續(xù)執(zhí)行;假設(shè)s-1后小于零,則該進(jìn)程被阻塞后進(jìn)入與該信號(hào)相對(duì)應(yīng)的隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度;假設(shè)相加結(jié)果大于或等于零,則從該信號(hào)的等待隊(duì)列中

8、喚醒一等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。Out函數(shù):分配空間給buffer2。使用p.v判斷move是否有數(shù)據(jù),假設(shè)有,則通過(guò)move承受數(shù)據(jù)并輸出。假設(shè)沒(méi)有,則將out程序阻塞。五編碼設(shè)計(jì) 1.程序源代碼如下#include #include #include #include #include #include #include /* 定義頭變量 */sem_t iFull,iEmpty;sem_t oFull,oEmpty;int iIn=0,iOut=0,oIn=0,oOut=0;sem_t sem1,sem2;char inBuffer10;char outBuffer

9、20;int data1,data2,data3;void put(void *arg);void move(void *arg);void get(void *arg);main(int argc, char *argv)int i,j;int *task110;int *task220;pthread_t id110,id2,id320;int ret;/*初始化信號(hào)量imute*為1*/ret=sem_init(&sem1,0,1);if(ret!=0)perror(sem_init);/*初始化信號(hào)量omute*為1*/ ret=sem_init(&sem2,0,1);if(ret!=

10、0)perror(sem_init);/*初始化信號(hào)量iFull為1*/ret=sem_init(&iFull,0,0);if(ret!=0)perror(sem_init);/*初始化信號(hào)量iEmpty為10*/ret=sem_init(&iEmpty,0,10);if(ret!=0)perror(sem_init);/*初始化信號(hào)量oFull為0*/ret=sem_init(&oFull,0,0);if(ret!=0)perror(sem_init);/*初始化信號(hào)量oEmpty為20*/ret=sem_init(&oEmpty,0,20);if(ret!=0)perror(sem_ini

11、t);/*創(chuàng)立三個(gè)線程*/put線程for(i=0;i10;i+)task1i = (int *)malloc(sizeof(int);*task1i = i;ret=pthread_create(&id1i,NULL,(void *)put,(void *)task1i);if(ret!=0)perror(pthread thread put error.);/move線程ret=pthread_create(&id2,NULL,(void *)move, NULL);if(ret!=0) perror(pthread thread move error.);/get線程for(j=0;j2

12、0;j+)task2j = (int *)malloc(sizeof(int);*task2j = j;ret=pthread_create(&id3j,NULL,(void *)get,(void *)task2j);if(ret!=0) perror(pthread thread get error.);for(i=0;i10;i+)pthread_join(id1i,NULL);pthread_join(id2,NULL);for(j=0;j20;j+)pthread_join(id3j,NULL);e*it(0);/* put操作線程函數(shù) */void put(void *arg)in

13、t i;int *threadid1;threadid1 = (int *)arg;srand(time(NULL);while(1)sleep(1);data1= rand() % 128;/*信號(hào)量減一,P操作*/sem_wait(&iEmpty); sem_wait(&sem1);sleep(1);printf(put%d:iIn=%d,nThe data put into theinBuffer is:%dn,*threadid1,iIn,data1);inBufferiIn=data1;iIn=(iIn+1)%10;/*信號(hào)量加一,V操作*/ sem_post(&sem1);sem_

14、post(&iFull); sleep(2);/* move操作線程函數(shù) */void move(void *arg)int ret;while(1)/* move操作將數(shù)據(jù)取出inBuffer緩沖區(qū) */sem_wait(&iFull);sem_wait(&sem1);sleep(1);data2=inBufferiOut;printf(move:iOut=%d,nThe data get out of the inBuffer is:%dn,iOut,data2);iOut=(iOut+1)%10; sem_post(&sem1);sem_post(&iEmpty);sleep(1);/*

15、 move操作將數(shù)據(jù)放入outBuffer緩沖區(qū) */sem_wait(&oEmpty);sem_wait(&sem2);sleep(1);outBufferoIn=data2;printf(move:oIn=%d,nThe data put into the outBuffer is:%dn,oIn,data2);oIn=(oIn+1)%20;sem_post(&sem2);sem_post(&oFull);sleep(1);/* get操作線程函數(shù) */void get(void *arg)int ret;int *threadid2;threadid2 = (int *)arg;whil

16、e(1)sem_wait(&oFull);sem_wait(&sem2);sleep(1);data3=outBufferoOut;printf(get%d:oOut=%d,nThe data get out of the outBuffer is:%dn,*threadid2,oOut,data3);oOut=(oOut+1)%20;sem_post(&sem2);sem_post(&oEmpty);sleep(1);六測(cè)試時(shí)出現(xiàn)過(guò)的問(wèn)題及解決方法1. 一開場(chǎng)寫程序時(shí)無(wú)從下手,后來(lái)經(jīng)過(guò)教師指點(diǎn)將本程序的P.V原語(yǔ)寫出,程序就可以按照P.V原語(yǔ)的順序往下寫。2. 一開場(chǎng)不明白程序的線程操作上鎖

17、與解鎖的含義,后來(lái)經(jīng)教師指導(dǎo)得知線程互斥與同步就是信號(hào)量的互斥與同步,創(chuàng)立信號(hào)量就可以表示出線程間的關(guān)系。3. 出現(xiàn)段錯(cuò)誤,后改成輸入的數(shù)據(jù)有隨機(jī)數(shù)生成函數(shù)產(chǎn)生即解決此問(wèn)題。 一開場(chǎng)不明白程序的線程操作上鎖與解鎖的含義,后來(lái)經(jīng)教師指導(dǎo)得知線程互斥與同步就是信號(hào)量的互斥與同步,創(chuàng)立信號(hào)量就可以表示出線程間的關(guān)系。4. 編譯時(shí)為出錯(cuò),但在執(zhí)行時(shí)出現(xiàn)段錯(cuò)誤,后改成輸入的數(shù)據(jù)有隨機(jī)數(shù)生成函數(shù)產(chǎn)生即解決此問(wèn)題。七實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)結(jié)果如下:八總結(jié)本軟件利用ubantu Linu*-VMware實(shí)現(xiàn)多線程的同步,用戶可以直接觀察多線程的運(yùn)行,協(xié)調(diào),并且可以設(shè)置線程的個(gè)數(shù),緩沖區(qū)的容量,以及線程的速度。整個(gè)程序的設(shè)計(jì)過(guò)程中出現(xiàn)了很多問(wèn)題,比方在設(shè)計(jì)過(guò)程中該設(shè)計(jì)幾個(gè)類,各個(gè)類該完成什么樣的功能,如何實(shí)現(xiàn)各個(gè)功能,一個(gè)類如何調(diào)用另一個(gè)類中的變量、如何處理

溫馨提示

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