操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第1頁
操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第2頁
操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第3頁
操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第4頁
操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

《操作系統(tǒng)原理》課程設(shè)計(jì)課程設(shè)計(jì)起止時(shí)間:2009年11月30日至12月11日指導(dǎo)教師: 成績:課程設(shè)計(jì)成績評(píng)定表質(zhì)量評(píng)價(jià)指標(biāo)評(píng)價(jià)項(xiàng)目具體要求滿分得分

學(xué)習(xí)態(tài)度學(xué)習(xí)認(rèn)真,態(tài)度瑞正,遵守紀(jì)律,出勤情況良好,能夠獨(dú)立完成設(shè)計(jì)工作。20工作量按期圓滿完成規(guī)定的設(shè)計(jì)任務(wù),工作量飽滿,難度適宜。20設(shè)計(jì)說明書質(zhì)量設(shè)計(jì)方案正確、表達(dá)清楚;設(shè)計(jì)思路、方法科學(xué)合理;達(dá)到課程設(shè)計(jì)任務(wù)書規(guī)定的要求;圖、表、文字表達(dá)準(zhǔn)確規(guī)范,上交及時(shí)。30答辯陳述和回答問題陳述簡明扼要,思路清晰,清楚流利,回答問題準(zhǔn)確,基本概念清楚,有理有據(jù),有一定深度。30評(píng)定成績指導(dǎo)教師簽名年月日設(shè)計(jì)說明(四號(hào),宋體,加粗)通過學(xué)習(xí)操作系統(tǒng),與之前的語句基礎(chǔ)相結(jié)合,用C語言來編寫讀者寫著問題。讀者寫者問題(read—writeproblem)是一個(gè)經(jīng)典的并發(fā)程序設(shè)計(jì)問題。有兩組并發(fā)進(jìn)程:讀者和寫者,共享一個(gè)問題F,要求:(1)允許多個(gè)讀者可同時(shí)對之執(zhí)行讀操作;(2)只允許一個(gè)寫者往文件中寫信息;(3)任一寫者在完成寫操作之前不允許其他讀者或者寫者工作;(4)寫者執(zhí)行寫操作前,應(yīng)讓已有的寫者和讀者全部退出。工作原理(四號(hào),宋體,加粗)讀者和寫者問題是典型是經(jīng)典的進(jìn)程同步問題,進(jìn)程同步任務(wù)是使并發(fā)的諸進(jìn)程之間有效的共享資源,相互合作,從而保證程序的可再現(xiàn)性。在讀者一寫者問題中,允許多個(gè)讀者同時(shí)讀一個(gè)數(shù)據(jù)對象,因?yàn)樽x文件不會(huì)使數(shù)據(jù)發(fā)生混亂,但絕不允許一個(gè)寫者進(jìn)程與其他讀者進(jìn)程或?qū)懻哌M(jìn)程同時(shí)訪問該數(shù)據(jù)對象。文件是諸進(jìn)程能互斥訪問臨界資源,讀者進(jìn)程和寫者進(jìn)程,寫者進(jìn)程和寫者進(jìn)程之間的互斥。在讀者進(jìn)程中,可以有多個(gè)讀者在讀數(shù)據(jù)庫,在讀者進(jìn)程的計(jì)數(shù)要互斥,以免發(fā)生錯(cuò)誤,同時(shí)注意當(dāng)?shù)谝粋€(gè)讀者進(jìn)程讀時(shí),一定要封鎖寫者進(jìn)程。當(dāng)讀者進(jìn)程逐漸撤離時(shí),也要針對計(jì)數(shù)變量進(jìn)行互斥操作,若當(dāng)前為最后一個(gè)讀者進(jìn)程時(shí),讀完后,則喚醒寫者進(jìn)程。當(dāng)寫者進(jìn)程在進(jìn)行寫操作時(shí),可以封鎖其他讀者或?qū)懻哌M(jìn)程,當(dāng)寫操作完成時(shí),喚醒其他讀者或?qū)懻哌M(jìn)程。所以分析了以下4種可能發(fā)生的情況:第1種情況:讀者的優(yōu)先權(quán)比寫者高,而且,不用調(diào)配。所有讀者的優(yōu)先權(quán)都比寫者的優(yōu)先權(quán)高,而且,不用調(diào)配。一個(gè)讀者需要等待的唯一情況是,一個(gè)寫者已經(jīng)占用了文件。一個(gè)寫者可以取得文件的條件是,沒有一個(gè)讀者處在等待狀態(tài)或正在讀文件。允許讀者們結(jié)盟,以便能長期占用文件,而禁止寫者的寫。第2種情況:在一個(gè)讀者已經(jīng)占有了文件的時(shí)候,全體讀者的優(yōu)先權(quán)才比寫者高。在沒有任何一個(gè)讀者在讀文件時(shí),讀者的優(yōu)先權(quán)和寫者的優(yōu)先權(quán)相同。相反,如果有一個(gè)讀者正在讀文件,則其余的各讀者都可以讀文件,而不管有多少寫者處在等待狀態(tài)。所有讀者都有權(quán)結(jié)盟,以便壟斷文件。第3種情況:寫者的優(yōu)先權(quán)比讀者的優(yōu)先權(quán)高。在一個(gè)寫者提出要訪問文件時(shí),就必須使其盡可能的得到文件,而且不用調(diào)配。也就是說,在出現(xiàn)這一請求時(shí),占據(jù)著文件的各進(jìn)程都被執(zhí)行完以后,寫者可以立即得到文件。因此,在文件已為一寫者請求之后到來的那些讀者都必須等待,盡管某些讀者正在應(yīng)用文件,也是如此。所有寫者可以結(jié)盟,以便能長期禁止讀者的讀。第4種情況:所有寫者的和所有讀者有相同的優(yōu)先權(quán)高,哪一類都不會(huì)有比另一類更高的優(yōu)先權(quán)。如果一個(gè)讀者正在應(yīng)用文件,則在一個(gè)寫者請求文件之前到來的全體讀者,都能讀文件,而之后到來的讀者或?qū)懻?,則要等待,不必區(qū)分他們屬于哪一類進(jìn)程。如果一個(gè)寫者正在寫文件,則所有新到來的請求都必須等待。在這一寫者寫完之后,它就要喚醒處在等待隊(duì)列中的排在第一個(gè)位置的進(jìn)程。如果此時(shí)有幾個(gè)讀者連續(xù)排在等待隊(duì)列中的最前面各位置上,則它們可以同時(shí)讀文件。三.詳細(xì)設(shè)計(jì)(四號(hào),宋體,加粗)了解讀者一寫者問題的基本思想結(jié)構(gòu),我們需要在Linux和windows環(huán)境下運(yùn)行,選擇語言在這里我選的是C語言。讀者-寫者的讀寫限制(包括讀者優(yōu)先和寫者優(yōu)先)1)寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作2) 讀-寫互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫者在寫3) 讀讀允許,即可以有2個(gè)以上的讀者同時(shí)讀讀者優(yōu)先的限制:如果一個(gè)讀者申請讀操作時(shí),已經(jīng)有一個(gè)讀者在讀,則該讀者可以直接讀寫者優(yōu)先的限制:如果一個(gè)讀者申請讀操作時(shí),有寫者在等待訪問共享資源時(shí),則該讀者要等到?jīng)]有寫者處于等的狀態(tài)時(shí)才能開始讀操作測試數(shù)據(jù)的格式在文件thread.dat中,r35w45....其中第一個(gè)代表線程的1。,第二個(gè)字段代表是讀操作還是寫操作,第三個(gè)字段代表操作的開

