操作系统 实验 进程的同步

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

操作系统

实验报告

哈尔滨工程大学

计算机科学与技术学院

第四讲进程的同步

一、实验概述

1. 实验名称

进程的同步

2. 实验目的

使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。

调试跟踪EOS信号量的工作过程,理解进程同步的原理。

修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

3. 实验类型

验证+设计

4. 实验内容

(1)准备实验

(2)使用EOS的信号量解决生产者-消费者问题

(3)调试EOS信号量的工作过程

(4)修改EOS的信号量算法

二、实验环境

EOS操作系统和OS Lab集成实验环境,主要运用了C语言。

三、实验过程

3. 需要解决的问题及解答

(1)P143,生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?

这是因为临界资源的限制。临界资源就像产品仓库,只有“产品仓库”空闲生产者才能生产东西,有权向里面放东西。因此它必须要等到消费者,取走产品,临界资源空闲时,才能继续生产14号产品。

(2)P147-四思考与练习-2. 绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。

5. 源程序并附上注释

#include "psp.h"

VOID

PsInitializeSemaphore(

IN PSEMAPHORE Semaphore,

IN LONG InitialCount,

IN LONG MaximumCount

)

/*++

功能描述:初始化信号量结构体。

参数:Semaphore -- 要初始化的信号量结构体指针。

InitialCount -- 信号量的初始值,不能小于0 且不能大于MaximumCount。

MaximumCount -- 信号量的最大值,必须大于0。

返回值:无。

{ASSERT(InitialCount >= 0 && InitialCount <= MaximumCount && MaximumCount > 0); Semaphore->Count = InitialCount;

Semaphore->MaximumCount = MaximumCount;

ListInitializeHead(&Semaphore->WaitListHead);}

STATUS

PsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN INT Milliseconds,IN STATUS i )

/*++

功能描述:信号量的Wait 操作(P 操作)。

参数:Semaphore -- Wait 操作的信号量对象。

Milliseconds -- 等待超时上限,单位毫秒。返回值:

STATUS_SUCCESS。

--*/

{BOOL IntState;

ASSERT(KeGetIntNesting() == 0); // 中断环境下不能调用此函数。

IntState = KeEnableInterrupts(FALSE); // 开始原子操作,禁止中断。

// 目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以PspWait 函数的第二个参数的值只能是INFINITE。

if(Semaphore->Count > 0)

{ Semaphore->Count--;

i=STATUS_SUCCESS;}

else {i=PspWait(&Semaphore->WaitListHead,Milliseconds );}

KeEnableInterrupts(IntState); // 原子操作完成,恢复中断。

return i;

}

STATUS

PsReleaseSemaphore(IN PSEMAPHORE Semaphore,IN LONG ReleaseCount,OUT PLONG PreviousCount)

/*++

功能描述:信号量的Signal 操作(V 操作)。

参数:Semaphore -- Wait 操作的信号量对象。

-- 信号量计数增加的数量。当前只能为1。当你修改信号量使之支持超时唤醒功能后,此参数的值能够大于等于1。

PreviousCount -- 返回信号量计数在增加之前的值。

返回值:如果成功释放信号量,返回STATUS_SUCCESS。

--*/

{STATUS Status;

BOOL IntState;

IntState = KeEnableInterrupts(FALSE); // 开始原子操作,禁止中断。

if (Semaphore->Count + ReleaseCount > Semaphore->MaximumCount) {

Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED;

} else {

if (NULL != PreviousCount) {

*PreviousCount = Semaphore->Count;}

INT j=Semaphore->Count;

while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){

PspWakeThread(&Semaphore->WaitListHead, STATUS_SUCCESS);

PspThreadSchedule();

ReleaseCount--;

}

相关文档
最新文档