2023年进程的同步实验报告_第1页
2023年进程的同步实验报告_第2页
2023年进程的同步实验报告_第3页
2023年进程的同步实验报告_第4页
2023年进程的同步实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

标作奈统

实验报

课程名称操作系统实验

实验项目名称进程的同步

学号班级20230612

计算机科学

姓名专业

与技术

计算机科学与技

学生所在学院指导教师

术学院

实验室名称地点计算机基础第七实验室21B475

哈尔滨工程大学

计算机科学与技术学院

*一、实验概述

1.实验名称

进程的同步

2.实验目的

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

义。

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

⑶修改EOS的信号量算法,使之支持等待超时唤醒功能泡有限等待①⑪加深

理解进程同步的原理。

3.实验类型

验证+设计

4.实验内容

⑴准备实验

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

⑶调试EOS信号量的工作过程

①创建信号量

②等待释放信号量

③等待信号量(不阻塞)

④释放信号量(不唤醒)

⑤等待信号量(阻塞)

⑥释放信号量(唤醒)

⑷修改EOS的信号量算法

二、实验环境

WindowsXP+EOS集成实验环境

三、实验过程

1.设计思绪和流程图

图4-1.整体实验流程图

图4-2.Main函数流程图、生产者消费、消费者流程图

2.算法实现

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

(1).思考在ps/semaphore.c文献内的PsWaitForSemaphore和P

sReleaseSemaphore函数中,为什么要使用原子操作?

答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,

假如此时cpu响应了外部中断,会产生不可预料的结果,无法正常完毕原子操

作。

(2).绘制ps/semaphore.c^®<rtPsWaitForSemaphore^[lPsRe1

easeSemaphore函数的流程图。

(3).P143生产者在生产了13号产品后本来要继续生产14号产品,可此时

生产者为什么必须等待消费者消费了4号产品后,才干生产14号产品呢?生产者

和消费者是如何使用同步对象来实现该同步过程的呢?

答:这是由于临界资源的限制。临界资源就像产品仓库,只有“产品仓库”空闲

生产者才干生产东西,有权向里面放东西。所以它必须等到消费者,取走产品,

“产品空间”(临界资源)空闲时,才继续生产14号产品。

(4).根据本实验3.3.2节中设立断点和调试的方法,自己设计一个类似

的调试方案来验证消费者线程在消费24号产品时会被阻塞,直到生产者线程生

产了24号产品后,消费者线程才被唤醒并继续执行的过程。

答:可以按照下面的环节进行调试

(1)删除所有的断点。

(2)按F5启动调试。OSLab会一方面弹出一个调试异常对话框。

(3)在调试异常对话框中选择“是”,调试会中断。

(4)在Consumer函数中档待Fu11信号量的代码行(第173行)WaitFor

Sing1eObject(FulISemaphoreHand1e,INFINITE);添加

一个断点。

(5)在“断点”窗口(按A1t+F9打开)中此断点的名称上点击右键。

(6)在弹出的快捷菜单中选择“条件”。

(7)在“断点条件”对话框(按F1获得帮助)的表达式编辑框中,输入表达式“i==

24”。

(8)点击“断点条件”对话框中的“拟定”按钮。

(9)按F5继续调试。只有当消费者线程尝试消费24号产品时才会在该条件断点

处中断。

4.重要数据结构、实现代码及其说明

修改PsWaitForSemaphore函数

if(Semaphore->Count>0)(

«Semaphore->Count—;

。f1ag=STATUS_SUCCESS;

}//假如信号量大于零,说明尚有资源,可认为线程分派

<»else

flag=PspWait(&Semaphore->WaitListHead,Milliseconds);

KeEnablelnterrupts(IntState)://原子操作完毕,恢复中断。

returnf1ag;

)〃否则,说明资源数量不够,不能再为线程分派资源,因此要使线程等待

