




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江苏大学计算机学院(适用于软件工程09级和网络工程0902班),操作系统课程设计,Page2,题目进程通信与进程同步机制实践,Linux或Windows或Unix环境下,采用系统调用中的信号量、P、V操作,编程解决以下问题。理发师问题:一个理发店由一间等候室W和一间工作室B组成。顾客可以从外面大街上进入W等候理发。两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。顾客在工作室内理完发,可由B的旁门出去。W中有N把椅子,顾客必须坐着等候。理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。顾客每进入一位,都拉铃通知理发师。若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。要求打印:初始状态中间变化的状态信息以及最终状态信息。,Page3,题目进程通信与进程同步机制实践,课程设计报告撰写要求1内容:课程设计题目、目的、要求,原理及算法,主要数据结构和流程,实验测试结果及结果分析,课程设计总结,源程序清单。2将设计报告、源程序打包压缩为一个文件,上传到3的软件工程09课程设计或网络工程0902操作系统课程设计目录中,同时提交纸质报告。实验安排时间:18周周一-周五上午1-4节,19周周一-周二上午1-4节(软件工程)18周周一-周五晚上9-12节,19周周一-周二晚上9-12节(网络工程0902)地点:计算机楼303机房。,Page4,涉及到的相关知识,Linux操作系统环境下C的编译:-编辑环境一般采用vi;-编译命令:g+源文件名可执行文件名用到的相关系统调用-shmget():开辟共享存储区-semget():用于产生一个信号量数组或查找已创建的信号量数组的描述字。其中,semkey是用户指定的关键字,count规定信号量数组的长度,flag为操作标志。-semop():用于进行P、V操作。其中,semid是semget返回的描述字,oplist是用户提供的操作数组的指针,count是该数组的大小。Semop返回最后被操作的信号量在操作完成前的值。oplist中的每个元素包含三个内容;信号量序号、欲进行的操作值和标识。,Page5,gcc的使用,基本使用格式$gcc选项常用选项及含义,Page6,gcc的常用选项,Page7,必须包含的头文件:#include#include#include#include#include用到的数据结构:sembuf,Page8,P操作的实现,设置oplist中的欲进行的操作值为-1,后执行semop。例如程序段如下:Structsembufunsignedshortsem_num;shortsem_op;shortsem_flg;Psembuf;semid=semget(SEMKEY,2,0777);Psembuf.sem_num=first;Psem.sem_op=-1;Psem.sem_flg=SEM_UNDO;semop(semid,Page9,V操作的实现,设置oplist中的欲进行的操作值为1,后执行semop。例如程序段如下:Structsembufunsignedshortsem_num;shortsem_op;shortsem_flg;Psembuf;semid=semget(SEMKEY,2,0777);Psembuf.sem_num=first;Psem.sem_op=1;Psem.sem_flg=SEM_UNDO;semop(semid,Page10,1、如何创建信号量,用来实现同步与互斥?2、P、V如何实现?例子,Page11,程序说明:,.这个程序用于实现生产者消费者问题。原理:producer(任意多个)-|+|(缓冲区:存放多个产品)-consumer(任意多个)producer和consumer通过共享缓冲区进行通信,信号量用于对缓冲区互斥访问、对producer和consumer进行同步。.共有三个程序:control,producer,consumer.其中control是主控程序,producer是生产者,consumer是消费者。control:实现对缓冲区的初始化,要最先执行,且只需要执行一次。producer:生产一个产品放入缓冲区:从屏幕输入一个字符串(32字节以内)。consumer:从缓冲区取出一个产品:向屏幕上输出一个字符串,Page12,程序说明:,3.注意:信号量、共享缓冲区都是系统资源,其总个数是有上限的。每个资源的id在系统中唯一,并且系统不会主动释放它们,所以要小心使用,及时释放。本程序中:control在执行一次后(成功执行),信号量、共享缓冲区就会分配。如果再执行它,control会提示资源已经分配,是否要释放它们?如果键入y(Y),则资源释放,此后执行producer,consumer都会报错。当然也可以使用ipcsipcrm命令来查看或释放资源。4.为了结构清晰,程序没有多余的输入或输出。可以在producer,consumer程序中适当的位置增加输出语句,和输入字符语句将程序暂停在某个位置,以观察运行的详细进程。5.建议增加功能:查看信号量的值、等待该信号量的进程等信息。使用的函数为:semctrl6.这个程序是一个框架,稍作修改,可以用于其它进程同步互斥问题。,Page13,程序说明:,#include#include#include#include#include#include#defineSHMKEY9075/*共享存储区的键*/#defineSEMKEY_PRODUCER9085#defineSEMKEY_CONSUMER9086#defineSEMKEY_MUTEX9087/*信号量数组的键*/*注意:上面的键在系统中必须唯一*/#defineBUFF_LEN10/*缓冲区可以存放10个产品*/#definePRODUCT_LEN32/*每个产品是一个字符串:sem_num=semnum;sem-sem_op=semop;sem-sem_flg=semflg;main()char*addr,end;intshmid;intsemid_producer,semid_consumer,semid_mutex;/*信号量id*/structsembufsem_tmp;,Page15,程序说明:,/*开辟共享存储区*/if(shmid=shmget(SHMKEY,BUFF_LEN*PRODUCT_LEN+2,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheBufferHasExisted!n);printf(DoYouWantToDeleteTheBuffer(Y=yes)?n=:);scanf(%c,Page16,程序说明:,if(end=y|end=Y)/*共享存储区、信号量并不随程序的结束而被删除,如果我们没删除的话,可以用ipcs命令查看,用ipcrm删除*/*释放缓冲区*/shmid=shmget(SHMKEY,BUFF_LEN*PRODUCT_LEN+2,0777);if(shmctl(shmid,IPC_RMID,0)0)perror(shmctl:);/*同时释放信号量*/semid_mutex=semget(SEMKEY_MUTEX,1,0777);semid_consumer=semget(SEMKEY_CONSUMER,1,0777);semid_producer=semget(SEMKEY_PRODUCER,1,0777);semctl(semid_mutex,0,IPC_RMID);semctl(semid_consumer,0,IPC_RMID);semctl(semid_producer,0,IPC_RMID);,Page17,程序说明:,elseprintf(FailToCreateBuffer!n);return-1;addr=(char*)shmat(shmid,0,0);/*连接缓冲区*/memset(addr,0,BUFF_LEN*PRODUCT_LEN+2);shmdt(addr);/*离开缓冲区*/*创建3个信号量:1个用于对缓冲区互斥,2个用于生产者、消费者同步*/if(semid_mutex=semget(SEMKEY_MUTEX,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEMKEY_MUTEXHasExisted!n);elseprintf(FailToCreateSEMKEY_MUTEX!n);return-1;,Page18,程序说明:,if(semid_consumer=semget(SEMKEY_CONSUMER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEMKEY_CONSUMERHasExisted!n);elseprintf(FailToCreateSEMKEY_CONSUMER!n);return-1;if(semid_producer=semget(SEMKEY_PRODUCER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEM_PRODUCERHasExisted!n);else,Page19,程序说明:,printf(FailToCreateSEM_PRODUCER!n);return-1;/*给信号量赋初值*/set_sembuf_struct(,Page20,程序说明:,if(semid_consumer=semget(SEMKEY_CONSUMER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEMKEY_CONSUMERHasExisted!n);elseprintf(FailToCreateSEMKEY_CONSUMER!n);return-1;if(semid_producer=semget(SEMKEY_PRODUCER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEM_PRODUCERHasExisted!n);elseprintf(FailToCreateSEM_PRODUCER!n);return-1;,Page21,程序说明:,if(semid_consumer=semget(SEMKEY_CONSUMER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEMKEY_CONSUMERHasExisted!n);elseprintf(FailToCreateSEMKEY_CONSUMER!n);return-1;,Page22,程序说明:,if(semid_producer=semget(SEMKEY_PRODUCER,1,0777|IPC_CREAT|IPC_EXCL)=-1)if(errno=EEXIST)printf(TheSEM_PRODUCERHasExisted!n);elseprintf(FailToCreateSEM_PRODUCER!n);return-1;,Page23,程序说明:,/*给信号量赋初值*/set_sembuf_struct(,Page24,Windows环境下的关知识介绍:,1同步对象同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(CriticalSection)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。同步对象的使用步骤:创建/初始化同步对象。请求同步对象,进入临界区(互斥量上锁)。释放同步对象(互斥量解锁)。这些对象在一个线程中创建,在其他线程中都可以使用,实现同步与互斥。,Page25,Windows环境下的关知识介绍:,2相关API的功能及使用利用WindowsSDK提供的API编程实现实验题目要求,而VC中包含有WindowsSDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件最常见的是Windows.h(特殊的API调用还需要包含其他头文件)下面给出的是本实验使用到的API的功能和使用方法简单介绍,Page26,Windows环境下的关知识介绍:,2相关API的功能及使用(1)CreateThread功能创建一个在调用进程的地址空间中执行的线程格式HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParamiter,DWORDdwCreationFlags,LpdwordlpThread),Page27,Windows环境下的关知识介绍:,参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32位),Page28,Windows环境下的关知识介绍:,(2)CreateMutex功能创建一个命名或匿名的互斥量对象格式HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);参数说明lpMutexAttributes必须取值NULL。bInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。,Page29,Windows环境下的关知识介绍:,(3)CreateSemaphore功能创建一个命名或匿名的信号量对象格式HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,LONGlInitialCount,LONGlMaximumCount,LPCTSTRlpName);参数说明lpSemaphoreAttributes必须取值NULL。lInitialCount信号量的初始值。该值大于0,但小于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。,Page30,Windows环境下的关知识介绍:,(4)WaitForSingleObject功能使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间格式DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE为无限等待)。,Page31,Windows环境下的关知识介绍:,(5)ReleaseSemaphore功能对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山楂的药效与作用
- 雌激素升高的表现
- 离婚后房产分割及财产分配与子女抚养执行合同范本
- 离婚协议子女抚养费支付及父母共同责任约定
- 2025深度探讨施工企业合同管理与风险控制
- 政府引导研究生委托培养与人才队伍建设合同范本
- 教育机构租赁合同主体变更及三方权益保障协议
- 异地离婚后房产分割与居住权约定书
- 离婚协议书中子女抚养权变更协议范本及程序
- 离婚后子女抚养权及父母共同监护及财产分割协议
- 艾青诗选《黎明》赏析
- 彩色沥青合同协议
- 民营医院行政管理与法律法规遵循
- 医院培训课件:《环境卫生学监测的方法》
- 中队辅导员培训材料
- (高清版)DB12∕T 934-2020 公路工程资料管理技术规程
- 深度解析Palantir介绍
- 木方回收合同6篇
- 《探寻抗日战争历史》课件
- 2025年第三届药膳大赛(选拔赛)理论知识考试题(附答案)
- 玻璃幕墙维修保养施工方案
评论
0/150
提交评论