操作系统课设之基于信号量机制的并发程序设计
前言
課程設計開始了,實驗很有意思,寫博客總結學到的知識
白嫖容易,創作不易,學到東西才是真
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/archives/183
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/118309933
為了美觀,實驗源代碼在結尾處,整合版見下
鏈接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取碼:Lin2
本次操作系統課程設計合集
操作系統課程設計源代碼
本次操作系統課程設計合集
操作系統課設之Windows 進程管理
操作系統課設之Linux 進程管理
操作系統課設之Linux 進程間通信
操作系統課設之Windows 的互斥與同步
操作系統課設之內存管理
操作系統課設之虛擬內存頁面置換算法的模擬與實現
操作系統課設之基于信號量機制的并發程序設計
操作系統課設之簡單 shell 命令行解釋器的設計與實現
僅用于學習,如有侵權,請聯系我刪除
實驗題目
基于信號量機制的并發程序設計
實驗目的
(1) 回顧操作系統進程、線程的有關概念,針對經典的同步、互斥、死鎖與饑餓問題進行并發程序設計與實現。
(2) 理解互斥體對象,利用互斥與同步操作編寫讀者-寫者問題的并發程序,加深對 P (即semWait)、V(即 semSignal)原語以及利用 P、V 原語進行進程間同步與互斥操作的理解。
(3) 理解 Linux 支持的信息量機制,利用 IPC 的信號量系統調用編程實現哲學家進餐問題。
總體設計
因為指導書上只寫了完成其一即可,我選擇的題目是在Windows下實現讀者寫者問題。
背景知識:
主要是熟悉Windows API,熟悉PV操作對應的語法結構
還有就是對讀者寫者問題的理解,由于書上已經說的很詳盡,而且還給了偽代碼,這里只是淺談一下。
讀者寫者問題:
存在一個多進程共享的數據區,該數據區可以是一個文件或一塊內存空間,甚至可以是一組寄存器,有些進程(reader)只讀取這個數據區中的數據,有些進程(writer)只往數據區中寫數據。,此外,還必須滿足:
1.任意數量的讀進程可同時讀這個文件。
2.一次只有一個寫進程可以寫文件
3.若寫進程正在寫文件,則禁止任何讀進程讀文件。
書上實現的讀者優先的算法思路是:
寫進程比較簡單,信號量WriteSemaphore用于實施排斥,只要一個寫進程正在訪問數據區,其他寫進程和讀進程就都不能訪問它。讀進程也使用WriteSemaphore實施互斥,但為了允許多個讀進程,沒有讀進程正在讀時,第一個試圖讀的讀進程需要在WriteSemaphore上等待。當至少已有一個讀進程在讀時,隨后的讀進程無須等待,可以直接進入。readcount用于記錄讀進程的數量,信號量XSemaphore用于確保readcount被正確地更新。
詳細設計
主要是調用Windows的API
首先就是宏定義
解釋一下模數的意義,為了測試讀者寫者的實際效果,我定義了一個test變量,當寫者寫的時候test自增1,為了防止自增次數太多導致數據溢出,就定義了一個模數,讀者就負責讀test數據。
讀者線程執行:
寫者線程寫:
void WRITEUNIT() {cout<<"寫者開始寫:";test = (test+1) % MOD;cout<<test<<endl; }這兩個是讀者寫者執行的主要邏輯功能
然后就是讀者線程的執行函數:
寫者線程的執行函數
DWORD WINAPI writer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(WriteSemaphore,INFINITE); //semWait(wsem);WRITEUNIT();ReleaseSemaphore(WriteSemaphore,1,NULL); //semSignal(wsem);Sleep(2000);}return 0; }實驗結果與分析
結果如上,是符合預期的,讀者只讀test變量的數據,而寫者對test變量自增。
小結與心得體會
本實驗的難度不大,主要是熟悉Windows API用法,了解信號量的定義和初始化,線程的創建和PV操作,然后就是理解課本上對于讀者寫者問題的講解。=w=
源代碼
#include <windows.h> #include <iostream>#define MAX_READER_NUM 512 #define READER_NUM 3 #define WRITER_NUM 2 #define MOD 100 using namespace std;int readcount = 0; HANDLE WriteSemaphore; //實現讀寫互斥 HANDLE XSemaphore; //對于人數修改的互斥量 DWORD WINAPI reader(LPVOID); //讀者線程 DWORD WINAPI writer(LPVOID); //寫者線程 bool p_ccontinue = true; //控制程序結束int test = 0;int main() {//初始化兩個信號量/*結構體指針;信號量對象的初始計數;信號量對象的最大計數;信號量對象的名稱*/WriteSemaphore = CreateSemaphore(NULL,1,MAX_READER_NUM,NULL);XSemaphore = CreateSemaphore(NULL,1,MAX_READER_NUM,NULL);//用WindowsAPI模擬課本上 parbegin(reader,writer);//總的線程數HANDLE hThreads[READER_NUM + WRITER_NUM]; //各線程的 handleDWORD readerID[READER_NUM]; //讀者線程的標識符DWORD writerID[WRITER_NUM]; //寫者線程的標識符//創建讀者線程for (int i=0; i<READER_NUM; i++){hThreads[i]=CreateThread(NULL,0,reader,NULL,0,&readerID[i]);if (hThreads[i]==NULL)return -1;}//創建寫者線程for (int i=0; i<WRITER_NUM; i++){hThreads[READER_NUM+i]=CreateThread(NULL,0,writer,NULL,0,&writerID[i]);if (hThreads[i]==NULL)return -1;}while(p_ccontinue){if(getchar()) //按回車后終止程序運行{p_ccontinue = false;}}return 0; }//讀者閱讀 void READUNIT() {cout<<"一個讀者開始閱讀:";cout<<test<<endl; }//寫者寫 void WRITEUNIT() {cout<<"寫者開始寫:";test = (test+1) % MOD;cout<<test<<endl; } //讀者 DWORD WINAPI reader(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(XSemaphore,INFINITE); //semWait(x);readcount++;if(readcount == 1) //第一個讀者來了WaitForSingleObject(WriteSemaphore,INFINITE); //semWait(wsem);ReleaseSemaphore(XSemaphore,1,NULL); //semSignal(x);READUNIT();//閱讀完畢WaitForSingleObject(XSemaphore,INFINITE); //semWait(x);readcount--;//無讀者,釋放資源if(readcount == 0)ReleaseSemaphore(WriteSemaphore,1,NULL); //semSignal(wsem);ReleaseSemaphore(XSemaphore,1,NULL); //semSignal(x);Sleep(3000);}return 0; } //寫者 DWORD WINAPI writer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(WriteSemaphore,INFINITE); //semWait(wsem);WRITEUNIT();ReleaseSemaphore(WriteSemaphore,1,NULL); //semSignal(wsem);Sleep(2000);}return 0; }總結
以上是生活随笔為你收集整理的操作系统课设之基于信号量机制的并发程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery和php方面的填空题,PHP
- 下一篇: 测试页打印失败.是否参阅打印疑难解答以获