始時(shí)間,第4個(gè)字段是持續(xù)時(shí)間。分析:將所有的讀者和所有的寫者分別放進(jìn)兩個(gè)等待隊(duì)列中,當(dāng)讀允許時(shí)就讓讀者隊(duì)列釋放一個(gè)或多個(gè)讀者,當(dāng)寫允許時(shí),釋放第一個(gè)寫者操作。讀者優(yōu)先:如果沒有寫者正在操作,則讀者不需要等待,用一個(gè)整型變量readcount記錄當(dāng)前的讀者數(shù)目,用于確定是否釋放寫者線程,(當(dāng)readcout=0時(shí),說明所有的讀者都已經(jīng)讀完,釋放一個(gè)寫者線程),每個(gè)讀者開始讀之前都要修改readcount,為了互斥的實(shí)現(xiàn)對readcount的修改,需要一個(gè)互斥對象Mutex來實(shí)現(xiàn)互斥。另外,為了實(shí)現(xiàn)寫-寫互斥,需要一個(gè)臨界區(qū)對象write,當(dāng)寫者發(fā)出寫的請求時(shí),必須先得到臨界區(qū)對象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀寫互斥,當(dāng)readcount=1時(shí),(即第一個(gè)讀者的到來時(shí),),讀者線程也必須申請臨界區(qū)對象的所有權(quán).當(dāng)讀者擁有臨界區(qū)的所有權(quán),寫者都阻塞在臨界區(qū)對象write上。當(dāng)寫者擁有臨界區(qū)對象所有權(quán)時(shí),第一個(gè)判斷完readcount==1后,其余的讀者由于等待對readcount的判斷,阻塞在Mutex上!寫者優(yōu)先:寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個(gè)寫者到來時(shí),應(yīng)該盡快讓寫者進(jìn)行寫,如果有一個(gè)寫者在等待,則新到的讀者操作不能讀操作,為此添加一個(gè)整型變量writecount,記錄寫者的數(shù)目,當(dāng)writecount=0時(shí)才可以釋放讀者進(jìn)行讀操作!為了實(shí)現(xiàn)對全局變量writecount的互斥訪問,設(shè)置了一個(gè)互斥對象Mutex3。為了實(shí)現(xiàn)寫者優(yōu)先,設(shè)置一個(gè)臨界區(qū)對象read,當(dāng)有寫者在寫或等待時(shí),讀者必須阻塞在臨界區(qū)對象read上。讀者除了要一個(gè)全局變量readcount實(shí)現(xiàn)操作上的互斥外,還需要一個(gè)互斥對象對阻塞在read這一個(gè)過程實(shí)現(xiàn)互斥,這兩個(gè)互斥對象分別為mutexl和mutex2。源代碼:#include"windows.h"#include<conio.h>#include<stdlib.h>#include<fstream.h>#include<io.h>#include<string.h>#include<stdio.h>〃讀者〃寫者〃讀者〃寫者〃每秒時(shí)鐘中斷的數(shù)目〃最大線程數(shù)〃最大文件數(shù)目數(shù)#defineWRITER'W'#defineINTE_PER_SEC1000#defineMAX_THREAD_NUM64#defineMAX_FILE_NUM32#defineMAX_STR_LEN32//字符串的長度〃讀者數(shù)目〃寫者數(shù)目〃讀者數(shù)目〃寫者數(shù)目〃臨界資源〃線程序號(hào)〃線程類別(判斷是讀者還是寫者線程)//線程延遲時(shí)間〃線程讀寫操作時(shí)間intreadcount=0;intwritecount=0;CRITICAL_SECTIONRP_Write;CRITICAL_SECTIONcs_Write;CRITICAL_SECTIONcs_Read;structThreadInfo{intserial;charentity;doubledelay;doublepersist;};/////////////////////////////////////////////////////////////////////////////讀者優(yōu)先讀者線程//P:讀者線程信息voidRP_ReaderThread(void*p){//互斥變量HANDLEh_Mutex;h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,〃mutex_for_readcount〃);DWORDwait_for_mutex; //等待互斥變量所有權(quán)

