操作系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一(生产者—消费者)

一.实验题目生产者与消费者实验

二.实验目的

加深进程的概念的理解,明确进程与程序的区别,深入认识程序并发执行的实质,理解进程竞争资源的现象,互斥与同步的基本概念,掌握相关的API的使用,了解多线程的并发执行机制,实现线程的同步与互斥的基本方法。

三.实验内容

分析已编制的一个“生产者—消费者”实例,并将缺失的代码补充完整,然后调试这段程序,得出最终的结果,并分析此结果,得出相应的结论,尝试改变一些参数,分析这一改变对结果的影响。

四.设计思路和算法

1.利用windows提供的API函数CreateSemaphore()创建信号量对

象;Create Thread()创建线程;WaitForSingleObject()执行

P操作;Release Semaphore()执行V操作;

WaitForMultipleObjects()主进程等待线程的结束等函数进行

设计。

2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥

量(Mutex) 。使用这些对象都分为三个步骤,一是创建或者初

始化;接着请求该同步对象,随即进入临界区,这一步对应于

互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。

这些同步对象在主进程中创建,在其子线程中都可

五.主要数据结构

每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态(本程序未用)、进程产品(字符)、进程链指针等等。

系统开辟了一个缓冲区,大小由buffersize指定。

程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程

本程序通过函数模拟信号量的原子操作。

六.程序运行结果

运行程序后的结果:

生产者1准备生产

生产者1开始往缓冲区中写数据

生产者1开始退出缓冲区...

生产者2准备生产

生产者2开始往缓冲区中写数据

生产者2开始退出缓冲区...

消费者1准备消费

消费者1开始消费缓冲区中数据

消费者1开始退出缓冲区...

生产者3准备生产

生产者3开始往缓冲区中写数据

生产者3开始退出缓冲区..

.

消费者2准备消费

消费者2开始消费缓冲区中数据

消费者2开始退出缓冲区...

生产者4准备生产

生产者4开始往缓冲区中写数据

生产者4开始退出缓冲区...

消费者3准备消费

消费者3开始消费缓冲区中数据

消费者3开始退出缓冲区...

生产者5准备生产

生产者5开始往缓冲区中写数据

生产者5开始退出缓冲区...

消费者4准备消费

消费者4开始消费缓冲区中数据

消费者4开始退出缓冲区...

生产者6准备生产

生产者6开始往缓冲区中写数据生产者6开始退出缓冲区...

消费者5准备消费

消费者5开始消费缓冲区中数据消费者5开始退出缓冲区...

生产者7准备生产

生产者7开始往缓冲区中写数据生产者7开始退出缓冲区...

消费者6准备消费

消费者6开始消费缓冲区中数据消费者6开始退出缓冲区...

生产者8准备生产

生产者8开始往缓冲区中写数据生产者8开始退出缓冲区...

消费者7准备消费

消费者7开始消费缓冲区中数据消费者7开始退出缓冲区...

生产者9准备生产

生产者9开始往缓冲区中写数据生产者9开始退出缓冲区...

消费者8准备消费

消费者8开始消费缓冲区中数据消费者8开始退出缓冲区...

生产者10准备生产

生产者10开始往缓冲区中写数据生产者10开始退出缓冲区...

消费者9准备消费

消费者9开始消费缓冲区中数据消费者9开始退出缓冲区...

消费者10准备消费

消费者10开始消费缓冲区中数据消费者10开始退出缓冲区...

七.源程序

#include<>

#include<>

#include<>

#include

#include<>

#define MAX_BUFFER_NUM 10

#define INTE_PER_SEC 1000

#define MAX_THREAD_NUM 64

strict ThreadInfo

{

into serial;

char entity;

double delay;

into thread_request[MAX_THREAD_NUM];

into n_request;

};

CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM];

into Buffer_Critical[MAX_BUFFER_NUM]; HANDLE h_Thread[MAX_THREAD_NUM]; ThreadInfo Thread_Info[MAX_THREAD_NUM]; HANDLE empty_semaphore;

HANDLE h_mutex;

DWORD n_Thread = 0;

DWORD n_Buffer_or_Critical;

HANDLE h_Semaphore[MAX_THREAD_NUM];

void Produce(void *p);

void Consume(void *p);

bool IfInOtherRequest(into);

into FindProducePositon();

into FindBufferPosition(into);

into main(void)

{

DWORD wait_for_all;

ifstream inFile;

相关文档
最新文档