操作系統(tǒng)課程設(shè)計(jì)報(bào)告讀者寫著問題_第1頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告讀者寫著問題_第2頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告讀者寫著問題_第3頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告讀者寫著問題_第4頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告讀者寫著問題_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)與信息學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告一、 開題報(bào)告(一) 該項(xiàng)課程設(shè)計(jì)的意義;1. 更加深入的了解讀者寫者問題的算法;2. 加深對線程,進(jìn)程的理解;3. 加深對“線程同步”概念的理解,理解并應(yīng)用“信號量機(jī)制”;4. 熟悉計(jì)算機(jī)對處理機(jī)的管理,了解臨界資源的訪問方式;5. 了解c+中線程的實(shí)現(xiàn)方式,研讀api。(二) 課程設(shè)計(jì)的任務(wù)多進(jìn)程/線程編程:讀者-寫者問題。 l 設(shè)置兩類進(jìn)程/線程,一類為讀者,一類為寫者;l 隨機(jī)啟動讀者或?qū)懻撸籰 顯示讀者或?qū)懻邎?zhí)行狀態(tài);l 隨著進(jìn)程/線程的執(zhí)行,更新顯示;(三) 相關(guān)原理及算法描述;整體概況:該程序從大體上來分只有兩個模塊,即“讀者優(yōu)先”和“寫者優(yōu)先

2、”模塊. 讀者優(yōu)先:如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄讀者數(shù)目,用于確定是否釋放讀者線程,readcount的初值為0.當(dāng)線程開始調(diào)入時.每個讀者準(zhǔn)備讀. 等待互斥信號,保證對readcount 的訪問,修改互斥.即readcount+.而當(dāng)讀者線程進(jìn)行讀操作時,則讀者數(shù)目減少(readcount-).當(dāng)readcout=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒寫者(leavecriticalsection(&rp_write);), 釋放互斥信號(releasemutex(h_mutex).還需要一個互斥對象mutex來實(shí)現(xiàn)對全局變量

3、read_count修改時的互斥. 另外,為了實(shí)現(xiàn)寫-寫互斥,需要增加一個臨界區(qū)對象write。當(dāng)寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀-寫互斥,當(dāng)read_count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權(quán)寫者優(yōu)先:寫者優(yōu)先與讀者不同之處在于一旦一個寫者到來,它應(yīng)該盡快對文件進(jìn)行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進(jìn)行讀操作。為此應(yīng)當(dāng)填加一個整形變量write_count,用于記錄正在等待的寫者的數(shù)目,write_count的初值為0.當(dāng)線程開始調(diào)入時.只允許一個寫者準(zhǔn)備讀. 等待互斥信號,保證對write_count

4、的訪問,修改互斥.即write_count+.而當(dāng)寫者線程進(jìn)行讀操作時,則相應(yīng)寫者數(shù)目減少(write_count-).當(dāng)write_count=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒讀者,釋放互斥信號.為了實(shí)現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)填加一個臨界區(qū)對象read,當(dāng)有寫者在寫文件或等待時,讀者必須阻塞在read上。(四) 開發(fā)環(huán)境;vc+6.0(五) 預(yù)期設(shè)計(jì)目標(biāo);讀者-寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先)1.寫-寫互斥:不能有兩個寫者同時進(jìn)行寫操作2.讀-寫互斥:不能同時有一個線程在讀,而另一個線程在寫。3.讀-讀允許:可以有一個或多個讀者在讀。若讀者的優(yōu)先權(quán)比寫者高, 如果讀者