DWORDm_persist;〃讀文件持續(xù)時(shí)間DWORDm_persist;〃讀文件持續(xù)時(shí)間intm_serial; 〃線程序號(hào)//從參數(shù)中獲得信息m_serial=((ThreadInfo*)(p))->serial;m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); 〃延遲等待printf("Readerthread%dsentsthereadingrequire.\n”,m_serial);//等待互斥信號(hào),保證對ReadCount的訪問,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);//讀者數(shù)目增加readcount++;if(readcount==1){〃第一個(gè)讀者,等待資源EnterCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //釋放互斥信號(hào)//讀文件printf("Readerthread%dbeginstoreadfile.\n”,m_serial);Sleep(m_persist);//退出線程printf("Readerthread%dfinishedreadingfile.\n”,m_serial);//等待互斥信號(hào),保證對ReadCount的訪問,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);//讀者數(shù)目減少readcount—;if(readcount==0){//如果所有的讀者讀完,喚醒寫者LeaveCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //釋放互斥信號(hào)}////////////////////////////////////////////////////////////////P:寫者線程信息voidRP_WriterThread(void*p){DWORDm_delay; 〃延遲時(shí)間DWORDm_persist; 〃寫文件持續(xù)時(shí)間intm_serial; 〃線程序號(hào)//從參數(shù)中獲得信息m_serial=((ThreadInfo*)(p))->serial;m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay);printf("Writethread%dsentsthewritingrequire.\n”,m_serial);

