作業系統實驗程序同步 寫者優先

2021-03-31 08:56:58 字數 3519 閱讀 7698

實習1:程序同步 -- 寫者優先

實習要求

在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n

個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別

實現讀者優先和寫者優先的讀者-寫者問題。

讀者-寫者問題的讀寫操作限制:

1)寫-寫互斥;

2)讀-寫互斥;

3)讀-讀允許;

讀者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一讀者正在進行讀操作,

則該讀者可直接開始讀操作。

寫者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一寫者在等待訪問共享資

源,則該讀者必須等到沒有寫者處於等待狀態後才能開始讀操作。

執行結果顯示要求:要求在每個執行緒建立、發出讀寫操作申請、開始讀寫操作和結束讀

寫操作時分別顯示一行提示資訊,以確信所有處理都遵守相應的讀寫操作限制。

測試資料檔案格式

測試資料檔案包括n 行測試資料,分別描述建立的n 個執行緒是讀者還是寫者,以及讀寫

操作的開始時間和持續時間。每行測試資料報括四個字段,各字段間用空格分隔。第一字段

為乙個正整數,表示線程式號。第二字段表示相應執行緒角色,r 表示讀者是,w 表示寫者。

第三欄位為乙個正數,表示讀寫操作的開始時間。執行緒建立後,延時相應時間(單位為秒)

後發出對共享資源的讀寫申請。第四欄位為乙個正數,表示讀寫操作的持續時間。當執行緒讀

寫申請成功後,開始對共享資源的讀寫操作,該操作持續相應時間後結束,並釋放共享資源。

下面是乙個測試資料檔案的例子:

1 r 3 5

2 w 4 5

3 r 5 2

4 r 6 5

源**如下:

#define  max_person   100

#define  reader       0

#define  writer       1

#define  end         -1

#define  r            reader

#define  w            writer

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;

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);

// wait for the write request

while(g_numofwriterequest != 0) {}

waitforsingleobject(g_hreadsemaphore,infinite);

if(g_numofreading ==0)

g_numofreading++;

releasesemaphore(g_hreadsemaphore,1,null);

// modify the reader's real start time

pperson->m_nstarttime = g_currenttime;

printf("reader %d is reading the shared buffer.../n",pperson->m_nid);

while(g_currenttime <= pperson->m_nstarttime + pperson->m_nworktime)

printf("reader %d is exit.../n",pperson->m_nid);

waitforsingleobject(g_hreadsemaphore,infinite);

g_numofreading--;

if(g_numofreading == 0)

releasesemaphore(g_hreadsemaphore,1,null);

exitthread(0);

return 0;

}dword  winapi writerproc(lpvoid lpparam)

printf("writer %d is requesting .../n",pperson->m_nid);

g_numofwriterequest++;

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);

g_numofwriterequest--;

releasesemaphore(g_hwritesemaphore,1,null);

exitthread(0);

return 0;

}bool createreader(int starttime,int worktime,int id)

bool createwriter(int starttime,int worktime,int id)

程序同步 寫者優先

在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n 個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別 實現讀者優先和寫者優先的讀者 寫者問題。讀者 寫者問題的讀寫操作限制 1 寫 寫互斥 2 讀 寫互斥 3 讀 讀允許...

作業系統 程序同步

臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...

作業系統 程序同步

引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...