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

下載本文檔

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

文檔簡介

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

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

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

實現(xiàn)同步或者互斥的對象。該函數(shù)一執(zhí)行,相應的信號量就加上1,如果信號量小于等于0,那么他一直在循環(huán)。等于執(zhí)行V操作。2.4讀寫過程DWORDWINAPIWriterProc(LPVOIDIpParam)函數(shù)是表示寫的過程,當有信號出發(fā)就可以進行寫過程,當已經有一個寫者正在寫時,它和其他的寫者,讀者是互斥的。DWORDWINAPIReaderProc(LPVOIDlpParam)函數(shù)是表示讀的過程,當有信號出發(fā)就可以進行讀過程,當已經有一個讀者正在讀時,它和其他的寫者是互斥的,和其他的讀者是共用的。2.5 結構體創(chuàng)建typedefstruct_Person{HANDLEm_hThread;//定義處理線程的句柄intm_nType;//進程類型(讀寫)intm_nStartTime;//開始時間intm_nWorkTime;//運行時間intm_nID;//進程號}Person;創(chuàng)建一個結構體主要定義一個線程所要的各個參數(shù)屬性,方便讀取。intg_PersonLists[]={W,s項),s項),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,};〃隊列在這里定義一個隊列,可以初始化線程,創(chuàng)建線程是它的線程參數(shù)屬性都是從隊列里進行讀取,這個一共有六個線程,三個讀,三個寫。另外,定義的到達時間,執(zhí)行時間是用隨機函數(shù)產生s_j()。2.6各個模塊圖創(chuàng)建信號量CreateSemaphorMain函數(shù)調CreateReader創(chuàng)建讀者與寫者CreatePersonList調用CreateWriter創(chuàng)建寫著DWORD創(chuàng)建讀調用DWINAPIDWORD創(chuàng)建讀調用DWINAPIReaderProc寫過程WORD調WINAPIReaderProc讀過程圖1各個模塊圖功能及調用關系3主要功能實現(xiàn)圖3程序調試結果說明:根據(jù)程序執(zhí)行的結果我們可以推導出創(chuàng)建的六個線程他們的執(zhí)行順序,執(zhí)行時間。讀者6先到申請資源此時6開始讀取,當讀到第2秒時,寫者1開始申請資源,讀者的優(yōu)先級比較高,寫者1等待。當讀到第4秒時,讀者3開始申請資源,讀者與讀者是共用關系,所以讀者3開始讀取,寫者4也開始申請資源,讀者的優(yōu)先級比較高,寫者4等待。當讀到第5秒時,讀者6執(zhí)行時間到就退出,讀者3繼續(xù)讀取,寫者2也開始申請資源,讀者的優(yōu)先級比較高,寫者2等待。當讀到第8秒時,讀者5申請資源,讀者與讀者是共用關系,所以讀者5開始讀取,讀者3執(zhí)行時間到就退出。當讀到第10秒時,讀者5執(zhí)行時間到就退出。此時寫者1開始寫入。當讀到第14秒時,寫者1執(zhí)行時間到就退出。此時寫者4開始寫入。當讀到第20秒時,寫者4執(zhí)行時間到就退出。此時寫者2開始寫入。此時執(zhí)行結束。得到的隊列表:intg_PersonLists[]={W,2,3,W,6,3,R,4,4,W,4,5,R,8,2,R,1,4,END,}5總結操作系統(tǒng)課設,三天的時間,終于給完成了。在這三天的時間里,我完成了用操作系統(tǒng)知識做一個模擬讀者寫著問題的課設。從開始的無頭無續(xù),到中間時期的疑惑不解,再到最后的極大歡喜,感覺這個課設經歷了整個人生的大起大落。無可厚非,這正是我們要走的路。這段時間挺難熬的,在自己的努力,以及老師還有同學的幫助下,我終于完成了這次艱難的課程設計。在這次設計中,我遇到了很多的問題,首先,線程的創(chuàng)建:CreateThread()函數(shù)的不理解包括:所要求的參數(shù),傳值參數(shù)的不明白,返回值不會用,線程創(chuàng)建屬性不理解。其次。CreateSemaphore用于創(chuàng)建信號量,根據(jù)參數(shù)的不同可以利用它實現(xiàn)互斥和同步。WaitForSingleObject可在指定的時間內等待指定對象為可用狀態(tài),等于執(zhí)行P操作。ReleaseSemaphore用于釋放信號量,等于執(zhí)行V操作。這些函數(shù)開始不懂。再次,創(chuàng)建的線程取值方式不正確。最后,就是得到的結果有些不是很正確,調試一下就行了這些問題一一解決后,整個課設的就完成了。通過這次課設我知道了有時候我們對一件事物一點都不理解,這沒關系,我們要能耐得住寂寞,沉得下心,對我們未知的進行不斷地摸索才能掌握新的知識;最后我發(fā)現(xiàn)我們要學習的東西還很多,要堅持努力,不斷完善自己。最后,我要感謝我們的課設老師田娟秀老師和顏國風老師,在這三天對我們的指導,不顧炎炎烈日,對我們的認真負責,以及諄諄教誨。老師你們辛苦。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;〃進程號intm_nType;〃進程類型(讀寫)intm_nStartTime;〃開始時間intm_nWorkTime;〃運行時間}Person;Persong_Persons[MAX_PERSON];intg_NumPerson=0;longg_CurrentTime=0;//基本時間片數(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;//申請寫進程的個數(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("時間/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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論