过桥问题linux信号量课设,操作系统课程设计(实验三 信号量解决消费者生产者问题)...
開搞!
實驗題目
實驗三 使用信號量解決生產者/消費者同步問題(lab3)
實驗目的:
使用操作系統信號量機制,編寫程序解決生產者/消費者同步問題。
實驗內容:
1.理解Nachos的信號量是如何實現的;
2.生產者/消費者問題是如何用信號量實現的;
3.在Nachos中是如何創建并發線程的;
4.在Nachos下是如何測試和debug的.
實驗環境:
虛擬機下Ubuntu Linux 16.04 LTS系統,nachos-3.4內核管理模塊和MIPSCPU軟件模擬模塊,代碼在lab3文件夾下面實現。
直接開搞!!!
剛開始我們打開lab3,無腦make一波
可怕的事兒還是發生啦.png
!
這一下就十分令人蒙b
打開了老師給的指導教程。
!!!
原來這個實驗是一個半成品!
我們需要自己完善。
目前已完善的有:
main.cc
ring.cc
ring.h
剩下的prodcons就需要我們自己去努力了
那么我們就開始讀文件了:先從ring開始
讀文件
ring
class slot {
public:
slot(int id, int number);
slot() { thread_id = 0; value = 0;};
int thread_id;
int value;
};
class Ring {
public:
Ring(int sz); // Constructor: initialize variables, allocate space.
~Ring(); // Destructor: deallocate space allocated above.
void Put(slot *message); // Put a message the next empty slot.
void Get(slot *message); // Get a message from the next full slot.
int Full(); // Returns non-0 if the ring is full, 0 otherwise.
int Empty(); // Returns non-0 if the ring is empty, 0 otherwise.
private:
int size; // The size of the ring buffer.
int in, out; // Index of
slot *buffer; // A pointer to an array for the ring buffer.
};
可以看到,這里定義了兩個類,一個是slot,一個是ring。
通過分析代碼,我們得到以下結論:
Ring是一個環形緩沖類,給消費者和生產者使用
slot是被放置在ring當中的一個包裝了線程的東西,存著id和value這兩個信息。
main
感覺和上一個實驗的main差別不大,沒什么可分析的
prodcons
這個就是我們的重頭戲了,經過閱讀,發現有三個部分需要我們填充
-生產者
-消費者
-信號量
這三個的基礎方法都在ring中有定義,我們只需要捏起來就可以了
image.png
還要注意到上面的一個變量聲明,這里給我們提供了信號量的定義、申請和釋放的方法。也就是說,鎖是在這里定義的。
那么我們就發現,我們不知道semaphore是什么東西,發現他的代碼在thread里面存在,那么就去看一下它的代碼。
如圖所示
發現這個就是我們的信號量嘛,有PV操作,可以實現鎖。
開始寫代碼
生產者
需要增加代碼來補充message攜帶的信息;
message->thread_id = which;
message->value = num;
增加向Ring中放消息前的信號量操作代碼;
// Put the code for synchronization before ring->Put(message) here.
// ...
nempty->P();
mutex->P();
ring->Put(message);
增加向Ring 中放消息后的信號量操作代碼。
// Put the code for synchronization after ring->Put(message) here.
// ...
mutex->V();
nfull->V();
消費者
需要增加從Ring中讀消息前的信號量操作代碼;
// Put the code for synchronization before ring->Get(message) here.
// ...
nfull->P();
mutex->P();
ring->Get(message);
從Ring 中讀消息后的信號量操作代碼
mutex->V();
nempty->V();
信號量
需要增加構造所有信號量代碼;
mutex = new Semaphore("mutttt",1);
nfull = new Semaphore("nfull",0);
nempty = new Semaphore("empty",BUFF_SIZE);
增加構造緩沖池的代碼;
ring = new Ring(BUFF_SIZE);
創建生產者線程的代碼;
producers[i] = new Thread(prod_names[i]);
producers[i]->Fork(Producer,i);
創建消費者線程的代碼
consumers[i] = new Thread(cons_names[i]);
consumers[i] -> Fork(Consumer,i);
寫完了這些部分,再次make一波
報錯!!!
問題出在哪里呢?
報錯
發現是因為缺少了creat、write、exit和一些拼寫錯誤
拼寫錯誤修改中。。。
對于那幾個函數缺失的問題,上網搜集資料
發現下面這個解決方案可以:
導入頭文件
#include //庫中包含write方法
#include //庫中包含creat方法
再把ring.cc中的exit方法剪切到ring.h中
保存,跑!
make成功
./nachos試一下
成功
欣慰
打開源目錄,發現多了兩個文件,里面就是存著我們生產者、消費者的相關信息。
0
1
發現生產者生產的居然全部都被消費者1搶走了
然后根據指導書上,添加一下隨機數種子
添加隨機數種子的方法在指導書里前面一個地方寫了,是這樣的
-rs seed-number
于是我們試驗一下
命令
0
1
果然變了,那么實驗就到此為止寫完了。
總結
以上是生活随笔為你收集整理的过桥问题linux信号量课设,操作系统课程设计(实验三 信号量解决消费者生产者问题)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Physics.Raycast和Ray(
- 下一篇: linux编译kafka源码,Linux