![北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/c0c6a2dc-1148-449b-8ef3-16f4af1a49b0/c0c6a2dc-1148-449b-8ef3-16f4af1a49b01.gif)
![北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/c0c6a2dc-1148-449b-8ef3-16f4af1a49b0/c0c6a2dc-1148-449b-8ef3-16f4af1a49b02.gif)
![北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/c0c6a2dc-1148-449b-8ef3-16f4af1a49b0/c0c6a2dc-1148-449b-8ef3-16f4af1a49b03.gif)
![北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/c0c6a2dc-1148-449b-8ef3-16f4af1a49b0/c0c6a2dc-1148-449b-8ef3-16f4af1a49b04.gif)
![北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/c0c6a2dc-1148-449b-8ef3-16f4af1a49b0/c0c6a2dc-1148-449b-8ef3-16f4af1a49b05.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 制梁勞務(wù)合同范例
- 信貸資產(chǎn)信托合同范本
- 乙醇燃料的成本管理和降本增效
- 不帶司機(jī)租車合同范本
- 全款買車銷售合同范本
- 兼職模特合同范例
- 冷庫設(shè)備購銷合同范本
- 農(nóng)村承包魚塘經(jīng)營合同范例
- 電影制片人聘用合同范本
- 徐州白云區(qū)門面出租經(jīng)營合同范本
- 人教版小學(xué)數(shù)學(xué)(2024)一年級(jí)下冊(cè)第五單元100以內(nèi)的筆算加、減法綜合素養(yǎng)測(cè)評(píng) B卷(含答案)
- 2025江蘇常州溧陽市部分機(jī)關(guān)事業(yè)單位招聘編外人員78人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年度體育賽事贊助合同:運(yùn)動(dòng)員代言與贊助權(quán)益2篇
- 智研咨詢發(fā)布:2024年中國新疫苗行業(yè)市場(chǎng)現(xiàn)狀、發(fā)展概況、未來前景分析報(bào)告
- 2025屆西藏林芝一中高三第二次診斷性檢測(cè)英語試卷含解析
- 中國傳統(tǒng)文化非遺文化中國剪紙介紹2
- 藥企銷售總經(jīng)理競(jìng)聘
- 開封市第一屆職業(yè)技能大賽健康照護(hù)項(xiàng)目技術(shù)文件(國賽)
- 公路電子收費(fèi)系統(tǒng)安裝合同范本
- 醫(yī)院培訓(xùn)課件:《傷口評(píng)估與測(cè)量》
- 期末試卷(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)滬教版
評(píng)論
0/150
提交評(píng)論