5、申請進(jìn)行讀操作時已有另一個讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作.不必經(jīng)過別的操件若讀者的優(yōu)先權(quán)比寫者高,如果第一個寫者已經(jīng)占有了文件的時候.則別的讀者必需等待該操作完成后.才能開始讀操作.若寫者的優(yōu)先權(quán)比讀者高, 在一個寫者提出要訪問文件時,就必須使其盡可能的得到文件,而且不用調(diào)配。完成課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)讀者寫者問題的全部要求,同時可以實(shí)現(xiàn)“讀者優(yōu)先”和“寫者優(yōu)先”兩種情況,有時間的話,爭取實(shí)現(xiàn)可視化圖形界面。二、 課程設(shè)計(jì)報(bào)告(一) 課程設(shè)計(jì)任務(wù)、要求、目的;任務(wù)和要求:多進(jìn)程/線程編程:讀者-寫者問題。 l 設(shè)置兩類進(jìn)程/線程,一類為讀者,一類為寫者;l 隨機(jī)啟動讀者或?qū)懻?;l

6、顯示讀者或?qū)懻邎?zhí)行狀態(tài);l 隨著進(jìn)程/線程的執(zhí)行,更新顯示;目的:1 更加深入的了解讀者寫者問題的算法;2 加深對線程,進(jìn)程的理解;3 加深對“線程同步”概念的理解,理解并應(yīng)用“信號量機(jī)制”;4 熟悉計(jì)算機(jī)對處理機(jī)的管理,了解臨界資源的訪問方式;5 了解c+中線程的實(shí)現(xiàn)方式,研讀api。(二) 原理及算法描述;寫者優(yōu)先原理圖:讀者優(yōu)先原理圖:算法描述:讀者優(yōu)先的附加限制:如果讀者申請進(jìn)行讀操作時已有另一個讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。寫者優(yōu)先的附加限制:如果一個讀者申請進(jìn)行讀操作時已有另一個寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。(三) 開

7、發(fā)環(huán)境;vc+6.0(四) 重要算法和設(shè)計(jì)思路描述;整體概況:該程序從大體上來分只有兩個模塊,即“讀者優(yōu)先”和“寫者優(yōu)先”模塊. 讀者優(yōu)先:如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄讀者數(shù)目,用于確定是否釋放讀者線程,readcount的初值為0.當(dāng)線程開始調(diào)入時.每個讀者準(zhǔn)備讀. 等待互斥信號,保證對readcount 的訪問,修改互斥.即readcount+.而當(dāng)讀者線程進(jìn)行讀操作時,則讀者數(shù)目減少(readcount-).當(dāng)readcout=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒寫者(leavecriticalsection(&rp_w

8、rite);), 釋放互斥信號(releasemutex(h_mutex).還需要一個互斥對象mutex來實(shí)現(xiàn)對全局變量read_count修改時的互斥. 另外,為了實(shí)現(xiàn)寫-寫互斥,需要增加一個臨界區(qū)對象write。當(dāng)寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀-寫互斥,當(dāng)read_count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權(quán)寫者優(yōu)先:寫者優(yōu)先與讀者不同之處在于一旦一個寫者到來,它應(yīng)該盡快對文件進(jìn)行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進(jìn)行讀操作。為此應(yīng)當(dāng)填加一個整形變量write_count,用于記錄正在等待的寫者的數(shù)目,

9、write_count的初值為0.當(dāng)線程開始調(diào)入時.只允許一個寫者準(zhǔn)備讀. 等待互斥信號,保證對write_count 的訪問,修改互斥.即write_count+.而當(dāng)寫者線程進(jìn)行讀操作時,則相應(yīng)寫者數(shù)目減少(write_count-).當(dāng)write_count=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒讀者,釋放互斥信號.為了實(shí)現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)填加一個臨界區(qū)對象read,當(dāng)有寫者在寫文件或等待時,讀者必須阻塞在read上。(五) 程序?qū)崿F(xiàn)-數(shù)據(jù)結(jié)構(gòu);相關(guān)windowsapi說明:createthread: 創(chuàng)建一個在調(diào)用進(jìn)程的地址空間中執(zhí)行的線程。exitthread sleep:

