您的位置:首页 > 其它

操作系统课程设计实验3 -nachos-Synchronization Using Semaphores

2017-11-24 20:09 387 查看
Your tasks are:

(a) Read ring.h and ring.cc and make sure that you understand everything in them.

(b) Read main.cc.

(c) Read prodcons++.cc and make sure that you understand

i. the structure of the program

ii. the task to complete the program

(d) Complete all programs in file prodcons++.cc.

(e) Compile a new nachos by command make and test if your program is working or not.

实验过程如下:

(a)阅读ring.h
和ring.cc
文件,确信自己能理解文件中的每一部分内容。

ring.h 含有slot 类和Ring类的类定义,可以了解到Ring是一个缓冲池的类定义,在里面定义了对缓冲池的各种操作。而Slot则是可以放在缓冲池中,并且可以携带thread_id和value这两个属性信息。

 


而在ring.h 中有类slot 和类Ring类的具体实现。

(b) 阅读main.cc.

main.cc 中调用了ProdCons( )函数。其与上一个实验中的Threadtest类似。

(c) 阅读prodcons++.cc 并确信自己理解以下两方面内容

i,程序的结构

ii. 完善该程序的任务

i.在producons++.cc中,除了一些变量的声明之外,有

void Producer(_int which)

void Consumer(_int which)

void ProdCons( )

这样的三个方法,所以程序的结构就是先生产者方法、消费者方法以及定义生产者消费者的方法。

ii.通过阅读代码中的注释可以得到如下需要完成的任务:

在生产者方法中:

 


需要增加代码来补充message携带的信息;增加向Ring中放消息前的信号量操作代码;增加向Ring 中放消息后的信号量操作代码。

在消费者方法中:

 


需要增加从Ring中读消息前的信号量操作代码;从Ring 中读消息后的信号量操作代码。

在 ProdCons()方法中:

 


 


 


需要增加构造所有信号量代码;增加构造缓冲池的代码;创建生产者线程的代码;创建消费者线程的代码。

(d) 完成prodcons++.cc 中所有的程序

在生产者方法中:

(1)给message的thread_id和value属性分别附上which和num值,其中which就代表生产者编号,而value的作用是给不同的message编号。

(2)因为生产者和消费者进程要同时对缓冲池进行操作,因而缓冲池是一个临界资源,当对其进行操作时,要增加nempty和nfull锁,增加互斥锁,保持事务的原子性。

 


在消费者方法中:

当对缓冲池进行操作时,要增加nempty和nfull锁,增加互斥锁,保持事务的原子性。

 


 


 


在 ProdCons()方法中:

(1)构造所有的信号量操作代码,当前缓冲池有BUFF_SIZE个空间,所以开始时nempty的值为BUFF_SIZE,即可以向里面装入BUFF_SIZE个message。nfull的值为0,即刚开始时没有message,消费者是不能进行读取的。

(2)构造缓冲池,大小为BUFF_SIZE。

(3)创建生产者和消费者线程。

(e) 使用命令行编译一个新的nachos,测试你的程序是否能够成功运行

(1)第一次尝试编译时,报错。

 


显示create、exit、write没有被声明,需要声明包含这些方法的库。

#include <unistd,h> //库中包含write方法

#include <stdlib.h> //库中包含exit方法

#include <fcntl.h> //库中包含creat方法

(2)第二次尝试编译时,报错。

 


说明这里不能直接声明<stdlib.h>

继续看代码,在procons中声明了ring,h,但是与exit方法有关的代码却在ring.cc中,将这段代码copy到ring.h中,删除procons中的#include<stdlib.h>。



(3)第三次尝试编译,编译成功,生成了nachos。

 


(4)运行nachos,生成了两个文件,分别是消费者1和消费者2的获取message的记录。

 


 


 


 

可以看到在未输入任何参数时,所有的message都被0号消费者获取到了,而1号消费者没有获取到任何生产者生产的message。

现在尝试在运行时改变随机数种,要使用 nachos 运行参数-rs seed-number 来使时钟中断。

(5)运行nachos,给定-rs 10,观察结果。

 


 




 

 

可以看到消费者0和1都分别获取到了4个不同的message,并记录在tmp中。



经过不断的尝试,发现系统第一次出现像题目中的例子给的消费者0获取到3条message和消费者1获取到5条message的情况是在-rs 9的时候,并且在-rs给不同的值得情况下,消费者的消费情况也会出现不同。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: