操作系統(tǒng)讀者寫著問題_第1頁
操作系統(tǒng)讀者寫著問題_第2頁
操作系統(tǒng)讀者寫著問題_第3頁
操作系統(tǒng)讀者寫著問題_第4頁
操作系統(tǒng)讀者寫著問題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程設(shè)計(jì)報(bào)告課程名稱 課題名稱 專 業(yè) 通信工程 班 級 1001班 學(xué)號 201003040111 姓 名 劉新超 指導(dǎo)教師 田娟秀、顏國風(fēng)、李杰君2013年7月5日湖南工程學(xué)院課程設(shè)計(jì)任務(wù)書課程名稱 操作系統(tǒng)教程課題模擬讀者寫者問題專業(yè)班級 通信1001班 學(xué)生姓名 劉新超 學(xué)號 201003040111 指導(dǎo)老師 田娟秀、顏國風(fēng)、李杰君審批 任務(wù)書下達(dá)日期2013年6月24日任務(wù)完成日期2013年7月5日一、設(shè)計(jì)內(nèi)容與設(shè)計(jì)要求1設(shè)計(jì)內(nèi)容:課題5:模擬實(shí)現(xiàn)讀者寫者問題讀者寫者問題是一個(gè)經(jīng)典的并發(fā)程序設(shè)計(jì)問題,是經(jīng)常出現(xiàn)的一種同步問題。所謂讀者寫者問題,是指保證一個(gè)writer進(jìn)程必須與其他進(jìn)程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個(gè)讀者可以同時(shí)讀這本書,但是,只能有一個(gè)寫者在寫書,并且,讀者比寫者優(yōu)先,也就是說,讀者和寫者同時(shí)提出請求時(shí),讀者優(yōu)先。當(dāng)讀者提出請求時(shí)需要有一個(gè)互斥操作,另外,需要有一個(gè)信號量S來當(dāng)前是否可操作。2選題方案:所選題目根據(jù)學(xué)號確定,學(xué)號模7加1,即(學(xué)號%7+1)。如你的學(xué)號為9,則所選題目號為:9%7+1=(題目3)。3設(shè)計(jì)要求:3.1課程設(shè)計(jì)報(bào)告規(guī)范(1) 需求分析程序的功能。^輸入輸出的要求。(2) 概要設(shè)計(jì)程序由哪些模塊組成以及模塊之間的層次結(jié)構(gòu)、各模塊的調(diào)用關(guān)系;每個(gè)模塊的功能。課題涉及的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫結(jié)構(gòu);即要存儲什么數(shù)據(jù),這些數(shù)據(jù)是什么樣的結(jié)構(gòu),它們之間有什么關(guān)系等。(3) 詳細(xì)設(shè)計(jì)采用C語言定義相關(guān)的數(shù)據(jù)類型。寫出各模塊的類C碼算法。畫出各函數(shù)的調(diào)用關(guān)系圖、主要函數(shù)的流程圖。(4) 調(diào)試分析以及設(shè)計(jì)體會(huì)a.測試數(shù)據(jù):準(zhǔn)備典型的測試數(shù)據(jù)和測試方案,包括正確的輸入及輸出結(jié)果和