10、對指定的時間間隔掛起當(dāng)前的執(zhí)行線程createmutex: 創(chuàng)建有名或者無名的互斥對象releasemutex:waitforsingleobject: 當(dāng)發(fā)生(1)指定對象處于信號態(tài)(2)超時 則該函數(shù)返回waitformultipleobject: 任意一個或全部指定對象處于信號態(tài)或超時間隔已過時,返回createsemapore: 創(chuàng)建一個有名或無名信號對象。releasesemapore: initializecriticalsection: 初始化臨界區(qū)對象entercriticalsection: 等待指定臨界區(qū)對象的所有權(quán)。當(dāng)調(diào)用線程被賦予所有權(quán)時,返回。leavecritica

11、lsection:該函數(shù)釋放指定臨界區(qū)對象的所有權(quán)。(六) 程序?qū)崿F(xiàn)-程序清單;#include <windows.h>/#include <ctype.h>/#include <stdio.h>/#include <string.h>/#include <stdlib.h>/#include <malloc.h>#include<iostream>using namespace std;#define max_person 100 /最多100人#define reader 0 /讀者#define writ

12、er 1 /寫者#define end -1 /結(jié)束/#define r reader/#define w writertypedef struct handle m_hthread;/定義處理線程的句柄int type;/進(jìn)程類型(讀寫)int starttime;/開始時間int worktime;/運(yùn)行時間int id;/進(jìn)程號person;person personsmax_person;int numofperson = 0;long currenttime= 0;/基本時間片數(shù)int personlists = /進(jìn)程隊(duì)列1, writer, 3, 5,2, writer, 16,

13、 5,3, reader, 2, 2,4, writer, 6, 5,5, reader, 4, 3,6, reader, 17,7,end,;int numofreading = 0;int numofwriterequest = 0;/申請寫進(jìn)程的個數(shù)handle readsemaphore;/讀者信號handle writesemaphore;/寫者信號bool finished = false; /所有的讀完成/bool wfinished = false; /所有的寫完成void createpersonlist(int *ppersonlist);bool createreader

14、(int starttime,int worktime,int id);bool createwriter(int starttime,int worktime,int id);dword winapi readerproc(lpvoid lpparam);dword winapi writerproc(lpvoid lpparam);int main()readsemaphore = createsemaphore(null,1,100,null); /創(chuàng)建信號量,當(dāng)前可用的資源數(shù)為1,最大為100/*handle createsemaphore( lpsecurity_attributes

15、 lpsemaphoreattributes, /lpsemaphoreattributes為安全屬性 long linitialcount, /linitialcount為semaphore的初始值 long lmaximumcount, /lmaximumcount為最大值 lpctstr lpname /lpname為semaphore對象的名字,null表示創(chuàng)建匿名semaphore );*/writesemaphore = createsemaphore(null,1,100,null); /創(chuàng)建信號量,當(dāng)前可用的資源數(shù)為1,最大為100createpersonlist(person

16、lists); / 創(chuàng)建所有讀者寫者cout<<"創(chuàng)建所有的讀者寫者"<<"n.n"currenttime = 0;while(true)currenttime+;sleep(300); / 300 mscout<<"當(dāng)前時間 = "<<currenttime<<endl;if(finished) return 0;/ return 0;void createpersonlist(int *ppersonlists)int i=0;int *plist = ppersonli

17、sts;bool ret;while(plist0 != end)switch(plist1)case reader:ret = createreader(plist2,plist3,plist0);break;case writer:ret = createwriter(plist2,plist3,plist0);break;if(!ret)printf("create person %d is wrongn",plist0);plist += 4; / 尋找下一個讀者或者寫者 bool createreader(int starttime,int worktime,in

18、t id)dword dwthreadid;if(numofperson >= max_person)return false;person *pperson = &personsnumofperson;pperson->id = id;pperson->starttime = starttime;pperson->worktime = worktime;pperson->type = reader;numofperson+;/ 新建進(jìn)程pperson->m_hthread= createthread(null,0,readerproc,(lpvoi

19、d)pperson,0,&dwthreadid); /*handle createthread( lpsecurity_attributes lpthreadattributes, / pointer to security attributes 安全屬性 dword dwstacksize, / initial thread stack size 堆棧大小 lpthread_start_routine lpstartaddress, / pointer to thread function 函數(shù)指針 lpvoid lpparameter, / argument for new thr

20、ead dword dwcreationflags, / creation flags lpdword lpthreadid / pointer to receive thread id );*/if(pperson->m_hthread = null)return false;return true;bool createwriter(int starttime,int worktime,int id) dword dwthreadid;if(numofperson >= max_person) return false;person *pperson = &person