修改PsReleaseSemaphore函数

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

Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED;

}else{

//记录当前的信号量的值。

if(NULL!=PreviousCount)(

o*PreviousCount=Semaphore->Counl;

»intmm=Semaphore->Count;

。//目前仅实现了标准记录型信号量,每执行•次信号量的释放操作

»//只能使信号量的值增长1。

awhile((!ListlsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){

gPspWakeThread(&Semaphore->WaitListHead,STATUSSUCCESS);

«PspThreadSchedu1e();

o^ReleaseCount—;

,}

Semaphore->Counl=mm+ReleaseCount;

o//也许有线程被唤醒,执行线程调度。

oStatus=STATUS,sueCESS;

)

5.源程序并附上注释

#include"psp.h"

VOID

PslnitializeSemaphore(

INPSEMAPH0RESemaphore,

INLONGInitialCount,

INLONGMaximumCount)

/*++

功能描述:

。初始化信号量结构体.

参数:

Semaphore一要初始化的信号量结构体指针。

。1nitialCount一信号量的初始值,不能小于0且不能大于MaximumCounto

<>MaximumCount一信号量的最大值,必须大于0。

返回值:无。

——*/

{

ASSERT(InitialCount>=0&&InitialCount<=MaximumCount&&MaximumCount>0);

Semaphore->Count=InitialCount;

Semaphore->MaximumCount=MaximumCount;

ListlnitializeHead(&Semaphore->WaitListHead);

)

STATUS

PsWaitForSemaphore(

4NPSEMAPHORESemaphore,

INULONGMilliseconds)

/*++

功能描述:

信号量的Wait操作(P操作)。

参数:

oSemaphore-Wait操作的信号量对象。

oMilliseconds一等待超时上限,单位亳秒。

返回值:

•STATUSSUCCESS.,

。当你修改信号量使之支持超时唤醒功能后,假如等待超时,应当返回sTATUS_TIMEOUTo

»BOOLIntState;

.STATUSflag;

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

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

“/目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以PspWait函数

//的第二个参数的值只能是INFIN1TEO

if(Semaphore~>Count>0){

Semaphore->Count-;

•flag=STATUS_SUCCESS;

)

else

flag=PspWait(&Semaphore->WaitListHead,Mi11iseconds);

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

returnflag:

)

STATUS

PsRe1easeSemaphore(

4NPSEMAPHORESemaphore,

INLONGReleaseCount,

OUTPLONGPreviousCount

)

/*++

功能描述:

信号量的signal操作(V操作)。

参数:

Semaphore——Wait操作的信号量对象。

»ReleaseCount—信号量计数增长的数量。当前只能为1。当你修改信号量使之支持

«。超时唤醒功能后,此参数的值可以大于等于1。

»PreviousCount—返回信号量计数在增长之前的值。

返回值:

。假如成功释放信号量,返回STATUS_SUCCESS0

—*/

(

6TATUSStatus;

»BOOLIntState;

1ntState=KeEnablelnterrupts(FALSE);//开始原子操作,严禁中断。

if(Semaphore->Count+Re1easeCount>Semaphore->MaximumCount)(

Status=STATUS_SEMAPH0RE_LIMI「EXCEEDED;

}else(

,//记录当前的信号量的值。

aif(NULL!=PreviousCount){

oo*PreviousCount=Seniaphore->Count;

}

intmm=Semaphore->Count:

//目前仅实现了标准记录型信号量,每执行一次信号量的释放操作

“/只能使信号量的值增长lo

◎while((!ListIsEmpty(&Semaphore—>WaitListIIead))&&(ReleaseCount)){

aPspWakeThread(&Semaphore->WaitListHead,STATUSSUCCESS);

»«PspThreadSchedule():

gRe1easeCount—;

•}

Semaphore->Count=mm+ReleaseCount;

“/也许有线程被唤醒,执行线程调度。

。Status=STATUS_SUCCESS;

)

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

returnStatus;

)

////////////////////////IIIII/////////////////////////////////////////////

//下面是和信号量对象类型相关的代码。

//信号量对象类型指针。

POBJECT_TYPEPspSemaphoreType=NULL;

//用于初始化semaphore结构体的参数结构体。

typedefstruct_SEM_CREATE_PARAM(

»LONGInitia1Count;

LONGMaximumCount;

}SEM_CREATE_PARAM,*PSEM_CREATE_PARAM;

//semaphore对象的构造函数,在创建新semaphore对象时被调用。

VOID

Psp0nCreateSemaphoreObject(

»INPVOIDSemaphoreObject,

INULONG_PTRGreateParam)

(

Pslnitia1izeSemaphore((PSEMAPHORE)SemaphoreObject,

»。8((PSEMCREATE_P/XR/VM)CreateParam)->InitiaICount,

q((PSEMCREATE_PARAM)CreateParam)—>MaximumCount);

}

//semaphore对象类型的初始化函数。

VOID

PspCreateSemaphoreObjectType(

VOID)

{

STATUSStatus;

OBJECT_TYPE.INITIAL1ZERInitializer;

Initializer.Create=PspOnCreateSemaphoreObject;

。Initia1izer.Delete=NULL;

«•Initializer.Wait=(OB_WAITMETHOD)PsWaitForSemaphore;

»Initializer.Read=NULL;

»Initia1izer.Write=NULL;

oStaLus=0bCreateObjectType(*SEMAPHORE",&Initializer,&PspSemaphoreType);

Kf(!EOS_SUCCESS(Status)){

KeBugCheck(*Failedtocreatesemaphoreobjecttype!");

//semaphore对象的构造函数。

STATUS

PsCreateSemaphore0bject(

“NLONGInitialCount,

4NLONGMaximumCount,

INPSTRName,

OUTPHANDLESemaphoreHandle

°)

(

STATUSStatus;

PVOIDSemaphoreObject;

SEM_CREATE_PARAMCreateParam;

»if(InitialCount<0IIMaximumCount<=0IIInitia1Count>MaximumCount){

etumSTATUS」NVAL【D_PARAMETER;

)

。//创建信号量对象。

•CreateParam.Initia1Count=InitialCount;

»CreateParam.MaximumCount=MaximumCount;

Status=ObCreateObject(PspSemaphoreType,

aName,

。•sizeof(SEMAPHORE),

(ULONGPTR)&CreateParam,

&Semaphore0bject);

•if(!EOS_SUCCESS(Status)){

oreturnStatus;

»)

Status=0bCreateHand1e(SemaphoreObject,SemaphoreHandle);

“f(!BOS_SUCCESS(Status)){

4)bDerefObject(Semaphore0bject);

)

<»returnStatus;

)

//semaphore对象的signa1操作函数。

STATUS

PsReleaseSemaphoreObject(

INHANDLEHandle,

INLONGReleaseCount,

»INPLONGPreviousCount)

(

»STATUSStatus;

PSEMAPHORESemaphore;

if(ReleaseCount<1){

-returnSTATUS_iNVAUDPARAMETER;

)

//由semaphore句柄得到semaphore对象的指针。

Stalus=0bRefObjectByHandie(Handie,PspSemaphoreType,(PVOID*)&Semaphore):

if(EOS_SUCCESS(Status)){

aStatus=PsRe1easeSemaphore(Semaphore,ReleaseCount,PreviousCount);

«0bDerefObject(Semaphore);

oreturnStatus;

)

6.程序运营时的初值和运营结果

《OSLabPC-licrosoftVirtualPC20041-||X

ActionEditCDFloppyHelp

CONSOLE-1(PressCtrl+F1~F8toswitchconsolewindow...)

Consumea17

Consumea18

Consumea19

Consumea20

ProduceaZ2

Consumea21

ConsumeaZZ

ProduceaZ3

Consumea23

Producea24

Consumea24

Producea25

Consumea25

Producea26

Consumea26

Producea27

ConsumeaZ7

Producea28

ConsumeaZ8

Producea29

Consumea29

A:\EOSApp.exeexitwith0x00000000.

>_____________

p*ju_jA

Mfloppy,lag

35无。

36

37

38

039ASSERT(InitialCount>=0&&InitialCount<=MaximurrCount&&MaximuirCouj

40

d41ISemaphore->Count=InitialCount;

42Semaphore->Maxi]nuii£ount=MaximuirCount;

43ListlnitializeHead(&Seroaphore->WaitListHead);

44)

45

46?STATUS

47:PsWaitForSemaphore(

4/INPSEIAPHORESemaphore,

49INULONGMilliseconds

50)

51/*++

52

监视▼QX调用堆我▼Q>

名称值名称

I力PslnitializeSemaphore(Sentaphore=0x803fbafD,InitialCount=0xa,Max...

PspOnCr««t«S«m*phor«Objtct(S«m«phor«0bj«ct=0x803fb«fU,Cr«*t«P*r«.

ObCreateObject(0bjectType=0x803fc088,ObjectName=OxO,ObjectBodyS...

PsCreateSenaphoreObjectCuitialCount=0xa.MaximunCount=0xa,Name=...

Cr**t«S«m«phor«(Initi*lCount=0x«,M«ximu»Count=0x«,Nkm*=0x0)地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论