操作系统实验报告
full,它代表的资源是缓冲区满,它的初始值为0,它的值为n==5时整个缓冲池满。
这个资源是消费者进程所有,消费者进程可以申请该资源,对它施加P 操作,生产者进程P对它施加V操作。
为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。
信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:存入指针in和取出指针out。
(2)设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore 表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0.另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量Mutex,初始值为1.
(3)程序中各主要函数的功能如下:
生成信号量:int sem_creat(key_t key, int value)
删除信号量:void del_sem(int semid)
p操作
int p(int semid)
{
struct sembuf sops={0, -1, SEM_UNDO};
return (semop(semid, &sops, 1));
}
v操作
int v(int semid)
{
struct sembuf sops={0, +1, SEM_UNDO};
return (semop(semid, &sops, 1));
}
生产者执行的代码:void producer(key_t keyFull, key_t keyEmpty,key_t keymutex) 消费者执行的代码:void consumer(int full, int empty,int mutex)
实验步骤:
(1)打开Unix系统,新建Pro.c文件,存入根目录root。
(2)点击右键,有新建终端选项,进入vi编辑器。
(3)输入指令vi pro.c,键入i进入编辑状态,输入如下代码:
(4)用gccgcc 命令编译源文件pro.c。
具体指令为
gcc -o pro pro.c -lrt
./pro.c
实验结果:。