北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第1頁
北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第2頁
北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第3頁
北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第4頁
北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 本科實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱: 操作系統(tǒng)原理實(shí)驗(yàn) (讀者寫者問題) 課程名稱:操作系統(tǒng)原理實(shí)驗(yàn)時(shí)間:任課教師:王耀威實(shí)驗(yàn)地點(diǎn):10#102實(shí)驗(yàn)教師:蘇京霞實(shí)驗(yàn)類型:R 原理驗(yàn)證 綜合設(shè)計(jì) 自主創(chuàng)新學(xué)生姓名:孫嘉明學(xué)號(hào)/班級(jí):1120121474/05611202組 號(hào):學(xué) 院:信息與電子學(xué)院同組搭檔:專 業(yè):信息對(duì)抗技術(shù)成 績(jī):實(shí)驗(yàn)二:讀者寫者問題一、實(shí)驗(yàn)?zāi)康?. 通過編寫和調(diào)試程序以加深對(duì)進(jìn)程、線程管理方案的理解;2. 熟悉Windows多線程程序設(shè)計(jì)方法;二、實(shí)驗(yàn)要求在Windows環(huán)境下,創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,此進(jìn)程包含n個(gè)線程。用這n個(gè)線程來表示n個(gè)讀者或?qū)懻?。每個(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件(后面

2、介紹)的要求進(jìn)行讀寫操作。用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先問題。讀者-寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先)1) 寫-寫互斥:不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作2) 讀-寫互斥:不能同時(shí)有一個(gè)線程在讀,而另一個(gè)線程在寫。3) 讀-讀允許:可以有一個(gè)或多個(gè)讀者在讀。讀者優(yōu)先的附加限制:如果讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫申請(qǐng)、開始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確定所有處理都遵守相應(yīng)的讀寫操作限制。測(cè)試數(shù)據(jù)文件包括 n行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n個(gè)線程是讀者還是寫者,以及

3、讀寫操作的開始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,每個(gè)字段間用空格分隔。第1個(gè)字段為正整數(shù),表示線程的序號(hào)。第2個(gè)字段表示線程的角色,R表示讀者,W表示寫者。第3個(gè)字段為一個(gè)正數(shù),表示讀寫開始時(shí)間:線程創(chuàng)建后,延遲相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫申請(qǐng)。第4個(gè)字段為一個(gè)正數(shù),表示讀寫操作的延遲時(shí)間。當(dāng)線程讀寫申請(qǐng)成功后,開始對(duì)共享資源進(jìn)行讀寫操作,該操作持續(xù)相應(yīng)時(shí)間后結(jié)束,釋放該資源。下面是一個(gè)測(cè)試數(shù)據(jù)文件的例子(在記事本手工錄入數(shù)據(jù)):1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3三、實(shí)驗(yàn)環(huán)境硬件設(shè)備:個(gè)人計(jì)算機(jī)。系統(tǒng)軟件:windows操作系統(tǒng),V

4、isual C+6.0編譯環(huán)境。四、實(shí)驗(yàn)原理讀者寫者問題,可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個(gè)讀者可以同時(shí)讀這本書,但是,只能有一個(gè)寫者在寫書,并且,讀者比寫者優(yōu)先,也就是說,讀者和寫者同時(shí)提出請(qǐng)求時(shí),讀者優(yōu)先。當(dāng)讀者提出請(qǐng)求時(shí)需要有一個(gè)互斥操作,另外,需要有一個(gè)信號(hào)量S來當(dāng)前是否可操作。信號(hào)量機(jī)制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的重要機(jī)制,而讀者寫者則是這一機(jī)制的一個(gè)經(jīng)典范例。在程序文件根目錄下創(chuàng)建一個(gè)thread.dat文件,存放讀者寫者信息,完成讀者優(yōu)先和寫者優(yōu)先的過程。五、實(shí)驗(yàn)結(jié)果程序界面:使用的測(cè)試文件如下:

