实验三(同步及互斥实验)_第1页
实验三(同步及互斥实验)_第2页
实验三(同步及互斥实验)_第3页
实验三(同步及互斥实验)_第4页
实验三(同步及互斥实验)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

实验三相关说明说明:(1)实验相关ppt内容选自《操作系统课程设计》的核心实验,本实验为互斥同步实验,通过学生模拟线程对资源的竞争进一步加强对同步与互斥的理解。(2)在该实验中,学生初次接触操作系统函数库,导致学生在实现原理时候无从下手,建议从一个具体实例来进行讲解。实验三:互斥与同步实验提纲提纲实验目的理解原子操作、同步、互斥、信号量、临界区等基本概念。掌握进程同步与互斥原理。掌握经典同步算法模型:生产者与消费者模型、读写者模型、哲学家就餐模型等。提纲实验内容一、实验说明(1)API介绍(2)测试数据介绍(3)生产者和消费者模型(4)读写者模型

二、实验内容(1)生产者消费者模型实验(2)读写者模型实验

(3)哲学家就餐模型实验一、实验说明API介绍(1)(1)等待指定的一个或全部的对象(*lpHandles)完成作业,或等待超过指定的时间。DWORDWaitForMultipleObjects(

DWORDnCount,//句柄的数量

CONSTHANDLE*lpHandles,

//指向句柄数组的指针

BOOLfWaitAll,//等待标志位

DWORDdwMilliseconds

//超时间隔(以毫秒为单位));API介绍(2)(2)创建一个信号量。HANDLECreateSemaphore(

LPSECURITY_ATTRIBUTES

lpSemaphoreAttributes,

//指定一个LPSECURITY_ATTRIBUTES结构,该结构通常指定安全属性LONGlInitialCount,//设置信号量的初始计数

LONGlMaximumCount,//信号量的最大计数LPCTSTRlpName//指定信号量对象的名称);API介绍(3)(3)关闭指定句柄的对象。BOOLWINAPICloseHandle(HANDLEhObject//要关闭的对象的句柄);API介绍(4)(4)增加信号量(hSemaphore)的值,类似于PV操作中的V。BOOLReleaseSemaphore(HANDLEhSemaphore,//要操作的信号量对象的句柄LONGlReleaseCount,//以当前为基础,信号量对象要增加的的值LPLONGlpPreviousCount//信号量变化前值的指针);API介绍(5)(5)创建一个线程,指定以C运行库的形式运行,而CreateThread()以Win32调用方式创建线程。uintptr_t_beginthreadex(void*security,//指向一个SECURITY_ATTRIBUTES结构,用来标识其返回的句柄能否被其子线程继承

unsignedstack_size,//新线程的栈的大小

unsigned(*start_address)(void*),//新线程的起始地址

void*arglist,//向新线程传递的参数列表

unsignedinitflag,//新线程的初始状态

unsigned*thrdaddr//指向一个32位的变量,改变量用来保存线程标识符);测试数据生产者与消费者模型:本实验将使用以下四类不同的数据集合,来表示四个生产者生产的元素。第一类数据:大写字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ。对应实验源码中的source0.txt第二类数据:数字:0123456789。对应实验源码中的source1.txt第三类数据:汉语拼音字母:bpmfdtnlgkhjqzzhchshrzcsywaoeiuvaieiuiaoouiuieveeraneninun对应实验源码中的source2.txt第四类数据:符号:~!@#$%^&*()_+-=,对应实验源码中的source3.txt生产者和消费者模型

主进程中创建n个线程来模拟生产者和消费者。生产者生产产品,消费者只消费指定生产者的产品,连接生产者与消费者的部分是缓冲池,生产者将生产出来的产品放在缓冲池中供消费者消费,消费者消费产品并释放缓冲区。

如果缓冲区满,则生产者无法继续放入产品,而要等待消费者消费。如果缓冲区空,则消费者无法继续消费,需要等待生产者生产产品。同时,生产者之间也是相互互斥的,而消费这只有在针对同意产品消费的时候才需要互斥。读写者模型

主进程创建多个读写线程分别对临界区进行读写访问,读写者之间遵从以下原则:1)读读不互斥:也就是说临界区可以多个读者同时访问2)读写互斥:读者和写者不可以同时访问临界区3)写写互斥:写者和写者不可以同时访问临界区4)避免读者或写者饿死:没有因为读者或者写者一直占用临界区而对方得不到资源而被饿死的情况出现。二、实验内容实验内容(1)实验一生产者消费者模型实验1.在windows下,使用vs创建工程CPProject;2.将生产者消费者实验的源码添加到该工程中,包括:RunableThread.h,Buffer.h,Consumer.h,Producer.h,Driver.cpp;并将相关数据(consumeri.txt和sourcei.txt)文件放在项目的根目录下。3.阅读代码,完成实验报告中的相关内容。4.执行代码,观察程序的运行结果,完成实验报告的相关内容。实验内容(2)实验二读写者模型实验1.在windows下,使用vs创建工程RWProject;2.讲读写者模型源码添加到该工程中,包括:RunableThread.h,Reader.h,Writer.h,RwLock.h,Driver.cpp五个文件3.其中,RwLock.h文件中的函数:ReadUnlock函数和WriteUnlock函数没有写完,请阅读其他源码,将这两个函数的内容补齐,并完成相关实验报告4.执行代码,观察程序的运行结果,完成实验报告的相关内容。实验内容(3)实验三哲学家就餐模型实验(小组任务)仿照所给两个经典进程同步代码,实现哲学家就餐问题。提纲生产者-消费者算法生产者P:Wait(empty);Wait(mutex);Buffer(in)=nextp;in:=(in+1)modn;Signal(mutex);Signal(full);消费者C:Wait(full);Wait(mutex);netxc=buffer(out);out:=(out+1)modn;Signal(mutex);Signal(empty);mutex,full,empty:semaphoremutex:=1;full:=0;empty:=n;读者-写者算法(读者优先)读者R:

Wait(rmutex);rcount++;if(rcount==1)Wait(wmutex);Signal(rmutex);Read_Action();Wait(rmutex);rcount--;if(rcount==0)Signal(wmutex);Signal(rmutex);写者W:Wait(wmutex);Write_Action();Signal(wmutex);rmutex,wmutex:semaphorermutex:=1;wmutex:=1;rcount:intrcount:=0;哲学家进餐算法哲学家i(i=0,1..5)thinking();Wait(

温馨提示

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

评论

0/150

提交评论