21、snumofperson;pperson->id = id;pperson->starttime = starttime;pperson->worktime = worktime;pperson->type = writer;numofperson+;/ 新建進(jìn)程pperson->m_hthread= createthread(null,0,writerproc,(lpvoid)pperson,0,&dwthreadid);/*handle createthread( lpsecurity_attributes lpthreadattributes, /

22、pointer to security attributes 安全屬性 dword dwstacksize, / initial thread stack size 堆棧大小 lpthread_start_routine lpstartaddress, / pointer to thread function 函數(shù)指針 lpvoid lpparameter, / argument for new thread dword dwcreationflags, / creation flags lpdword lpthreadid / pointer to receive thread id );*

23、/if(pperson->m_hthread = null)return false;return true;dword winapi readerproc(lpvoid lpparam)/讀過程person *pperson = (person *)lpparam;/ 等待啟動時間while(currenttime != pperson->starttime)/讀操作還沒有到達(dá)執(zhí)行時間,則等待printf("reader %d is requesting .n",pperson->id);printf("nn*n");/等待寫者請求/

24、該語句在寫者優(yōu)先的時候是認(rèn)為寫者優(yōu)先級高于讀者,在有寫者的時候讀者需要等候,而在讀者優(yōu)先的時候,不用判斷是否存在寫者,有讀者時即開始讀操作。 while(numofwriterequest != 0)/numofwriterequest != 0 表示有寫者在等待,不能讀/等待readsemaphore讀信號,即當(dāng)readsemaphore有信號時等待結(jié)束,相當(dāng)于p操作waitforsingleobject(readsemaphore,infinite); /*dword waitformultipleobjects( const handle *lphandles, / pointer to

25、 the object-handle array dword dwmilliseconds / time-out interval in milliseconds );*/if(numofreading = 0)/當(dāng)?shù)谝粋€讀者到了,如果writesemaphore信號燈滅了,說明有寫者在寫,讀者必須等待,即互斥寫操作waitforsingleobject(writesemaphore,infinite); numofreading+;/還有讀者,但是允許下一個讀進(jìn)程讀取,相當(dāng)于v操作releasesemaphore(readsemaphore,1,null); /*bool releasese

26、maphore(handle hsemaphore,/lpreleasecount參數(shù)表示要增加的數(shù)值long lreleasecount, /lppreviouscount參數(shù)用于返回之前的計(jì)算值,如果不需要可以設(shè)置為null lplong lppreviouscount);*/ 啟動讀者pperson->starttime = currenttime; printf("reader %d is reading the critical section.n",pperson->id);printf("nn*n"); while(curren

27、ttime <= pperson->starttime + pperson->worktime)/ . 執(zhí)行讀操作printf("reader %d is exit.n",pperson->id);printf("nn*n");waitforsingleobject(readsemaphore,infinite);numofreading-;if(numofreading = 0) releasesemaphore(writesemaphore,1,null);/此時沒有讀者,可以寫releasesemaphore(readsem

28、aphore,1,null);if(pperson->id = 6 ) finished = true; /所有的讀寫完成exitthread(0);return 0;dword winapi writerproc(lpvoid lpparam)person *pperson = (person *)lpparam;/ 等待啟動時間while(currenttime != pperson->starttime) printf("writer %d is requesting .n",pperson->id);printf("nn*n"); numofwriterequest+;/在寫者優(yōu)先的時候需要用自加來初始信號值,而在讀者優(yōu)先的時是通過讀者操作來控制信號值waitforsin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論