含有錯(cuò)誤的輸入及輸出結(jié)果。程序調(diào)試中遇到的問題以及解決問題的方法。課程設(shè)計(jì)過程經(jīng)驗(yàn)教訓(xùn)、心得體會(huì)。(5) 使用說明用戶使用手冊:說明如何使用你編寫的程序,詳細(xì)列出每一步的操作步驟。(6) 書寫格式設(shè)計(jì)報(bào)告要求用A4紙打印成冊:一級標(biāo)題用3號黑體,二級標(biāo)題用四號宋體加粗,正文用小四號宋體;行距為22。(7) 附錄源程序清單(帶注釋)3.2考核方式指導(dǎo)老師負(fù)責(zé)驗(yàn)收程序的運(yùn)行結(jié)果,并結(jié)合學(xué)生的工作態(tài)度、實(shí)際動(dòng)手能力、創(chuàng)新精神和設(shè)計(jì)報(bào)告等進(jìn)行綜合考評,并按優(yōu)秀、良好、中等、及格和不及格五個(gè)等級給出每位同學(xué)的課程設(shè)計(jì)成績。具體考核標(biāo)準(zhǔn)包含以下幾個(gè)部分:(1) 平時(shí)出勤(占10%)(2) 系統(tǒng)需求分析、功能設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及程序總體結(jié)構(gòu)合理與否(占10%)(3) 程序能否完整、準(zhǔn)確地運(yùn)行,個(gè)人能否獨(dú)立、熟練地調(diào)試程序(占40%)(4) 設(shè)計(jì)報(bào)告(占30%)注意:不得抄襲他人的報(bào)告(或給他人抄襲),一旦發(fā)現(xiàn),成績?yōu)榱惴?。?) 獨(dú)立完成情況(占10%)。3.3課程驗(yàn)收要求(1) 運(yùn)行所設(shè)計(jì)的系統(tǒng)。(2) 回答有關(guān)問題。(3) 提交課程設(shè)計(jì)報(bào)告。(4) 提交軟盤(源程序、設(shè)計(jì)報(bào)告文檔)。(5) 依內(nèi)容的創(chuàng)新程度,完善程序情況及對程序講解情況打分。二、進(jìn)度安排第19周:星期一星期二星期三第19周:星期一星期二星期三8:00——12:008:00——12:0014:30——18:30上機(jī)上機(jī)上機(jī)TOC\o"1-5"\h\z\o"CurrentDocument"1課題的主要功能 III\o"CurrentDocument"2課題的功能模塊的劃分 IV\o"CurrentDocument"2.1線程的創(chuàng)建 IV\o"CurrentDocument"2.2實(shí)現(xiàn)信號量互斥和同步 IV\o"CurrentDocument"2.3信號量控制 IV\o"CurrentDocument"2.4讀寫過程 V\o"CurrentDocument"2.5結(jié)構(gòu)體創(chuàng)建 V\o"CurrentDocument"2.6各個(gè)模塊圖 V\o"CurrentDocument"3主要功能實(shí)現(xiàn) VI4程序調(diào)試 VII\o"CurrentDocument"總結(jié) VIII\o"CurrentDocument"附件 IX\o"CurrentDocument"7評分表 XIII1課題的主要功能課題描述:模擬實(shí)現(xiàn)讀者寫者問題模擬操作:讀者寫者問題是一個(gè)經(jīng)典的并發(fā)程序設(shè)計(jì)問題,是經(jīng)常出現(xiàn)的一種同步問題。所謂讀者寫者問題,是指保證一個(gè)writer進(jìn)程必須與其他進(jìn)程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個(gè)讀者可以同時(shí)讀這本書,但是,只能有一個(gè)寫者在寫書,并且,讀者比寫者優(yōu)先,也就是說,讀者和寫者同時(shí)提出請求時(shí),讀者優(yōu)先。當(dāng)讀者提出請求時(shí)需要有一個(gè)互斥操作,另外,需要有一個(gè)信號量S來當(dāng)前是否可操作。

