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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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) (讀者寫者問(wèn)題) 課程名稱:操作系統(tǒng)原理實(shí)驗(yàn)時(shí)間:2015.10.30任課教師:王耀威實(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)二:讀者寫者問(wèn)題一、實(shí)驗(yàn)?zāi)康?. 通過(guò)編寫和調(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è)線程來(lái)表示n個(gè)讀者或?qū)懻摺C總€(gè)線程按相

2、應(yīng)測(cè)試數(shù)據(jù)文件(后面介紹)的要求進(jìn)行讀寫操作。用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先問(wèn)題。讀者-寫者問(wèn)題的讀寫操作限制(包括讀者優(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)行讀操作,則該讀者可直接開(kāi)始讀操作。運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫申請(qǐng)、開(kāi)始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確定所有處理都遵守相應(yīng)的讀寫操作限制。測(cè)試數(shù)據(jù)文件包括 n行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n個(gè)線程

3、是讀者還是寫者,以及讀寫操作的開(kāi)始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,每個(gè)字段間用空格分隔。第1個(gè)字段為正整數(shù),表示線程的序號(hào)。第2個(gè)字段表示線程的角色,R表示讀者,W表示寫者。第3個(gè)字段為一個(gè)正數(shù),表示讀寫開(kāi)始時(shí)間:線程創(chuàng)建后,延遲相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫申請(qǐng)。第4個(gè)字段為一個(gè)正數(shù),表示讀寫操作的延遲時(shí)間。當(dāng)線程讀寫申請(qǐng)成功后,開(kāi)始對(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)軟件:win

4、dows操作系統(tǒng),Visual C+6.0編譯環(huán)境。四、實(shí)驗(yàn)原理讀者寫者問(wèn)題,可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書(shū),讀者也在讀這本書(shū),多個(gè)讀者可以同時(shí)讀這本書(shū),但是,只能有一個(gè)寫者在寫書(shū),并且,讀者比寫者優(yōu)先,也就是說(shuō),讀者和寫者同時(shí)提出請(qǐng)求時(shí),讀者優(yōu)先。當(dāng)讀者提出請(qǐng)求時(shí)需要有一個(gè)互斥操作,另外,需要有一個(gè)信號(hào)量S來(lái)當(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)先的過(guò)程。五、實(shí)驗(yàn)結(jié)果程序界面:

5、使用的測(cè)試文件如下: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 '

6、;W'/ 寫者# 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 ThreadInfointseri

7、al;/ 線程序號(hào)charentity;/ 線程類別 (判斷是讀者線程還是寫者線程)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_

8、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( "讀者線程 <%d> 發(fā)送讀文件請(qǐng)求.n"

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

10、程printf("讀者線程 <%d> 讀文件結(jié)束.n" , m_serial) ;/ 等待互斥信號(hào),保證對(duì)readcount的訪問(wèn)、修改互斥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

11、(void* p)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) ) -> persist * INTE_PER_SEC) ;Sleep(m_delay) ;/ 延遲等待p

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

13、: 文件名void 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;/ 初

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

15、t;> thread_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

16、) ;printf("讀者線程 <%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 = WaitForMult

17、ipleObjects(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&quo

18、t; ) ;DWORD 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) ) -

19、> persist * 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的訪問(wèn)、修改互斥wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1) ; / 修

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

21、程 <%d> 讀文件結(jié)束.n" , m_serial) ;/ 阻塞互斥對(duì)象mutex2,保證對(duì)readcount的訪問(wèn)、修改互斥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

22、_delay;/ 延遲時(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

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

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

25、mutex3,保證對(duì)writecount的訪問(wèn)、修改互斥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(&c

28、s_Read) ;ifstream inFile;inFile.open(file) ;/ 打開(kāi)文件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

29、_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) (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 = WaitFo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論