操作系統(tǒng)課程設計(信號量的操作)_第1頁
操作系統(tǒng)課程設計(信號量的操作)_第2頁
操作系統(tǒng)課程設計(信號量的操作)_第3頁
操作系統(tǒng)課程設計(信號量的操作)_第4頁
操作系統(tǒng)課程設計(信號量的操作)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)課程設計(信號量的操作)目錄1題目內(nèi)容及要求..........................................................................21.1題目名稱...............................................................................31.2題目描述...............................................................................31.3解題思路...............................................................................41.4程序清單...............................................................................41.5提交結(jié)果框圖.......................................................................82總結(jié)...........................................................................................103參考文獻...................................................................................1111題目內(nèi)容及要求信號量的操作(PV操作)實驗目的:了解信號量機制,了解并掌握進行同步和機制,熟悉信號量的操作函數(shù),利用信號量實現(xiàn)對共享資源的控制。實驗要求:通過對Windows系統(tǒng)的內(nèi)核同步對象Mutexes和Semaphores的使用來實現(xiàn)進程同步的控制。利用CreateSemaphore、WaitForSingleObject等函數(shù)檢測內(nèi)核同步對象的狀態(tài)。WindowsAPI:在本實驗中涉及的API有:1ExitThread用于結(jié)束當前線程。VOIDExitThread(DWORDdwExitCode//exitcodeforthisthread);2信號量控制:WaitForSingleObject可在指定的時間內(nèi)等待指定對象為可用狀態(tài);DWORDWaitForSingleObject(HANDLEhHandle,//handletoobjectDWORDdwMilliseconds//time-outinterval);hHandle為等待的對象,也就是實現(xiàn)同步或者互斥的對象。該函數(shù)一執(zhí)行,相應的信號量就減去1,如果信號量小于等于0,那么他一直在循環(huán)。3實現(xiàn)信號量互斥和同步CreateSemaphore用于創(chuàng)建信號量,根據(jù)參數(shù)的不同可以利用它實現(xiàn)互斥和同步。ReleaseSemaphore用于釋放信號量,使用后相應的信號量加121.1題目名稱信號量的操作(PV操作)1.2題目描述假設某宿舍樓有一共用浴室,學校頒布法令:當有一個女生正在使用浴室,則其他女生可以進入,但是男生不行,反之亦然。在每個浴室門上有一個滑動指示符號,表示當前處于以下三種可能狀態(tài)之一:1.空2.有女生3.有男生(1)構(gòu)造記錄浴室狀態(tài)和人數(shù)的構(gòu)造函數(shù)構(gòu)造四個函數(shù)用來分別存放男女生的P,V信息woman_wants_to_enter,man_wants_to_enter,woman_leaves,man_leaves.(2)判斷浴室處于什么狀態(tài)woman_wants_to_enter,當浴室里沒有人或者有女生的時候可以進去,當有男生的時候循環(huán)找另外的浴室是否有人,如果沒人或者有女生的時候可以進去,否則等待。(3)對男女生進行P,V操作P操作,對浴室人數(shù)進行減1操作,判斷結(jié)果是否大于等于0,如果大于等于0則進入浴室,反之等待。V操作,對顧客進行加1操作,判斷結(jié)果是否大于0,如果大于0則進入等待,反之可以進入。(4)構(gòu)造浴室人數(shù)函數(shù)當浴室有一個同性別人的話,責進入并人數(shù)加1,當有人從浴室出來時,人數(shù)減1。1)把信號量視為一個加鎖標志位,實現(xiàn)對一個共享變量的互斥訪問。實現(xiàn)過程:P(mutex);//mutex的初始值為1訪問該共享數(shù)據(jù);V(mutex);非臨界區(qū);2)把信號量視為是某種類型的共享資源的剩余個數(shù),實現(xiàn)對一類共享資源的訪問。3實現(xiàn)過程:P(resource);//resource的初始值為該資源的個數(shù)N使用該資源;V(resource);非臨界區(qū);3)把信號量作為進程間的同步工具實現(xiàn)過程:臨界區(qū)C1;P(S);V(S);臨界區(qū)C2;1.3解題思路(1)控制流程用HANDLEbathroomSemaphore函數(shù)檢查浴室中是否有異性,使男女分開。如果有則尋找別的浴室或繼續(xù)等待。(2)創(chuàng)建num[bathroomNum]創(chuàng)建num[bathroomNum]記錄浴室里的人數(shù),如果為異性則互斥P操作,如果為同性則進入浴室。(3)同步與互斥WaitForSingleObject(信號量名字,infinite)和ReleaseSemaphore(信號量名字,1,null)用于實現(xiàn)同步于互斥,執(zhí)行WaitForSingleObject(信號量名字,infinite)信號量相應的信號量減1,執(zhí)行ReleaseSemaphore(信號量名字,1,null)恢復1。信號量的定義:DWORDWINAPIwoman_wants_to_enter(LPVOID);//構(gòu)造線程的函數(shù)DWORDWINAPIman_wants_to_enter(LPVOID);DWORDWINAPIman_leaves(LPVOID);DWORDWINAPIwoman_leaves(LPVOID);普通變量的定義:constintbathroomNum=4;//浴室數(shù)目constintNum=8;//等待的人數(shù)1.4程序清單#include<windows.h>#include<iostream>constintbathroomNum=4;constintNum=8;DWORDWINAPIwoman_wants_to_enter(LPVOID);//構(gòu)造線程的函數(shù)DWORDWINAPIman_wants_to_enter(LPVOID);4DWORDWINAPIman_leaves(LPVOID);DWORDWINAPIwoman_leaves(LPVOID);DWORDWINAPIbegin(LPVOID);HANDLEMutex;//信號量互斥使用br數(shù)組HANDLEbathroomSemaphore;//同步使用浴室,使男女分開enumbathroomtype{empty=0,man=1,woman=2};typedefstruct{enumbathroomtypebt[bathroomNum];intnum[bathroomNum];}BathRoom;//紀錄浴室狀態(tài)和人數(shù)BathRoombr;boolg_continue=true;//循環(huán)變量usingnamespacestd;DWORDWINAPIwoman_wants_to_enter(LPVOIDlpPara){WaitForSingleObject(bathroomSemaphore,INFINITE);//同步pPWaitForSingleObject(Mutex,INFINITE);//互斥inta=rand()%bathroomNum;while(br.bt[a]==man){a=(++a)%bathroomNum;}br.bt[a]=woman;br.num[a]+=1;printf("woman進入%d浴室\n",a);printf("浴室%d這里有%d個woman\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d沒有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥Vreturn0;}DWORDWINAPIman_wants_to_enter(LPVOIDlpPara){WaitForSingleObject(bathroomSemaphore,INFINITE);//PWaitForSingleObject(Mutex,INFINITE);//互斥Pinta=rand()%bathroomNum;while(br.bt[a]==woman){a=(++a)%bathroomNum;}5br.bt[a]=man;br.num[a]+=1;printf("man進入%d浴室\n",a);printf("浴室%d這里有%d個man\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d沒有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥Vreturn0;}DWORDWINAPIman_leaves(LPVOIDlpPara){WaitForSingleObject(Mutex,INFINITE);//互斥Pinta=rand()%bathroomNum;while(br.bt[a]!=man){a=(++a)%bathroomNum;}br.num[a]-=1;if(br.num[a]==0){br.bt[a]=empty;ReleaseSemaphore(bathroomSemaphore,1,NULL);}printf("man離開%d浴室\n",a);printf("浴室%d還剩%d個man\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d沒有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥vreturn0;}DWORDWINAPIwoman_leaves(LPVOIDlpPara){WaitForSingleObject(Mutex,INFINITE);inta=rand()%bathroomNum;while(br.bt[a]!=woman){6a=(++a)%bathroomNum;}br.num[a]-=1;if(br.num[a]==0){br.bt[a]=empty;ReleaseSemaphore(bathroomSemaphore,1,NULL);}printf("woman離開%d浴室\n",a);printf("浴室%d還剩%d個woman\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d沒有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);return0;}DWORDWINAPIbegin1(LPVOIDlpPara){CreateThread(NULL,0,woman_wants_to_enter,NULL,0,NULL);Sleep(1000);CreateThread(NULL,0,woman_leaves,NULL,0,NULL);return0;}DWORDWINAPIbegin2(LPVOIDlpPara){CreateThread(NULL,0,man_wants_to_enter,NULL,0,NULL);Sleep(1000);CreateThread(NULL,0,man_leaves,NULL,0,NULL);return0;}DWORDWINAPIbegin(LPVOIDlpPara){intk=0,x=0;while(g_continue&&(x++)<Num){if(rand()%2==0)CreateThread(NULL,0,begin1,NULL,0,NULL);elseCreateThread(NULL,0,begin2,NULL,0,NULL);}return0;}7intmain(){for(inti=0;i<bathroomNum;i++){br.bt[i]=empty;br.num[i]=0;}Mutex=CreateMutex(NULL,FALSE,NULL);bathroomSemaphore=CreateSemaphore(NULL,bathroomNum+1,bathroomNum+1,NULL);CreateThread(NULL,0,begin,NULL,0,NULL);while(g_continue){if(getchar()){g_continue=false;}}return0;}1.5提交結(jié)果框圖8圖6.3運行結(jié)果如圖所示,輸出的結(jié)果是隨機的,當有同性的人或者沒人在浴室時可以進入,當有異性在浴室時到別的浴室查看或等待。92總結(jié)這次課程設計是關于信號量的操作,關于信號量的同步與互斥問題。通過這次設計使得我對線程以及其同步與互斥機制有了更深一步的理解。以前只是在使用操作系統(tǒng),而對于其內(nèi)部的工作原理并不了解,只有存在了操作系統(tǒng)才使得我們不用在裸機的環(huán)境下工作,讓用戶與計算機徹底的連接了起來。通過這次課程設計,我確實學到了很多東西,多年后我可能已經(jīng)忘記這次課設最后打了多少分,但這些學到的東西卻可以使我受益終生。除了知識技術上的東西,我更鍛煉了自己的快速學習能力;我學會了如何快速有效地從圖書館、網(wǎng)絡獲取自己需要的信息;我嘗到了在周圍很多同學拷來拷去時孤軍奮戰(zhàn)的痛苦;我體會了夜以繼日完成一個項目時中途過程的艱辛及最終完成后巨大的成就感……我更加深了人生的信心,以后面對任何一個困難的項目,我想我都不會懼怕,并最終能夠成功地將其完成。當然最重要的還是老師的耐心指導,在此要感謝老師~

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論