实验一进程同步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验一
进程同步算法的实现模拟
姓名:陈振宇
学号: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.实验流程图
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
生产者进程:
4)实验结果
三.实验源代码
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号unsigned short in = 0;
unsigned short out = 0;
int g_buffer[SIZE_OF_BUFFER];
bool g_continue = true;
HANDLE g_hMutex;
HANDLE g_hFullSemaphore;
HANDLE g_hEmptySemaphore;
DWORD WINAPI Producer(LPVOID); //生产者线程DWORD WINAPI Consumer(LPVOID); //消费者线程
int main()
{
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handle
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
//创建生产者线程
for (int i=0;i hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&produce rID[i]); if (hThreads[i]==NULL) return -1; } //创建消费者线程 for ( i=0;i