操作系统实验一
进程同步算法的实现模拟
姓名:陈振宇
学号:1010322319 班级:10网络三班
一. 实验要求
(1) 生产者—消费者问题。Get、put二进程共用缓冲区s(大小为每次只存放一个记录)。Get负责输入记录到缓冲区s, put负责把t中的记录取出打印。 (2) 设计进程PCB结构和三种进程状态的队列,可以实现PCB队列的插入、删除、排序功能。 (3) 设计各进程使用的信号灯,画出各进程的P、V操作实现流程图;
(4)实现进程同步,完成记录的正常输出,要能够通过程序运行表现出对缓冲区s的进行临界区互斥和进程同步的思想(最好能记录或输出二个进程的实时状态和变化过程、二个进程队列的实时内容、几个缓冲区中实时内容,输出到屏幕上,这个过程同时记录在一个文本文件中);
(5) 编程语言不限制,tc2.0,vc6.0,.net,java都可以。
二. 实验过程
1.实验流程图
开始 Wait Products Wait Buffer Consume Produce While consume While produce 结束
2.数据结构及算法描述
1)数据结构:
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态(本程序未用)、进程产品(字符)、进程链指针等等。
系统开辟了一个缓冲区,大小由buffersize指定。
程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程?本程序通过函数模拟信号量的原子操作。 2)算法的文字描述: 大致由三个模块组成: a. 主程序 (main): i. ii.
创建信号量、共享内存并进行初始化 创建生产者、消费者进程,生产者执行pro_fun(),消费者执行con_fun() iii. 等待所有子进程的结束 iv. 删除信号量、共享内存 b. 生产者进程 (pro_fun): i.
通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间 ii.
P(empty),P(mutex),Add(data),V(mutex),V(full)
iii. 解除和共享内存的关联 c. 消费者进程 (con_fun): i.
通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间
ii. P(full),P(mutex),Add(data),V(mutex),V(empty)
iii. 解除和共享内存的关联 d. 循环队列部分:
加入数据: info[end] = value; end = (end + 1) % 3; 取出数据: temp = info[start]; info[start] = 0; (start = start + 1)%3; return temp;
3.生产者及消费者解决流程
同步问题:P进程不能往满的缓冲区放产品,设置信号量
empty,初值为0,用于指示空缓冲区数目。
V进程不能从空的缓冲区取产品,设置信号量
full,初值为0,用于知识满缓冲区数目。
解决流程:
P: V : Repeat: repeat: 生产一个产品; p(full);
送产品到缓冲区; 从缓冲区取产品; V(full); V(empty); P(empty); 消费产品 Until false until false