//等待資源EnterCriticalSection(&RP_Write);//寫文件printf("Writerthread%dbeginstowritetothefile.\n”,m_serial);Sleep(m_persist);//退出線程printf("Writethread%dfinishedwritingtothefile.\n”,m_serial);//釋放資源LeaveCriticalSection(&RP_Write);//////////////////////////////////////////////////////////////〃讀者優(yōu)先處理函數(shù)//file:文件名voidReaderPriority(char*file)DWORDn_thread=0;〃線程數(shù)目DWORDthread_ID;〃線程IDDWORDwait_for_all;〃等待所有線程結(jié)束//互斥對象HANDLEh_Mutex;h_Mutex=CreateMutex(NULL,FALSE,〃mutex_for_readcount〃);//線程對象的數(shù)組HANDLEh_Thread[MAX_THREAD_NUM];ThreadInfothread_info[MAX_THREAD_NUM];readcount=0; //初始化readcountInitializeCriticalSection(&RP_Write); //初始化臨界區(qū)ifstreaminFile;inFile.open(file);printf("ReaderPriority:\n\n〃);while(inFile){〃讀入每一個(gè)讀者,寫者的信息inFile>>thread_info[n_thread].serial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;inFile.get();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='r'){//創(chuàng)建讀者進(jìn)程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&thread_ID);else{〃創(chuàng)建寫線程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_info[i],0,&thread_ID);}}//等待所有的線程結(jié)束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);printf("Allreaderandwriterhavefinishedoperating.、/');}////////////////////////////////////////////////////////〃寫者優(yōu)先---讀者線程//P:讀者線程信息voidWP_ReaderThread(void*p){//互斥變量HANDLEh_Mutex1;h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,〃mutex1〃);HANDLEh_Mutex2;h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,〃mutex2〃);DWORDwait_for_mutex1; //等待互斥變量所有權(quán)DWORDwait_for_mutex2;〃延遲時(shí)間DWORDm_delay;〃延遲時(shí)間DWORDm_persist; 〃讀文件持續(xù)時(shí)間intm_serial; 〃線程的序號(hào)//從參數(shù)中得到信息m_serial=((ThreadInfo*)(p))->serial;m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); 〃延遲等待printf("Readerthread%dsentsthereadingrequire.\n”,m_serial);wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);//讀者進(jìn)去臨界區(qū)EnterCriticalSection(&cs_Read);//阻塞互斥對象Mutex2,保證對readCount的訪問和修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);〃修改讀者的數(shù)目readcount++;if(readcount==1){//如果是第1個(gè)讀者,等待寫者寫完EnterCriticalSection(&cs_Write);}ReleaseMutex(h_Mutex2);//釋放互斥信號(hào)Mutex2〃讓其他讀者進(jìn)去臨界區(qū)LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex1);

//讀文件printf("Readerthread%dbeginstoreadfile.\n”,m_serial);Sleep(m_persist);//退出線程printf("Readerthread%dfinishedreadingfile.\n”,m_serial);//阻塞互斥對象Mutex2,保證對readcount的訪問,修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);readcount—;if(readcount==0)//最后一個(gè)讀者,喚醒寫者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2);//釋放互斥信號(hào)///////////////////////////////////////////〃寫者優(yōu)先---寫者線程//P:寫者線程信息voidWP_WriterThread(void*p)DWORDwait_for_mutex3;〃互斥變量〃延遲時(shí)間〃延遲時(shí)間DWORDm_delay;DWORDm_persist;〃讀文件持續(xù)時(shí)間intmserial;〃線程序號(hào)HANDLEh_Mutex3;h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,〃mutex3〃);//從參數(shù)中獲得信息m_serial=((ThreadInfo*)(p))->serial;m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); 〃延遲等待printf("Writerthread%dsentsthereadingrequire.\n”,m_serial);wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount++; 〃修改寫者數(shù)目if(writecount==1){EnterCriticalSection(&cs_Read);}ReleaseMutex(h_Mutex3);EnterCriticalSection(&cs_Write);printf("Writerthread%dbeginstowritetothefile.\n”,m_serial);Sleep(m_persist);printf("Writerthread%dfinishedwritingtothefile.\n”,m_serial);LeaveCriticalSection(&cs_Write);wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount—;if(writecount==0)LeaveCriticalSection(&cs_Read);}ReleaseMutex(h_Mutex3);}/////////////////////////////////////////////〃寫者優(yōu)先處理函數(shù)//file:文件名voidWriterPriority(char*file){DWORDn_thread=0;DWORDthread_ID;DWORDwait_for_all;HANDLEh_Mutex1;h_Mutex1=CreateMutex(NULL,FALSE,〃mutex1〃);HANDLEh_Mutex2;h_Mutex2=CreateMutex(NULL,FALSE,〃mutex2〃);HANDLEh_Mutex3;h_Mutex3=CreateMutex(NULL,FALSE,〃mutex3〃);HANDLEh_Thread[MAX_THREAD_NUM];ThreadInfothread_info[MAX_THREAD_NUM];readcount=0;writecount=0;InitializeCriticalSection(&cs_Write);InitializeCriticalSection(&cs_Read);ifstreaminFile;inFile.open(file);printf("Writerpriority:\n\n");while(inFile){inFile>>thread_info[n_thread].serial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;inFile.get();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='r'){//創(chuàng)建讀者進(jìn)程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),&thread_info[i],0,&thread_ID);}else{〃創(chuàng)建寫線程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),&thread_info[i],0,&thread_ID);}}//等待所有的線程結(jié)束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);printf("Allreaderandwriterhavefinishedoperating.、/');///////////////////////////////////////////////////////主函數(shù)intmain(intargc,char*argv[]){charch;while(true){printf("*************************************\n");printf(" 1.ReaderPriority\n");printf(" 2.WriterPriority\n");printf(" 3.ExittoWindows\n");printf("*************************************\n");printf("Enteryourchoice(1,2,3):");do{ch=(char)_getch();}while(ch!='1'&&ch!='2'&&ch!='3');system("cls")

溫馨提示

  • 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論