操作系统实验五Word文档下载推荐.docx
- 文档编号:14029472
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:22
- 大小:589.24KB
操作系统实验五Word文档下载推荐.docx
《操作系统实验五Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验五Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
使用EOS的信号量,编程解决生产者消费者问题,理解进程同步的意义。
调试跟踪EOS信号量的工作过程,理解进程同步的原理。
修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。
3.实验类型
验证,设计
4.实验内容
4.1准备实验
4.2使用EOS的信号量解决生产者-消费者问题
4.3调试EOS信号量的工作过程
4.3.1创建信号量
4.3.2等待、释放信号量
4.3.2.1等待信号量(不阻塞)
4.3.2.2释放信号量(不唤醒)
4.3.2.3等待信号量(阻塞)
4.3.2.4释放信号量(唤醒)
4.4修改EOS的信号量算法
二、实验环境
操作系统集成实验环境OSLab
lEOS操作系统
三、实验过程
1.设计思路和流程图
2.需要解决的问题及解答
(1).P143生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?
生产者和消费者是怎样使用同步对象来实现该同步过程的呢?
答:
此时生产了0-13号14个产品,消费了0-3号4个产品,缓冲区都占满了。
只有缓冲区有空闲生产者才能生产东西,有权向里面放东西。
所以它必须等到消费者,取走产品,有空闲缓冲区时,才继续生产14号产品。
(2).P145-3.4修改EOS的信号量算法(只看一次消费1个产品的,一次消费2个产品的可以写到实验报告中)
见之后部分
(3).思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?
原子操作要求一旦开始就要运行到结束,不能有中断。
在执行等待信号量和释放信号量的时候,不允许cpu响应外部中断,所以使用原子操作。
(4).绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。
PsWaitForSemaphore
PsReleaseSemaphore
3.主要数据结构、实现代码及其说明
ps/semaphore.c文件
#include"
psp.h"
VOID
PsInitializeSemaphore(
INPSEMAPHORESemaphore,
INLONGInitialCount,
INLONGMaximumCount)
/*++
功能描述:
初始化信号量结构体。
参数:
Semaphore--要初始化的信号量结构体指针。
InitialCount--信号量的初始值,不能小于0且不能大于MaximumCount。
MaximumCount--信号量的最大值,必须大于0。
返回值:
无。
--*/
{
ASSERT(InitialCount>
=0&
&
InitialCount<
=MaximumCount&
MaximumCount>
0);
Semaphore->
Count=InitialCount;
Semaphore->
MaximumCount=MaximumCount;
ListInitializeHead(&
WaitListHead);
}
STATUS
PsWaitForSemaphore(
INULONGMilliseconds)
信号量的Wait操作(P操作)。
Semaphore--Wait操作的信号量对象。
Milliseconds--等待超时上限,单位毫秒。
STATUS_SUCCESS。
当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回STATUS_TIMEOUT。
BOOLIntState;
STATUSflag;
ASSERT(KeGetIntNesting()==0);
//中断环境下不能调用此函数。
IntState=KeEnableInterrupts(FALSE);
//开始原子操作,禁止中断。
//目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以PspWait函数
//的第二个参数的值只能是INFINITE。
if(Semaphore->
Count>
0){
Semaphore->
Count--;
flag=STATUS_SUCCESS;
}
else
flag=PspWait(&
WaitListHead,Milliseconds);
KeEnableInterrupts(IntState);
//原子操作完成,恢复中断。
returnflag;
PsReleaseSemaphore(
INLONGReleaseCount,
OUTPLONGPreviousCount
)
STATUSStatus;
if(Semaphore->
Count+ReleaseCount>
MaximumCount){
Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED;
}else{//记录当前的信号量的值。
if(NULL!
=PreviousCount){
*PreviousCount=Semaphore->
Count;
}
intmm=Semaphore->
//目前仅实现了标准记录型信号量,每执行一次信号量的释放操作
//只能使信号量的值增加1。
while((!
ListIsEmpty(&
WaitListHead))&
(ReleaseCount)){
PspWakeThread(&
WaitListHead,STATUS_SUCCESS);
PspThreadSchedule();
ReleaseCount--;
Count=mm+ReleaseCount;
//可能有线程被唤醒,执行线程调度。
Status=STATUS_SUCCESS;
returnStatus;
POBJECT_TYPEPspSemaphoreType=NULL;
//用于初始化semaphore结构体的参数结构体。
typedefstruct_SEM_CREATE_PARAM{
LONGInitialCount;
LONGMaximumCount;
}SEM_CREATE_PARAM,*PSEM_CREATE_PARAM;
//semaphore对象的构造函数,在创建新semaphore对象时被调用。
PspOnCreateSemaphoreObject(
INPVOIDSemaphoreObject,
INULONG_PTRCreateParam)
PsInitializeSemaphore((PSEMAPHORE)SemaphoreObject,
((PSEM_CREATE_PARAM)CreateParam)->
InitialCount,
MaximumCount);
}//semaphore对象类型的初始化函数。
PspCreateSemaphoreObjectType(
VOID)
OBJECT_TYPE_INITIALIZERInitializer;
Initializer.Create=PspOnCreateSemaphoreObject;
Initializer.Delete=NULL;
Initializer.Wait=(OB_WAIT_METHOD)PsWaitForSemaphore;
Initializer.Read=NULL;
Initializer.Write=NULL;
Status=ObCreateObjectType("
SEMAPHORE"
&
Initializer,&
PspSemaphoreType);
if(!
EOS_SUCCESS(Status)){
KeBugCheck("
Failedtocreatesemaphoreobjecttype!
"
);
}//semaphore对象的构造函数。
PsCreateSemaphoreObject(
INLONGMaximumCount,
INPSTRName,
OUTPHANDLESemaphoreHandle
PVOIDSemaphoreObject;
SEM_CREATE_PARAMCreateParam;
if(InitialCount<
0||MaximumCount<
=0||InitialCount>
MaximumCount){
returnSTATUS_INVALID_PARAMETER;
}//创建信号量对象。
CreateParam.InitialCount=InitialCount;
CreateParam.MaximumCount=MaximumCount;
Status=ObCreateObject(PspSemaphoreType,
Name,
sizeof(SEMAPHORE),
(ULONG_PTR)&
CreateParam,
&
SemaphoreObject);
returnStatus;
Status=ObCreateHandle(SemaphoreObject,SemaphoreHandle);
ObDerefObject(SemaphoreObject);
returnStatus;
}//semaphore对象的signal操作函数。
PsReleaseSemaphoreObject
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验