操作系統(tǒng)-pv操作.doc_第1頁
操作系統(tǒng)-pv操作.doc_第2頁
操作系統(tǒng)-pv操作.doc_第3頁
操作系統(tǒng)-pv操作.doc_第4頁
操作系統(tǒng)-pv操作.doc_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

現(xiàn)代操作系統(tǒng)課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告(論文)報(bào)告(論文)題目: PV操作解決生產(chǎn)者-消費(fèi)者問題 作者所在系部: 計(jì)算機(jī)科學(xué)與工程系 作者所在專業(yè): 網(wǎng)絡(luò)工程 作者所在班級(jí): * 作 者 姓 名 : * 作 者 學(xué) 號(hào) : * 指導(dǎo)教師姓名: * 完 成 時(shí) 間 : 2009年11月10日 *目錄摘要3第一章 緒論41.1 綜述41.2 設(shè)計(jì)地點(diǎn)41.3 設(shè)計(jì)目的41.4 設(shè)計(jì)意義41.5 設(shè)計(jì)內(nèi)容41.6 實(shí)驗(yàn)環(huán)境5第二章 程序設(shè)計(jì)與實(shí)現(xiàn)52.1 詳細(xì)設(shè)計(jì)52.1.1 PV操作原理52.1.2生產(chǎn)者消費(fèi)者問題描述52.1.3 程序流程圖72.1.4 調(diào)試工具與命令82.1.5關(guān)鍵代碼分析8第三章 程序調(diào)試與運(yùn)行93.1編譯源文件93.2執(zhí)行目標(biāo)文件93.3運(yùn)行結(jié)果103.3.1有PV控制運(yùn)行結(jié)果103.3.2無PV控制運(yùn)行結(jié)果103.4進(jìn)程的結(jié)束113.4.1有PV控制進(jìn)程結(jié)束113.4.2無PV控制進(jìn)程結(jié)束11第四章 總結(jié)12參考文獻(xiàn)13附錄:源程序清單14摘要 進(jìn)程同步機(jī)制的主要任務(wù)是對(duì)多個(gè)機(jī)關(guān)進(jìn)程在執(zhí)行次序上進(jìn)行協(xié)調(diào),使并發(fā)執(zhí)行的諸進(jìn)程之間能按照一定的規(guī)則(或時(shí)序)共享系統(tǒng)資源,并能很好的相互合作,從而使程序的執(zhí)行具有再現(xiàn)性。生產(chǎn)者和消費(fèi)者是典型的進(jìn)程同步問題,它說明了進(jìn)程同步與臨界資源的關(guān)系。在生產(chǎn)者-消費(fèi)者問題中,所描述的是生產(chǎn)者生產(chǎn)和消費(fèi)者消費(fèi)之間的關(guān)系。為使生產(chǎn)者進(jìn)程與消費(fèi)者進(jìn)程并發(fā)執(zhí)行,在兩者之間設(shè)置了一個(gè)具有n個(gè)緩沖區(qū)的緩沖池。生產(chǎn)者進(jìn)程將它所生產(chǎn)的產(chǎn)品,按序放入一個(gè)緩沖區(qū)中。消費(fèi)者進(jìn)程也按序從一個(gè)緩沖區(qū)中取走產(chǎn)品去消費(fèi)。盡管所有的生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程,都是以異步方式運(yùn)行的,但他們之間必須保持同步關(guān)系,即不允許消費(fèi)者進(jìn)程到一個(gè)空緩沖區(qū)中取產(chǎn)品,也不允許生產(chǎn)者進(jìn)程向一個(gè)已裝滿產(chǎn)品且尚未取走的緩沖區(qū)中投放產(chǎn)品。一般來說,信號(hào)量S=0時(shí),S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請(qǐng)求分配一個(gè)單位資源,因此S的值減1;當(dāng)S0時(shí),表示已經(jīng)沒有可用資源,請(qǐng)求者必須等待別的進(jìn)程釋放該類資源,它才能運(yùn)行下去。而執(zhí)行一個(gè)V操作意味著釋放一個(gè)單位資源,因此S的值加1;若S=0,表示有某些進(jìn)程正在等待該資源,因此要喚醒一個(gè)等待狀態(tài)的進(jìn)程,使之運(yùn)行下去。多線程就是有兩個(gè)或兩個(gè)以上的信號(hào)量,線程同步的運(yùn)行。關(guān)鍵詞:生產(chǎn)者 消費(fèi)者 進(jìn)程 互斥與同步 臨界資源 緩沖區(qū)第一章 緒論1.1 綜述操作系統(tǒng)是現(xiàn)代計(jì)算機(jī)系統(tǒng)中最基本和最重要的系統(tǒng)讓軟件,它是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的一門重要的基礎(chǔ)課程。通過講授本課程,學(xué)生可以全面的了解操作系統(tǒng)的概念,操作系統(tǒng)是一組能有效的組織和管理計(jì)算機(jī)硬件和軟件資源,合理地對(duì)各類資源進(jìn)行調(diào)度,以方便用戶使用的程序的集合。其作用是管理好這些設(shè)備,提高利用率和系統(tǒng)的吞吐量,為用戶和應(yīng)用程序提供簡(jiǎn)單的接口,便于用戶使用。學(xué)完操作系統(tǒng),可以更好的搭建學(xué)生的專業(yè)基礎(chǔ)知識(shí)。本次課程設(shè)計(jì)在本著加強(qiáng)課本知識(shí)運(yùn)用能力的前提下,我選取了用PV操作來解決生產(chǎn)者消費(fèi)者問題這個(gè)題目。該題目主要是解決操作系統(tǒng)中進(jìn)程的同步與互斥的問題。1.2 設(shè)計(jì)地點(diǎn)圖書館五樓計(jì)算機(jī)系軟二機(jī)房1.3 設(shè)計(jì)目的在Linux下用C語言,調(diào)用Linux提供的系統(tǒng)函數(shù)編寫程序,實(shí)現(xiàn)操作系統(tǒng)中生產(chǎn)著與消費(fèi)者的同步于互斥問題 1.4 設(shè)計(jì)意義結(jié)合操作系統(tǒng)理論課程中學(xué)習(xí)到的記錄型信號(hào)量機(jī)制,進(jìn)程的創(chuàng)建、調(diào)度、終結(jié)方法,在Linux操作系統(tǒng)下進(jìn)行實(shí)際編程模擬操作,完成PV操作解決生產(chǎn)者-消費(fèi)者問題,使進(jìn)程能夠在系統(tǒng)中有條不紊的運(yùn)行,從而使大家對(duì)可以把理論知識(shí)運(yùn)用到實(shí)踐中來,加深對(duì)理論的理解。1.5 設(shè)計(jì)內(nèi)容 設(shè)計(jì)PV操作算法,用信號(hào)量機(jī)制實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者同步與互斥問題,并與無PV情況下進(jìn)行對(duì)比。定義20個(gè)緩沖區(qū),將其初始化為0。調(diào)用隨機(jī)函數(shù)rand()生成隨機(jī)數(shù),把隨機(jī)數(shù)通過生產(chǎn)者放入緩沖區(qū)。若緩沖區(qū)滿則其值非0。當(dāng)消費(fèi)者從緩沖區(qū)中去數(shù)后緩沖區(qū)值變?yōu)?。程序可顯示緩沖區(qū)中的全部?jī)?nèi)容,方便觀察生產(chǎn)者與消費(fèi)者的行為。程序可通過設(shè)置sleep(time)中time的值來控制生產(chǎn)者與消費(fèi)者的執(zhí)行順序。1.6 實(shí)驗(yàn)環(huán)境Ubuntu 默認(rèn)桌面環(huán)境采用 GNOME(The GNU Network Object Model Environment,GNU網(wǎng)絡(luò)對(duì)象模型環(huán)境),一個(gè) UNIX 和 Linux 主流桌面套件和開發(fā)平臺(tái)。第二章 程序設(shè)計(jì)與實(shí)現(xiàn)2.1 詳細(xì)設(shè)計(jì)2.1.1 PV操作原理 信號(hào)量機(jī)制是一種卓有成效的進(jìn)程同步工具。在長(zhǎng)期的廣泛應(yīng)用中,得到了很大的發(fā)展,信號(hào)量機(jī)制已被廣泛地應(yīng)用于但處理機(jī)和多處理機(jī)系統(tǒng)中。 在記錄型信號(hào)量中,s.value的初始值表示系統(tǒng)中某資源的數(shù)目,因而又成為資源信號(hào)量。對(duì)它的每次p操作,意味著進(jìn)程請(qǐng)求一個(gè)單位的該資源,使系統(tǒng)中可供分配的該類資源減少一個(gè),因此描述為s.value:=s.value-1;當(dāng)s.value0時(shí),表示該類資源已分配完畢,因此進(jìn)程調(diào)用block原語,進(jìn)行自我阻塞,放棄處理機(jī),并插入到信號(hào)量鏈表S.L中。 對(duì)信號(hào)量的每次v操作,表示執(zhí)行進(jìn)程釋放一個(gè)單元資源,使系統(tǒng)中可供分配的該類資源數(shù)增加一個(gè)。故s.value:=s.value+1操作表示資源數(shù)目加1。若加1后仍是s.value=0,則表示在該信號(hào)量鏈表中,仍有等待該資源的進(jìn)程被阻塞,故還應(yīng)調(diào)用wakeup原語,將S.L鏈表中的第一個(gè)等待進(jìn)程喚醒。如果s.value的初始值為1,表示只允許一個(gè)進(jìn)程訪問臨界資源,此時(shí)信號(hào)量轉(zhuǎn)化為互斥信號(hào)量用于進(jìn)程互斥。2.1.2生產(chǎn)者消費(fèi)者問題描述為了實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者同步與互斥的問題,該程序用記錄型信號(hào)量機(jī)制來實(shí)現(xiàn)。假定在生產(chǎn)者與消費(fèi)者之間,利用一個(gè)公共的緩沖池來進(jìn)行通信,生產(chǎn)者將所生產(chǎn)的信息放入其中,消費(fèi)者cognitive緩沖池中取得消息來消費(fèi),該緩沖池具有n個(gè)緩沖區(qū),其編號(hào)為0,1,2,3,n-1;設(shè)置一個(gè)互斥信號(hào)量mutex,用于實(shí)現(xiàn)諸進(jìn)程對(duì)緩沖池的互斥使用,其初值為1,利用資源信號(hào)量empty,表示緩沖池中空緩沖區(qū)的數(shù)目,其初值為n;full分別表示緩沖池中滿緩沖區(qū)的數(shù)目,其初值為0.又假定這些生產(chǎn)者和消費(fèi)者相互等效,只要緩沖池未滿,生產(chǎn)者便可將消息送入由指針in所指的緩沖區(qū);只要緩沖池未空,消費(fèi)者變可以從由指針out所指示的緩沖區(qū)中,取走一個(gè)消息。對(duì)生產(chǎn)者消費(fèi)者的問題可以描述如下:Var metux,empty,full:semaphore=1,n,0;Buffer:array0,n-1 of item;In,out:integer:=0;Begin: Pabegin Producer:begin Repeat Producer an item nextp; P(empty);P(mutex); buffer(in):=nextp; in:=(in+1)mod n; V(mutex); V(full);Until false;EndConsumer:begin Repeat P(full);P(mutex); nextc:= buffer(out); out:=(out+1)mod n; V(mutex); V(empty);Until false;EndParendEnd2.1.3 程序流程圖創(chuàng)建進(jìn)程模擬生產(chǎn)者消費(fèi)者生 產(chǎn) 者消 費(fèi) 者阻塞N存在空緩沖區(qū)有消費(fèi)請(qǐng)求?Y阻塞阻塞另一生產(chǎn)者正在寫?此請(qǐng)求可滿足?YN確定產(chǎn)品位置進(jìn)入臨界區(qū)阻塞此產(chǎn)品正被消費(fèi)?從空緩沖區(qū)中為本生產(chǎn)者分配一個(gè)空間進(jìn)入臨界區(qū)(對(duì)同一產(chǎn)品進(jìn)行請(qǐng)求的消費(fèi)者之間互斥)退出臨界區(qū)在該緩沖區(qū)中寫入產(chǎn)品消費(fèi)產(chǎn)品、并判斷是否應(yīng)該釋放產(chǎn)品所占緩沖區(qū)通過信號(hào)量通知等待本產(chǎn)品的消費(fèi)者退出臨界區(qū)結(jié)束生產(chǎn)者進(jìn)程結(jié)束消費(fèi)者進(jìn)程圖 2-1 程序流程圖2.1.4 調(diào)試工具與命令調(diào)試過程中可能用到的命令:啟動(dòng)vi編輯器:vi 文件:q! 不存盤退出。:w 將緩沖區(qū)內(nèi)的資料寫入磁盤中,但并不離開vi:q 直接退出。:wq 存盤并退出:wq! 強(qiáng)行存盤退出(相當(dāng)于ZZ)編譯命令:gcc -o 目標(biāo)文件名源文件名執(zhí)行命令:./ 目標(biāo)文件名2.1.5關(guān)鍵代碼分析1 信號(hào)量操作創(chuàng)建信號(hào)量函數(shù) :int semget(key_t key, int nsems, int semflg);控制信號(hào)量函數(shù):int semctl(int semid, int semnum, int cmd, union semun arg);PV操作函數(shù): int semop(int semid, struct sembuf * sops, unsigned nsops);信號(hào)量的使用是一個(gè)很容易出錯(cuò)的問題,如在程序退出時(shí),必須還原所有的加鎖,否則程序會(huì)運(yùn)行出錯(cuò)。本系統(tǒng)在緩沖區(qū)操作時(shí)分為兩種情況sem_p(emptyid, 0)之后,如果要寫入的緩沖區(qū)為空,則執(zhí)行寫入操作然后sem_v (fullid, 0),如果要寫入的緩沖區(qū)為空,則執(zhí)行程序不能寫入換沖區(qū),要執(zhí)行還原操作,執(zhí)行sem_v (emptyid, 0)操作。本程序定義的信號(hào)量有emptyid、fullid、mutexid。fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);2. 共享內(nèi)存操作創(chuàng)建共享內(nèi)存: shmget(char * pathname, int proj_id, size_t size);arrayid=shmget(IPC_PRIVATE,sizeof(int)*MAXSHM,IPC_CREAT|0666);getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);setid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);刪除共享內(nèi)存: shmctl (char * viraddr, int shmid);本程序定義的共享內(nèi)存有array、set、get。其中array為20個(gè)共享緩沖區(qū),set為多個(gè)生產(chǎn)者進(jìn)程共同的取數(shù)端和計(jì)數(shù)器,get為消費(fèi)者的計(jì)數(shù)器。3. 進(jìn)程操作創(chuàng)建進(jìn)程函數(shù):fork();進(jìn)程退出函數(shù):exit (0);這進(jìn)程等待子進(jìn)程退出函數(shù):wait (sumert, (int *)0, 0);Main主進(jìn)程使用fork()生成子進(jìn)程,這樣就生成里一個(gè)消費(fèi)者或生產(chǎn)者進(jìn)程,并且還為主進(jìn)程的子進(jìn)程。當(dāng)子程序執(zhí)行了exit(0)第 9 頁 共 21 頁現(xiàn)代操作系統(tǒng)課程設(shè)計(jì)第三章 程序調(diào)試與運(yùn)行3.1編譯源文件在Linux下編譯源文件用命令gcc:如圖3-1。圖 3-1 編輯命令gcc3.2執(zhí)行目標(biāo)文件在Linux先執(zhí)行目標(biāo)文件用命令./目標(biāo)文件。如圖3-2。 圖 3-2 執(zhí)行命令./目標(biāo)文件3.3運(yùn)行結(jié)果 3.3.1有PV控制運(yùn)行結(jié)果有PV控制下的運(yùn)行結(jié)果如圖3-3所示圖3-3 有PV控制下的運(yùn)行結(jié)果3.3.2無PV控制運(yùn)行結(jié)果無PV控制下的運(yùn)行結(jié)果如圖3-4所示圖3-4 無PV控制下的運(yùn)行結(jié)果3.4進(jìn)程的結(jié)束 3.4.1有PV控制進(jìn)程結(jié)束有PV控制下的進(jìn)程結(jié)束顯示結(jié)果如圖3-5所示圖3-5有PV控制下的進(jìn)程結(jié)束3.4.2無PV控制進(jìn)程結(jié)束無PV控制下的進(jìn)程結(jié)束顯示結(jié)果如圖3-6所示圖 3-6無PV控制下進(jìn)程的結(jié)束第四章 總結(jié)此次課程設(shè)計(jì)學(xué)習(xí)了在C語言里定義信號(hào)量、共享內(nèi)存的使用、用fork()函數(shù)創(chuàng)建子進(jìn)程以及定義信號(hào)量的PV操作,并通過sleep函數(shù)來調(diào)整生產(chǎn)者和消費(fèi)者對(duì)緩沖區(qū)的操作,在無PV時(shí)初始時(shí)讓sleep(time)中的time=1可以看到消費(fèi)者對(duì)緩沖區(qū)進(jìn)行讀,而此時(shí)生產(chǎn)者并無向緩沖區(qū)中放東西。在有PV控制下必須是緩沖區(qū)非空且無生產(chǎn)者對(duì)緩沖區(qū)進(jìn)行操作時(shí)消費(fèi)者才能對(duì)緩沖區(qū)操作,同理只有緩沖區(qū)不滿而且無消費(fèi)者操作時(shí)生產(chǎn)者才能對(duì)緩沖區(qū)操作。通過與無PV控制下對(duì)緩沖區(qū)進(jìn)行讀寫可以進(jìn)一步理解在信號(hào)量控制下的作用。 這次試驗(yàn)讓我深刻的了解了操作系統(tǒng)的PV操作,也加深了對(duì)操作系統(tǒng)的認(rèn)識(shí),課本上的概念也有了深入的印象,使我對(duì)操作系統(tǒng)這個(gè)學(xué)科有了整體觀感,這次試驗(yàn),使我受益匪淺,感謝老師的指導(dǎo)和幫助,感謝同學(xué)的幫助和關(guān)心!參考文獻(xiàn)1 湯小丹,梁紅兵,哲鳳屏,湯子瀛 著?,F(xiàn)代操作系統(tǒng)。電子工業(yè)出版社,2008年4月2 湯小丹,梁紅兵,哲鳳屏,湯子瀛 編著。計(jì)算機(jī)操作系統(tǒng)。現(xiàn)電子科技大學(xué)出版社,2007年5月3 計(jì)算機(jī)操作系統(tǒng)教程清華大學(xué)出版社 張堯?qū)W附錄:源程序清單第 21 頁 共 21 頁#include#include#include#include#include#include#include#include#define MAX 20 / 定義緩沖區(qū)的大小/*定義信號(hào)量?jī)?nèi)部標(biāo)識(shí)*/int emptyid;int fullid;int mutexid;int main() printf(*使用pv操作*n);pv();printf(*無pv操作*n);no_PV();int pv()int i,C1,C2,p1,p2,m; srand(time(NULL);/*定義P、V操作所用的數(shù)據(jù)結(jié)構(gòu)*/struct sembuf P,V;/*定義給信號(hào)量賦初值的參數(shù)數(shù)據(jù)結(jié)構(gòu)*/union semun arg;/*定義共享內(nèi)存*/int shmid1,shmid2,shmid3;int *buffer,*get,*set;/*創(chuàng)建信號(hào)量并初始化*/emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);mutexid=semget(IPC_PRIVATE,1,0666|IPC_CREAT); arg.val=1; /*為信號(hào)量賦初值*/if(semctl(mutexid,0,SETVAL,arg)=1)perror(semctl setval error);arg.val=20; /*為信號(hào)量賦初值*/if(semctl(emptyid,0,SETVAL,arg)=1)perror(semctl setval error);arg.val=0;if(semctl(fullid,0,SETVAL,arg)=1)perror(semctl setval error);/*定義信號(hào)量的P操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=0;/*定義信號(hào)量的V操作*/V.sem_num=0;V.sem_op=1;V.sem_flg=0;/*創(chuàng)建并附接共享內(nèi)存*/shmid1=shmget(IPC_PRIVATE,MAX,0666|IPC_CREAT); buffer=(int*)shmat(shmid1,0,0);for( m=0;mMAX;m+)bufferm=0; /*創(chuàng)建緩沖區(qū)信號(hào)量buffer、讀緩沖區(qū)號(hào)的計(jì)數(shù)get以及寫緩沖區(qū)號(hào)的計(jì)數(shù)set,并初始化*/shmid2=shmget(IPC_PRIVATE,4,0666|IPC_CREAT); set=(int*)shmat(shmid2,0,0);(*set)=0;shmid3=shmget(IPC_PRIVATE,4,0666|IPC_CREAT);get=(int*)shmat(shmid3,0,0);(*get)=0;while(p1=fork()=-1);/創(chuàng)建生產(chǎn)者1子進(jìn)程直到成功為止,p1存放子進(jìn)程的pid號(hào)if(p1=0) /返回值=0表示子進(jìn)程返回for(i=0;iMAX;i+) sleep(1);semop(emptyid,&P,1);/對(duì)emptyid執(zhí)行P操作semop(mutexid,&P,1);/對(duì)mutexid執(zhí)行P操作if(*set)MAX)printf(nP1 put data in No.%dn,*set);printf(printf all the data in the buffer :); buffer*set=(rand()%20)+1;for(m=0;mMAX;m+) for(m=0;m=20)break;printf(P1 over!n);exit(0); while(p2=fork()=-1);/創(chuàng)建生產(chǎn)者2子進(jìn)程直到成功為止,p1存放子進(jìn)程的pid號(hào)if(p2=0) /返回值=0表示子進(jìn)程返回for(i=0;iMAX;i+)sleep(3);semop(emptyid,&P,1);/對(duì)emptyid執(zhí)行P操作semop(mutexid,&P,1);/對(duì)mutexid執(zhí)行P操作if(*set)MAX)printf(nP2 put data in No.%dn,*set);printf(printf all the data in the buffer :); buffer*set=(rand()%20)+1;for(m=0;m=20)break;sleep(1);printf(P2 over!n);exit(0);while(C1=fork()=-1);/創(chuàng)建消費(fèi)者1子進(jìn)程if(C1=0)for(i=0;iMAX;i+)sleep(1);semop(fullid,&P,1);/對(duì)fullid執(zhí)行P操作semop(mutexid,&P,1);if(*get)MAX)printf(nC1 get number from No.%dn,*get);buffer*get=0;printf(printf all the data in the buffer :);for( m=0;m=MAX)break;printf(C1 over!n);exit(0);while(C2=fork()=-1);/創(chuàng)建消費(fèi)者2子進(jìn)程if(C2=0)for(i=0;iMAX;i+)sleep(1);semop(fullid,&P,1);/對(duì)fullid執(zhí)行P操作semop(mutexid,&P,1);if(*get)MAX)printf(nC2 get number from No.%dn,*get);buffer*get=0;printf(printf all the data in the buffer :);for( m=0;m=MAX)break;printf(C2 over!n);exit(0);wait(0); /等待子進(jìn)程終止 wait(0);wait(0);shmdt(buffer); /斷開附接的共享內(nèi)存shmdt(get); /斷開附接的共享內(nèi)存shmdt(set); /斷開附接的共享內(nèi)存 shmctl(shmid1,IPC_RMID,0);/撤消共享內(nèi)存和信號(hào)量集semctl(emptyid,IPC_RMID,0);semctl(fullid,IPC_RMID,0);semctl(mutexid,IPC_RMID,0);wait(0);int no_PV()int i,C1,C2,p1,p2,m;/*定義P、V操作所用的數(shù)據(jù)結(jié)構(gòu)*/*定義共享內(nèi)存*/int shmid1,shmid2,shmid3;int *buffer,*get,*set;/*創(chuàng)建并附接共享內(nèi)存*/shmid1=shmget(IPC_PRIVATE,MAX,0666|IPC_CREAT); buffer=(int*)shmat(shmid1,0,0);for( m=0;mMAX;m+)bufferm=0; /*創(chuàng)建緩沖區(qū)信號(hào)量buffer、讀緩沖區(qū)號(hào)的計(jì)數(shù)get以及寫緩沖區(qū)號(hào)的計(jì)數(shù)set,并初始化*/shmid2=shmget(IPC_PRIVATE,4,0666|IPC_CREAT); set=(int*)shmat(shmid2,0,0);(*set)=0;shmid3=shmget(IPC_PRIVATE,4,0666|IPC_CREAT);get=(int*)shmat(shmid3,0,0);(*get)=0;while(p1=fork()=-1);/創(chuàng)建生產(chǎn)者1子進(jìn)程直到成功為止,p1存放子進(jìn)程的pid號(hào)if(p1=0) /返回值=0表示子進(jìn)程返回for(i=0;iMAX;i+)sleep(1);if(*set)MAX)printf(nP1 put data in No.%dn,*set);printf(printf all the data in the buffer :); buffer*set=(rand()%20)+1;for(m=0;mMAX;m+)for( m=0;m=20)break;printf(P1 over!n);exit(0);while(p2=fork()=-1);/創(chuàng)建生產(chǎn)者2子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論