5、1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3讀者優(yōu)先結(jié)果:寫者優(yōu)先結(jié)果:六、程序代碼# include "windows.h"# include <conio.h># include <stdlib.h># include <fstream.h># include <io.h># include <string.h># include <stdio.h># define READER 'R'/ 讀者# define WRITER 'W'/ 寫

6、者# define INTE_PER_SEC 1000/ 每秒時(shí)鐘中斷數(shù)目# define MAX_THREAD_NUM 64/ 最大線程數(shù)目# define MAX_FILE_NUM 32/ 最大數(shù)據(jù)文件數(shù)目# define MAX_STR_LEN 32/ 字符串長(zhǎng)度int readcount = 0;/ 讀者數(shù)目int writecount = 0;/ 寫者數(shù)目CRITICAL_SECTION RP_Write;/ 臨界區(qū)CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfointserial;/ 線程序號(hào)c

7、harentity;/ 線程類別 (判斷是讀者線程還是寫者線程)doubledelay;/ 線程延遲doublepersist;/ 線程讀寫操作持續(xù)時(shí)間 ;/ 讀者優(yōu)先-讀者線程/ p: 讀者線程信息void RP_ReaderThread(void* p)/ 互斥變量HANDLE h_Mutex;h_Mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex_for_readcount" ) ;DWORD wait_for_mutex;/ 等待互斥變量所有權(quán)DWORD m_delay;/ 延遲時(shí)間DWORD m_persist;/

8、讀文件持續(xù)時(shí)間int m_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( "讀者線程 <%d> 發(fā)送讀文件請(qǐng)求.n" , m_seri

9、al) ; / 等待互斥信號(hào),保證對(duì)readcount的訪問、修改互斥wait_for_mutex = WaitForSingleObject (h_Mutex, -1) ;/ 讀者數(shù)目增加readcount +;if (readcount = 1)/ 第一個(gè)讀者,等待資源EnterCriticalSection(&RP_Write) ;ReleaseMutex(h_Mutex) ;/ 釋放互斥信號(hào)/ 讀文件printf( "讀者線程 <%d> 開始讀文件.n" , m_serial) ;Sleep(m_persist) ;/ 退出線程printf(&q

10、uot;讀者線程 <%d> 讀文件結(jié)束.n" , m_serial) ;/ 等待互斥信號(hào),保證對(duì)readcount的訪問、修改互斥wait_for_mutex = WaitForSingleObject(h_Mutex, -1) ;/ 讀者數(shù)目減少readcount -;if (readcount = 0)/ 如果所有讀者讀完,喚醒寫者LeaveCriticalSection(&RP_Write) ;ReleaseMutex(h_Mutex) ;/ 釋放互斥信號(hào)/ 讀者優(yōu)先-寫者線程/ p: 寫者線程信息void RP_WriterThread(void* p)D

11、WORD m_delay;/ 延遲時(shí)間DWORD m_persist;/ 寫文件持續(xù)時(shí)間int m_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(&quo

12、t;寫者線程 <%d> 發(fā)送寫文件請(qǐng)求.n" , m_serial) ;/ 等待資源EnterCriticalSection(&RP_Write);/ 寫文件printf( "寫者線程 <%d> 開始寫文件.n" , m_serial) ;Sleep(m_persist) ;/ 退出線程printf("寫者線程 <%d> 寫文件結(jié)束.n" , m_serial) ;/ 釋放資源LeaveCriticalSection(&RP_Write) ;/ 讀者優(yōu)先處理函數(shù)/ file: 文件名void

13、ReaderPriority(char * file)DWORD n_thread = 0;/ 線程數(shù)目DWORD thread_ID;/ 線程IDDWORD wait_for_all;/ 等待所有線程結(jié)束/ 互斥對(duì)象HANDLE h_Mutex;h_Mutex = CreateMutex(NULL, FALSE, "mutex_for_readcount" ) ;/ 線程對(duì)象的數(shù)組HANDLE h_Thread MAX_THREAD_NUM ;ThreadInfo thread_infoMAX_THREAD_NUM ;readcount = 0;/ 初始化readcoun

14、tInitializeCriticalSection(&RP_Write) ;/ 初始化臨界區(qū)ifstream inFile;inFile.open(file) ;/ 打開文件printf("讀者優(yōu)先: n n" ) ;while (inFile)/ 讀入每一個(gè)讀者、寫者的信息inFile >> thread_infon_thread.serial;inFile >> thread_infon_thread.entity;inFile >> thread_infon_thread.delay;inFile >> thr

15、ead_infon_thread + .persist;inFile.get() ;n_thread-;for (int i = 0; i < (int) (n_thread); i +)if (thread_infoi.entity = READER | thread_infoi.entity = 'R' )/ 創(chuàng)建讀者線程h_Threadi = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) (RP_ReaderThread) ,&thread_infoi , 0, &thread_ID) ;printf(

16、"讀者線程 <%d> 已創(chuàng)建.n" , thread_infoi.serial) ;else / 創(chuàng)建寫者線程h_Threadi = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (RP_WriterThread) ,&thread_infoi , 0, &thread_ID) ;printf("寫者線程 <%d> 已創(chuàng)建.n" , thread_infoi.serial) ; / 等待所有線程結(jié)束wait_for_all = WaitForMultipleObject

