操作系统实验三 NACHOS Synchronization Using Semaphores

实验步骤与内容:

一、producer方法中:

1、准备message

每个message都有一个id,id用num表示,num代表某个producer产生的第几条message,这个值被放入到slot的value域中,message也带有另一个域thread_id其中放入producer的id号。

2、信号量的同步控制

首先要检查ring中是否已满,其中nempty的初值为ring的大小,当一个新的生产者到达之后,对nempty执行p操作,如果s的初值为零,则说明ring是满的,此时阻塞生产者进程,并用while循环查看s的值,当其不为零时跳出while循环,对s执行减一操作。若生产者可以放产品,那么就应该考虑临界区的问题,mutex初值为一,对其执行p操作,若临界区内没有程序正在执行。那么,mutex的值仍然为一,减一,producer进入临界区,执行put操作,否则,producer被阻塞直到mutex的值为一。当producer执行完get操作后,退出临界区,让mutex的值恢复为一,使下一个程序能够执行,并对nfull进行加一操作。宏观整个程序,发现每当一个producer执行操作时,会让nempty的值减一,nfull的值加一,这两个值总可以表示ring中空值的个数和满值的个数。

二、consumer方法中:

1、控制同步

在consumer方法中,consumer每次从ring中读取所有的message,因此for循环是无限循环的。其信号量机制和producer相似,但不同的是consumer每次要检查nfull以确保ring不为空,然后让nempty加一。

三、prodcons方法中:

  1. 设置信号量初值

nempty和nfull分别代表了ring中空和满的位置数,其和为buff_size,初始ring是空的,因此nfull和nempty初值分别为0和buff_size。mutex用来控制临界区,其初值为1,当为零时,其他程序不能进入临界区。

  1. 创建线程

首先用for循环创建出两个producer线程,然后创建出两个consumer线程。

四、编译

第一次编译时

https://i-blog.csdnimg.cn/blog_migrate/55eaa38a5d49b71163a38b008d0c2ad4.png

说明creat、exit、write没有被声明,在prodcons++中添加声明:

分别用来声明write、exit、create方法

第二次编译时报错不能声明<stdlib.h>,即包含exit的库,删除#include <stdlib.h>,查看ring.cc文件,发现

即exit方法在ring.cc中被声明,但是在prodcons++文件中只声明了ring.h文件,于是,讲这段代码复制粘贴到ring.h文件中去。

编译成功。。。。

五、运行结果

1、没有任何参数:

所有的message都被第一个consumer获取了,而第二个consumer没有获取message。

temp_0:

temp_1为空。

  1. 随机数为5

temp_0:

temp_1:

消费者零得到6条消息,消费者一得到2条消息。rs取值不同会产生不同结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值