ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:428.44KB ,
资源ID:21052667      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21052667.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验五Word格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验五Word格式.docx

1、 使用EOS的信号量,编程解决生产者 消费者问题,理解进程同步的意义。 调试跟踪EOS信号量的工作过程,理解进程同步的原理。 修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3. 实验类型(验证、设计)验证设计4. 实验内容1 准备实验2使用EOS的信号量解决生产者消费者问题3调试EOS信号量的工作过程 3.1创建信号量 3.2等待、释放信号量 3.2.1 等待信号量(不阻塞)3.2.2 释放信号量(不唤醒)3.2.3 等待信号量(阻塞)3.2.4 释放信号量(唤醒) 4 修改EOS的信号量算法 4.1 要求 4.2 提示 4.3 测试方法二、实验环境环境

2、:WindowsXP+EOS集成实验环境 语言:c语言三、实验过程1. 设计思路和流程图图1.1 Main函数流程图图1.2 Producer函数流程图图1.3 Consumer函数流程图2. 算法实现无3. 需要解决的问题及解答(1)P143,生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?答:这是因为临界资源的限制。临界资源就像产品仓库,只有仓库空闲,生产者才能生产,有权向里面放东西。所以必须等到消费者取走产品后,临界资源空闲时才能继续生产14号产品。(2)P1

3、47,绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图PsWaitForSemaphore函数的流程图PsReleaseSemaphore函数的流程图4. 主要数据结构、实现代码及其说明修改PsWaitForSemaphoreif (Semaphore-Count 0) Semaphore-Count -; ans = STATUS_SUCCESS; else if (Semaphore-Count = 0) ans = PspWait(&Semaphore-WaitListHead, Milliseconds); e

4、lse PspWait(&WaitListHead, INFINITE); KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。 return ans;修改PsReleaseSemaphoreIntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。 if (Semaphore-Count + ReleaseCount Semaphore-MaximumCount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / 记录当前的信号量的值。 if (NULL != P

5、reviousCount) *PreviousCount = Semaphore-Count; / 目前仅实现了标准记录型信号量,每执行一次信号量的释放操作 / 只能使信号量的值增加 1。 int k = Semaphore-Count+ReleaseCount; while (!ListIsEmpty(&WaitListHead) & (k) PspWakeThread(&WaitListHead, STATUS_SUCCESS); k-; Count = k; / 可能有线程被唤醒,执行线程调度。 PspThreadSchedule(); Status = STATUS_SUCCESS;

6、return Status;5. 源程序并附上注释#include psp.hVOIDPsInitializeSemaphore( IN PSEMAPHORE Semaphore, IN LONG InitialCount, IN LONG MaximumCount )/*+功能描述: 初始化信号量结构体。参数: Semaphore - 要初始化的信号量结构体指针。 InitialCount - 信号量的初始值,不能小于 0 且不能大于 MaximumCount。 MaximumCount - 信号量的最大值,必须大于 0。返回值: 无。-*/ ASSERT(InitialCount = 0

7、& InitialCount 0);Count = InitialCount;MaximumCount = MaximumCount; ListInitializeHead(&WaitListHead);STATUSPsWaitForSemaphore( IN ULONG Milliseconds/*+功能描述: 信号量的 Wait 操作(P 操作)。 Semaphore - Wait 操作的信号量对象。 Milliseconds - 等待超时上限,单位毫秒。 STATUS_SUCCESS。 当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回 STATUS_TIMEOUT。 STAT

8、US ans = STATUS_SUCCESS; BOOL IntState; ASSERT(KeGetIntNesting() = 0); / 中断环境下不能调用此函数。 IntState = KeEnableInterrupts(FALSE); / 目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以 PspWait 函数 / 的第二个参数的值只能是 INFINITE。PsReleaseSemaphore( IN LONG ReleaseCount, OUT PLONG PreviousCount 信号量的 Signal 操作(V 操作)。 ReleaseCount - 信号量计数增加的

9、数量。当前只能为 1。当你修改信号量使之支持 超时唤醒功能后,此参数的值能够大于等于 1。 PreviousCount - 返回信号量计数在增加之前的值。 如果成功释放信号量,返回 STATUS_SUCCESS。 STATUS Status; / 开始原子操作,禁止中断/ 下面是和信号量对象类型相关的代码。/ 信号量对象类型指针。POBJECT_TYPE PspSemaphoreType = NULL;/ 用于初始化 semaphore 结构体的参数结构体。typedef struct _SEM_CREATE_PARAM LONG InitialCount; LONG MaximumCount

10、;SEM_CREATE_PARAM, *PSEM_CREATE_PARAM;/ semaphore 对象的构造函数,在创建新 semaphore 对象时被调用。PspOnCreateSemaphoreObject( IN PVOID SemaphoreObject, IN ULONG_PTR CreateParam) PsInitializeSemaphore( (PSEMAPHORE)SemaphoreObject, (PSEM_CREATE_PARAM)CreateParam)-InitialCount,MaximumCount );/ semaphore 对象类型的初始化函数。PspCr

11、eateSemaphoreObjectType(VOID) OBJECT_TYPE_INITIALIZER Initializer; Initializer.Create = PspOnCreateSemaphoreObject; Initializer.Delete = NULL; Initializer.Wait = (OB_WAIT_METHOD)PsWaitForSemaphore; Initializer.Read = NULL; Initializer.Write = NULL; Status = ObCreateObjectType(SEMAPHORE, &Initializer

12、, &PspSemaphoreType); if (!EOS_SUCCESS(Status) KeBugCheck(Failed to create semaphore object type!);/ semaphore 对象的构造函数。PsCreateSemaphoreObject( IN LONG MaximumCount, IN PSTR Name, OUT PHANDLE SemaphoreHandle PVOID SemaphoreObject; SEM_CREATE_PARAM CreateParam; if(InitialCount 0 | MaximumCount Maximu

13、mCount) return STATUS_INVALID_PARAMETER; / 创建信号量对象。 CreateParam.InitialCount = InitialCount; CreateParam.MaximumCount = MaximumCount; Status = ObCreateObject( PspSemaphoreType, Name, sizeof(SEMAPHORE), (ULONG_PTR)&CreateParam, &SemaphoreObject); return Status; Status = ObCreateHandle(SemaphoreObject

14、, SemaphoreHandle); ObDerefObject(SemaphoreObject);/ semaphore 对象的 signal 操作函数。PsReleaseSemaphoreObject( IN HANDLE Handle, IN PLONG PreviousCount PSEMAPHORE Semaphore; if (ReleaseCount 1) / 由 semaphore 句柄得到 semaphore 对象的指针。 Status = ObRefObjectByHandle(Handle, PspSemaphoreType, (PVOID*)&Semaphore); if (EOS_SUCCESS(Status) Status = PsReleaseSemaphore(Semaphore, ReleaseCount, PreviousCount); ObDerefObject(Semaphore);6. 程序运行时的初值和运行结果四、实验体会过本次实验,初步了解操作系统的进程同步的过程。我对生产者-消费者问题的解决办法有了更全面的认识,同时对调试代码更加熟练。这次上机练习一步一步按照试验知道上的内容操作,最后也得到了想要的结果。虽然这个实验的时间较长,但感觉很充实。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1