17、s(n_thread, h_Thread, TRUE, -1) ;printf("所有讀者寫者均完成操作.n" ) ;/ 寫者優(yōu)先-讀者線程/ p: 讀者線程信息void WP_ReaderThread(void * p) / 互斥變量HANDLE h_Mutex1;h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex1" ) ;HANDLE h_Mutex2;h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex2" ) ;DWOR

18、D wait_for_mutex1;/ 等待互斥變量所有權(quán)DWORD wait_for_mutex2;DWORD m_delay;/ 延遲時(shí)間DWORD m_persist;/ 讀文件持續(xù)時(shí)間int m_serial;/ 線程序號(hào)/ 從參數(shù)中獲得信息m_serial = ( (ThreadInfo* ) (p) ) -> serial;m_delay = (DWORD) ( ( (ThreadInfo* ) (p) ) -> delay * INTE_PER_SEC) ;m_persist = (DWORD) ( ( (ThreadInfo* ) (p) ) -> persi

19、st * INTE_PER_SEC) ;Sleep(m_delay) ;/ 延遲等待printf("讀者線程 <%d> 發(fā)送讀文件請(qǐng)求.n" , m_serial) ;wait_for_mutex1 = WaitForSingleObject(h_Mutex1, -1) ;/ 進(jìn)入讀者臨界區(qū)EnterCriticalSection(&cs_Read) ;/ 阻塞互斥對(duì)象mutex2,保證對(duì)readcount的訪問、修改互斥wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1) ; / 修改讀者數(shù)目readc

