实验一进程同步

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档