操作系統讀者寫者實驗報告_第1頁
操作系統讀者寫者實驗報告_第2頁
操作系統讀者寫者實驗報告_第3頁
操作系統讀者寫者實驗報告_第4頁
操作系統讀者寫者實驗報告_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

《操作系統原理》課程設計課程設計起止時間:2009年11月30日至12月11日指導教師: 成績:課程設計成績評定表質量評價指標評價項目具體要求滿分得分

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

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

DWORDm_persist;〃讀文件持續時間DWORDm_persist;〃讀文件持續時間intm_serial; 〃線程序號//從參數中獲得信息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);//等待互斥信號,保證對ReadCount的訪問,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);//讀者數目增加readcount++;if(readcount==1){〃第一個讀者,等待資源EnterCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //釋放互斥信號//讀文件printf("Readerthread%dbeginstoreadfile.\n”,m_serial);Sleep(m_persist);//退出線程printf("Readerthread%dfinishedreadingfile.\n”,m_serial);//等待互斥信號,保證對ReadCount的訪問,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);//讀者數目減少readcount—;if(readcount==0){//如果所有的讀者讀完,喚醒寫者LeaveCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //釋放互斥信號}////////////////////////////////////////////////////////////////P:寫者線程信息voidRP_WriterThread(void*p){DWORDm_delay; 〃延遲時間DWORDm_persist; 〃寫文件持續時間intm_serial; 〃線程序號//從參數中獲得信息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);//////////////////////////////////////////////////////////////〃讀者優先處理函數//file:文件名voidReaderPriority(char*file)DWORDn_thread=0;〃線程數目DWORDthread_ID;〃線程IDDWORDwait_for_all;〃等待所有線程結束//互斥對象HANDLEh_Mutex;h_Mutex=CreateMutex(NULL,FALSE,〃mutex_for_readcount〃);//線程對象的數組HANDLEh_Thread[MAX_THREAD_NUM];ThreadInfothread_info[MAX_THREAD_NUM];readcount=0; //初始化readcountInitializeCriticalSection(&RP_Write); //初始化臨界區ifstreaminFile;inFile.open(file);printf("ReaderPriority:\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'){//創建讀者進程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&thread_ID);else{〃創建寫線程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_info[i],0,&thread_ID);}}//等待所有的線程結束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);printf("Allreaderandwriterhavefinishedoperating.、/');}////////////////////////////////////////////////////////〃寫者優先---讀者線程//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; //等待互斥變量所有權DWORDwait_for_mutex2;〃延遲時間DWORDm_delay;〃延遲時間DWORDm_persist; 〃讀文件持續時間intm_serial; 〃線程的序號//從參數中得到信息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);//讀者進去臨界區EnterCriticalSection(&cs_Read);//阻塞互斥對象Mutex2,保證對readCount的訪問和修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);〃修改讀者的數目readcount++;if(readcount==1){//如果是第1個讀者,等待寫者寫完EnterCriticalSection(&cs_Write);}ReleaseMutex(h_Mutex2);//釋放互斥信號Mutex2〃讓其他讀者進去臨界區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)//最后一個讀者,喚醒寫者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2);//釋放互斥信號///////////////////////////////////////////〃寫者優先---寫者線程//P:寫者線程信息voidWP_WriterThread(void*p)DWORDwait_for_mutex3;〃互斥變量〃延遲時間〃延遲時間DWORDm_delay;DWORDm_persist;〃讀文件持續時間intmserial;〃線程序號HANDLEh_Mutex3;h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,〃mutex3〃);//從參數中獲得信息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++; 〃修改寫者數目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);}/////////////////////////////////////////////〃寫者優先處理函數//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'){//創建讀者進程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),&thread_info[i],0,&thread_ID);}else{〃創建寫線程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),&thread_info[i],0,&thread_ID);}}//等待所有的線程結束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);printf("Allreaderandwriterhavefinishedoperating.、/');///////////////////////////////////////////////////////主函數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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論