2課題的功能模塊的劃分2.1線程的創(chuàng)建線程的創(chuàng)建主要用到windowsAPICreateThread完成線程創(chuàng)建,在調(diào)用進(jìn)程的地址空間創(chuàng)建一個(gè)個(gè)線程,以執(zhí)行指定的函數(shù);它的返回值為所創(chuàng)建線程的句柄。CreateThread(LPSECURITY_ATTRIBUTESIpThreadAttributes,//線程安全屬性指針,默認(rèn)為NULLDWORDdwStackSize,//堆棧大小LPTHREAD_START_ROUTINElpStartAddress,//線程函數(shù)LPVOIDlpParameter,//線程參數(shù),默認(rèn)為NULLDWORDdwCreationFlags, //線程創(chuàng)建屬性,默認(rèn)為0LPDWORDlpThreadId //線程ID);2.2實(shí)現(xiàn)信號量互斥和同步CreateSemaphore用于創(chuàng)建信號量,根據(jù)參數(shù)的不同可以利用它實(shí)現(xiàn)互斥和同步。ReleaseSemaphore用于釋放信號量,使用后相應(yīng)的信號量加1CreateSemaphore(LPSECURITY_ATTRIBUTESIpSemaphoreAttributes,LONG,lInitialCount,LONG,lMaximumCount,LONG,lInitialCount,LONG,lMaximumCount,LPCTSTRlpName);ReleaseSemaphore(HANDLEhSemaphore,LONGlRelseaseCount,LPLONGlpPreviousCount);//initialcount//maximumcount//objectname//handletosemaphore//contincrementamount//previouscount2.3信號量控制WaitForSingleObject可在指定的時(shí)間內(nèi)等待指定對象為可用狀態(tài);DWORDWaitForSingleObject(HANDLEhHandle, //handletoobjectDWORDdwMilliseconds//time-outinterval);hHandle為等待的對象,也就是實(shí)現(xiàn)同步或者互斥的對象。該函數(shù)一執(zhí)行,相應(yīng)的信號量就減去1,如果信號量小于等于0,那么他一直在循環(huán)。等于執(zhí)行P操作。ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此時(shí)沒有讀者,可以寫

實(shí)現(xiàn)同步或者互斥的對象。該函數(shù)一執(zhí)行,相應(yīng)的信號量就加上1,如果信號量小于等于0,那么他一直在循環(huán)。等于執(zhí)行V操作。2.4讀寫過程DWORDWINAPIWriterProc(LPVOIDIpParam)函數(shù)是表示寫的過程,當(dāng)有信號出發(fā)就可以進(jìn)行寫過程,當(dāng)已經(jīng)有一個(gè)寫者正在寫時(shí),它和其他的寫者,讀者是互斥的。DWORDWINAPIReaderProc(LPVOIDlpParam)函數(shù)是表示讀的過程,當(dāng)有信號出發(fā)就可以進(jìn)行讀過程,當(dāng)已經(jīng)有一個(gè)讀者正在讀時(shí),它和其他的寫者是互斥的,和其他的讀者是共用的。2.5 結(jié)構(gòu)體創(chuàng)建typedefstruct_Person{HANDLEm_hThread;//定義處理線程的句柄intm_nType;//進(jìn)程類型(讀寫)intm_nStartTime;//開始時(shí)間intm_nWorkTime;//運(yùn)行時(shí)間intm_nID;//進(jìn)程號}Person;創(chuàng)建一個(gè)結(jié)構(gòu)體主要定義一個(gè)線程所要的各個(gè)參數(shù)屬性,方便讀取。intg_PersonLists[]={W,s項(xiàng)),s項(xiàng)),2,W,s_j(),s_j(),3,R,s_j(),s_j(),W,s_j(),,5,R,s_j(),s_j(),6,R,s_j(),s_j(),END,};〃隊(duì)列在這里定義一個(gè)隊(duì)列,可以初始化線程,創(chuàng)建線程是它的線程參數(shù)屬性都是從隊(duì)列里進(jìn)行讀取,這個(gè)一共有六個(gè)線程,三個(gè)讀,三個(gè)寫。另外,定義的到達(dá)時(shí)間,執(zhí)行時(shí)間是用隨機(jī)函數(shù)產(chǎn)生s_j()。2.6各個(gè)模塊圖創(chuàng)建信號量CreateSemaphorMain函數(shù)調(diào)CreateReader創(chuàng)建讀者與寫者CreatePersonList調(diào)用CreateWriter創(chuàng)建寫著DWORD創(chuàng)建讀調(diào)用DWINAPIDWORD創(chuàng)建讀調(diào)用DWINAPIReaderProc寫過程WORD調(diào)WINAPIReaderProc讀過程圖1各個(gè)模塊圖功能及調(diào)用關(guān)系3主要功能實(shí)現(xiàn)圖3程序調(diào)試結(jié)果說明:根據(jù)程序執(zhí)行的結(jié)果我們可以推導(dǎo)出創(chuàng)建的六個(gè)線程他們的執(zhí)行順序,執(zhí)行時(shí)間。讀者6先到申請資源此時(shí)6開始讀取,當(dāng)讀到第2秒時(shí),寫者1開始申請資源,讀者的優(yōu)先級比較高,寫者1等待。當(dāng)讀到第4秒時(shí),讀者3開始申請資源,讀者與讀者是共用關(guān)系,所以讀者3開始讀取,寫者4也開始申請資源,讀者的優(yōu)先級比較高,寫者4等待。當(dāng)讀到第5秒時(shí),讀者6執(zhí)行時(shí)間到就退出,讀者3繼續(xù)讀取,寫者2也開始申請資源,讀者的優(yōu)先級比較高,寫者2等待。當(dāng)讀到第8秒時(shí),讀者5申請資源,讀者與讀者是共用關(guān)系,所以讀者5開始讀取,讀者3執(zhí)行時(shí)間到就退出。當(dāng)讀到第10秒時(shí),讀者5執(zhí)行時(shí)間到就退出。此時(shí)寫者1開始寫入。當(dāng)讀到第14秒時(shí),寫者1執(zhí)行時(shí)間到就退出。此時(shí)寫者4開始寫入。當(dāng)讀到第20秒時(shí),寫者4執(zhí)行時(shí)間到就退出。此時(shí)寫者2開始寫入。此時(shí)執(zhí)行結(jié)束。得到的隊(duì)列表:intg_PersonLists[]={W,2,3,W,6,3,R,4,4,W,4,5,R,8,2,R,1,4,END,}5總結(jié)操作系統(tǒng)課設(shè),三天的時(shí)間,終于給完成了。在這三天的時(shí)間里,我完成了用操作系統(tǒng)知識做一個(gè)模擬讀者寫著問題的課設(shè)。從開始的無頭無續(xù),到中間時(shí)期的疑惑不解,再到最后的極大歡喜,感覺這個(gè)課設(shè)經(jīng)歷了整個(gè)人生的大起大落。無可厚非,這正是我們要走的路。這段時(shí)間挺難熬的,在自己的努力,以及老師還有同學(xué)的幫助下,我終于完成了這次艱難的課程設(shè)計(jì)。在這次設(shè)計(jì)中,我遇到了很多的問題,首先,線程的創(chuàng)建:CreateThread()函數(shù)的不理解包括:所要求的參數(shù),傳值參數(shù)的不明白,返回值不會(huì)用,線程創(chuàng)建屬性不理解。其次。CreateSemaphore用于創(chuàng)建信號量,根據(jù)參數(shù)的不同可以利用它實(shí)現(xiàn)互斥和同步。WaitForSingleObject可在指定的時(shí)間內(nèi)等待指定對象為可用狀態(tài),等于執(zhí)行P操作。ReleaseSemaphore用于釋放信號量,等于執(zhí)行V操作。這些函數(shù)開始不懂。再次,創(chuàng)建的線程取值方式不正確。最后,就是得到的結(jié)果有些不是很正確,調(diào)試一下就行了這些問題一一解決后,整個(gè)課設(shè)的就完成了。通過這次課設(shè)我知道了有時(shí)候我們對一件事物一點(diǎn)都不理解,這沒關(guān)系,我們要能耐得住寂寞,沉得下心,對我們未知的進(jìn)行不斷地摸索才能掌握新的知識;最后我發(fā)現(xiàn)我們要學(xué)習(xí)的東西還很多,要堅(jiān)持努力,不斷完善自己。最后,我要感謝我們的課設(shè)老師田娟秀老師和顏國風(fēng)老師,在這三天對我們的指導(dǎo),不顧炎炎烈日,對我們的認(rèn)真負(fù)責(zé),以及諄諄教誨。老師你們辛苦。6附件#include<windows.h>#include<ctype.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<time.h>#defineMAX_PERSON100#defineREADER0 〃讀者#defineWRITER1 〃寫者#defineEND-1#defineRREADER#defineWWRITERints(){inti;srand(unsigned(time(NULL)));i=1+rand()%12;return(i);}typedefstruct_Person{HANDLEm_hThread; 〃定義處理線程的句柄intm_nID;〃進(jìn)程號intm_nType;〃進(jìn)程類型(讀寫)intm_nStartTime;〃開始時(shí)間intm_nWorkTime;〃運(yùn)行時(shí)間}Person;Persong_Persons[MAX_PERSON];intg_NumPerson=0;longg_CurrentTime=0;//基本時(shí)間片數(shù)intg_PersonLists[]={W,s(),s(),W,s(),s(),R,s(),s(),W,s(),s(),R,s(),s(),R,s(),s(),END,};intg_NumOfReading=0;intg_NumOfWriteRequest=0;//申請寫進(jìn)程的個(gè)數(shù)HANDLEg_hReadSemaphore;//讀者信號HANDLEg_hWriteSemaphore;//寫者信號boolfinished=false;//所有的讀完成boolwfinished=false;〃所有的寫完成voidCreatePersonList(int*pPersonList);boolCreateReader(intStartTime,intWorkTime,intID);boolCreateWriter(intStartTime,intWorkTime,intID);DWORDWINAPIReaderProc(LPVOIDlpParam);DWORDWINAPIWriterProc(LPVOIDlpParam);intmain(){g_hReadSemaphore=CreateSemaphore(NULL,1,100,NULL);g_hWriteSemaphore=CreateSemaphore(NULL,1,100,NULL);printf(" 初始化 \n");Sleep(1000);printf("開始.......\n");CreatePersonList(g_PersonLists);〃創(chuàng)建讀者與寫者g_CurrentTime=0;while(true){g_CurrentTime++;Sleep(500);printf("時(shí)間/s=%d\n",g_CurrentTime);if(finished)return0;}return0;}voidCreatePersonList(int*pPersonLists){inti=0;int*pList=pPersonLists;boolRet;while(pList[0]!=END){switch(pList[1]){caseR:Ret=CreateReader(pList[2],pList[3],pList[0]);break;caseW:Ret=CreateWriter(pList[2],pList[3],pList[0]);break;}if(!Ret)printf("創(chuàng)建%d失敗\n”,pList[0]);pList+=4;//movetonextpersonlist}}boolCreateReader(intStartTime,intWorkTime,intID){if(g_NumPerson>=MAX_PERSON)returnfalse;Person*pPerson=&g_Persons[g_NumPerson];pPerson->m_nID=ID;pPerson->m_nStartTime=StartTime;pPerson->m_nWorkTime=WorkTime;pPerson->m_nType=READER;g_NumPerson++;pPerson->m_hThread=CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,NULL);//創(chuàng)建新線程if(pPerson->m_hThread==NULL)returnfalse;returntrue;}boolCreateWriter(intStartTime,intWorkTime,intID){if(g_NumPerson>=MAX_PERSON)returnfalse;Person*pPerson=&g_Persons[g_NumPerson];pPerson->m_nID=ID;pPerson->m_nStartTime=StartTime;pPerson->m_nWorkTime=WorkTime;pPerson->m_nType=WRITER;g_NumPerson++;pPerson->m_hThread=CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,NULL);〃創(chuàng)建新線程if(pPerson->m_hThread==NULL)returnfalse;returntrue;}DWORDWINAPIReaderProc(LPVOIDlpParam)//讀過程{Person*pPerson=(Person*)lpParam;while(g_CurrentTime!=pPerson->m_nStartTime)//等待開始{}printf("%d讀者申請資源...\n”,pPerson->m_nID);WaitForSingleObject(g_hReadSemaphore,INFINITE); //等待對象被觸發(fā)信號if(g_NumOfReading==0){WaitForSingleObject(g_hWriteSemaphore,INFINITE);}g_NumOfReading++;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson->m_nStartTime=g_CurrentTime;printf("%d 正在讀取.....\n”,pPerson->m_nID);while(g_CurrentTime<=pPerson->m_nStartTime+pPerson->m_nWorkTime){}printf("%d讀者退出\n",pPerson->m_n

溫馨提示

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

最新文檔

評論

0/150

提交評論