实验步骤与内容: 一、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方法中:
nempty和nfull分别代表了ring中空和满的位置数,其和为buff_size,初始ring是空的,因此nfull和nempty初值分别为0和buff_size。mutex用来控制临界区,其初值为1,当为零时,其他程序不能进入临界区。
首先用for循环创建出两个producer线程,然后创建出两个consumer线程。 四、编译 第一次编译时 说明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为空。
temp_0: temp_1: 消费者零得到6条消息,消费者一得到2条消息。rs取值不同会产生不同结果。 |
操作系统实验三 NACHOS Synchronization Using Semaphores
于 2018-10-29 22:10:20 首次发布