20、ount +;if (readcount = 1)/ 如果是第一個(gè)讀者,等待寫者寫完EnterCriticalSection(&cs_Write) ;ReleaseMutex(h_Mutex2) ;/ 釋放互斥信號(hào)mutex2/ 讓其他讀者進(jìn)入臨界區(qū)LeaveCriticalSection(&cs_Read) ;ReleaseMutex(h_Mutex1) ;/ 讀文件printf("讀者線程 <%d> 開始讀文件.n" , m_serial) ;Sleep(m_persist) ;/ 退出線程printf("讀者線程 <%d&g

21、t; 讀文件結(jié)束.n" , m_serial) ;/ 阻塞互斥對(duì)象mutex2,保證對(duì)readcount的訪問、修改互斥wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1) ;readcount - ;if (readcount = 0)/ 最后一個(gè)讀者,喚醒寫者LeaveCriticalSection(&cs_Write) ;ReleaseMutex(h_Mutex2) ;/ 釋放互斥信號(hào)/ 寫者優(yōu)先-寫者線程/ p: 寫者線程信息void WP_WriterThread(void * p)DWORD m_delay;/ 延

22、遲時(shí)間DWORD m_persist;/ 寫文件持續(xù)時(shí)間int m_serial;/ 線程序號(hào)DWORD wait_for_mutex3;/ 互斥對(duì)象HANDLE h_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 =

23、 (DWORD) ( ( (ThreadInfo* ) (p) ) -> persist * INTE_PER_SEC) ;Sleep(m_delay) ;/ 延遲等待printf("寫者線程 <%d> 發(fā)送寫文件請(qǐng)求.n" , m_serial) ;/ 阻塞互斥對(duì)象mutex3, 保證對(duì)writecount的訪問、修改互斥wait_for_mutex3 = WaitForSingleObject(h_Mutex3, -1) ;writecount + ;/ 修改寫者數(shù)目if (writecount = 1)/ 第一個(gè)寫者,等待讀者讀完EnterCriti

24、calSection(&cs_Read) ; ReleaseMutex(h_Mutex3) ;/ 進(jìn)入寫者臨界區(qū)EnterCriticalSection(&cs_Write) ;/ 寫文件printf("寫者線程 <%d> 開始寫文件.n" , m_serial) ;Sleep(m_persist) ;/ 退出線程printf("寫者線程 <%d> 寫文件結(jié)束.n" , m_serial) ;/ 離開臨界區(qū)LeaveCriticalSection(&cs_Write) ;/ 阻塞互斥對(duì)象mutex3,保證對(duì)

25、writecount的訪問、修改互斥wait_for_mutex3 = WaitForSingleObject(h_Mutex3, -1) ;writecount -;if (writecount = 0)/ 寫者寫完,讀者可以讀LeaveCriticalSection(&cs_Read) ;ReleaseMutex(h_Mutex3) ;/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

26、 / / / / / / / / / 寫者優(yōu)先處理函數(shù)/ file: 文件名void WriterPriority(char * file)DWORD n_thread = 0;/ 線程數(shù)目DWORD thread_ID;/ 線程IDDWORD wait_for_all;/ 等待所有線程結(jié)束/ 互斥對(duì)象HANDLE h_Mutex1;h_Mutex1 = CreateMutex(NULL, FALSE, "mutex1" ) ;HANDLE h_Mutex2;h_Mutex2 = CreateMutex(NULL, FALSE, "mutex2" ) ;

27、HANDLE h_Mutex3;h_Mutex3 = CreateMutex(NULL, FALSE, "mutex3" ) ;/ 線程對(duì)象HANDLE h_ThreadMAX_THREAD_NUM ;ThreadInfo thread_infoMAX_THREAD_NUM ;readcount = 0;/ 初始化readcountwritecount = 0; / 初始化writecountInitializeCriticalSection(&cs_Write) ;/ 初始化臨界區(qū)InitializeCriticalSection(&cs_Read) ;i

28、fstream inFile;inFile.open(file) ;/ 打開文件printf("寫者優(yōu)先: n n" ) ;while (inFile)/ 讀入每一個(gè)讀者、寫者的信息inFile >> thread_infon_thread.serial;inFile >> thread_infon_thread.entity;inFile >> thread_infon_thread.delay;inFile >> thread_infon_thread +.persist;inFile.get() ;n_thread-;f

29、or (int i = 0; i < (int) (n_thread) ; i +)if (thread_infoi.entity = READER | thread_infoi.entity = 'R' )/ 創(chuàng)建讀者線程h_Threadi = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) (WP_ReaderThread) ,&thread_infoi , 0, &thread_ID) ;printf("讀者線程 <%d> 已創(chuàng)建.n" , thread_infoi.serial) ;else / 創(chuàng)建寫者線程h_Threadi = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) (WP_WriterThread) ,&thread_infoi , 0, &thread_ID) ;printf("寫者線程 <%d> 已創(chuàng)建.n" , thread_infoi.serial) ;/ 等待所有錢程結(jié)束wait_for_all = WaitFor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論