日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

过桥问题linux信号量课设,操作系统课程设计(实验三 信号量解决消费者生产者问题)...

發布時間:2023/12/8 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过桥问题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信号量课设,操作系统课程设计(实验三 信号量解决消费者生产者问题)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。