一、讀者/寫者的問題模擬實現
讀者/寫者問題,是指保證乙個 writer 程序必須與其他程序互斥地訪問共享物件的同步問題。 讀者寫者問題可以這樣的描述:有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是只能有乙個寫者在寫書,並且讀者必優先,也就是說,讀者和寫者同時提出請求時,讀者優先。
當讀者提出請求時,需要有乙個互斥操作,另外需要有乙個訊號量 s 來確定當前是否可操作。 訊號量機制是支援多道程式的併發作業系統設計中解決資源共享時程序間的同步與互斥的重要機制,而讀者寫者則是這一機制的乙個經典範例。與記錄型訊號量解決讀者——寫者問題不同,訊號量機制它增加了乙個限制,即最多允許 rn 個讀者同時讀。
為此,又引入了乙個訊號量 l,並賦予初值為 rn,通過執行 wait (l,1,1)操作來控制讀者的數目,每當有乙個讀者進入時,就要執行wait(l,1,1)操作,使 l 的值減 1。當有 rn 個讀者進入讀後,l 便減為 0,第 rn+1 個讀者要進入讀時,必然會因 wait(l,1,1)操作失敗而堵塞。
程式例項:
#include
#include
#include
#include
#include
#include
#define max_person 100
#define reader 0 //讀者
#define writer 1 //寫者
#define end1
#define rreader
#define wwriter
typedef struct _person
person;
person g_persons[max_person];
int g_numperson = 0;
long g_currenttime= 0;//基本時間片數
int g_personlists = ;
int g_numofreading = 0;
int g_numofwriterequest = 0;//申請寫程序的個數
handle g_hreadsemaphore;//讀者訊號
handle g_hwritesemaphore;//寫者訊號
bool finished = false; //所有的讀完成
//bool wfinished = false; //所有的寫完成
void createpersonlist(int *ppersonlist);
bool createreader(int starttime,int worktime,int id);
bool createwriter(int starttime,int worktime,int id);
dword winapi readerproc(lpvoid lpparam);
dword winapi writerproc(lpvoid lpparam);
int main()
// return 0;
}void createpersonlist(int *ppersonlists)
if(!ret)
printf("create person %d is wrong\n",plist[0]);
plist += 4; // move to next person list}}
dword winapi readerproc(lpvoid lpparam)//讀過程
printf("reader %d is requesting 等待\n",pperson->m_nid);
printf("\n\nn");
// wait for the write request
waitforsingleobject(g_hreadsemaphore,infinite); if(g_numofreading ==0)
g_numofreading++;
releasesemaphore(g_hreadsemaphore,1,null);
pperson->m_nstarttime = g_currenttime;
printf("reader %d is reading the shared buffer等待\n",pperson->m_nid);
printf("\n\nn");
while(g_currenttime <= pperson->m_nstarttime + pperson->m_nworktime)
{}printf("reader %d is exit退出\n",pperson->m_nid);
printf("\n\nn");
waitforsingleobject(g_hreadsemaphore,infinite);
g_numofreading--;
if(g_numofreading == 0)
releasesemaphore(g_hreadsemaphore,1,null);
if(pperson->m_nid == 4) finished = true; //所有的讀寫完成
exitthread(0);
return 0;
}dword winapi writerproc(lpvoid lpparam)
printf("writer %d is requesting 請求進行寫操作\n",pperson->m_nid);
printf("\n\nn");
waitforsingleobject(g_hwritesemaphore,infinite);
// modify the writer's real start time
pperson->m_nstarttime = g_currenttime;
printf("writer %d is writting the shared buffer寫內容\n",pperson->m_nid);
while(g_currenttime <= pperson->m_nstarttime + pperson->m_nworktime)
{}printf("writer %d is exit退出\n",pperson->m_nid);
printf("\n\nn");
作業系統課程設計報告
上海電力學院 計算機作業系統原理 課程設計報告 題目名稱 編寫程式模擬虛擬儲存器管理 姓名 杜志豪 學號 20121798 班級 2012053班 同組姓名 孫嘉軼 課程設計時間 2014.6.30 2014.7.4 評語成績 一 設計內容及要求4 1.1 設計題目4 1 2 使用演算法分析4 1 ...
作業系統課程設計報告
作業系統 課程設計報告 姓名吳昊學號 20091811042 系別資訊管理與工程系 專業電腦科學與技術班級 09級 課程設計題目模擬檔案管理系統 指導教師崔新會 小組成員吳昊 丁強強 辛夢娟 王放 周洋 2012 年 6 月 11 日 目錄 內容摘要 2 第一章引言 2 第二章需求分析 4 第三章系...
作業系統課程設計報告
課程設計說明書 設計名稱 作業系統課程設計 題目 檔案訪問介面設計 學生姓名 陳小浪 專業 電腦科學與技術 班級 12級1班 學號 2012314118 指導教師 任朝暉 日期 2014 年 9 月 15 日 課程設計任務書 電腦科學與技術專業年級班 一 設計題目 檔案訪問介面設計 二 主要內容 利...