1 / 11
文档名称:

实验二进程同步实验报告.doc

格式:doc   大小:30KB   页数:11页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验二进程同步实验报告.doc

上传人:iris028 2019/9/10 文件大小:30 KB

下载得到文件列表

实验二进程同步实验报告.doc

文档介绍

文档介绍:实验二进程同步一、实验目的:掌握基本的同步算法,理解经典进程同步问题的本质;学****使用Linux的进程同步机制,掌握相关API的使用方法;能利用信号量机制,采用多种同步算法实现不会发生死锁的哲学家进餐程序。二、实验平台:虚拟机:VMWare12操作系统:kalilinux编辑器:Gedit编译器:Gcc三、实验内容:(1)以哲学家进餐模型为依据,在Linux控制台环境下创建5个进程,用semget函数创建一个信号量集(5个信号量,初值为1),模拟哲学家的思考和进餐行为:每一位哲学家饥饿时,先拿起左手筷子,再拿起右手筷子;筷子是临界资源,为每一支筷子定义1个互斥信号量;想拿到筷子需要先对信号量做P操作,使用完释放筷子对信号量做V操作。伪代码描述:semaphorechopstick[5]={1,1,1,1,1};l第i位哲学家的活动可描述为:  do{printf("%disthinking\n",i);printf("%dishungry\n",i);wait(chopstick[i]);  //拿左筷子wait(chopstick[(i+1)%5]);  //拿右筷子printf("%diseating\n",i);     signal(chopstick[i]);  //放左筷子signal(chopstick[(i+1)%5]);  //放右筷子…}while[true];运行该组进程,观察进程是否能一直运行下去,若停滞则发生了什么现象?并分析原因。(2)解决哲学家进餐问题可采用如下方法:、右两只筷子均可用时,才允许他拿起筷子进餐;,最终能保证至少有一位哲学家能够进餐;,然后再拿起他右手的筷子,而偶数号哲学家则先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序中给出,请用方法b和c写出不会发生死锁的哲学家进餐程序。(3)设计程序,实现生产者/消费者进程(线程)的同步与互斥。在该程序中创建4个进程(或线程)模拟生产者和消费者,实现进程(线程)的同步与互斥。四、实验步骤:一、Linux的信号量机制为了简化对多个信号量的操作,Linux系统中提出了信号量集的概念。一个信号量集对象中可以容纳多个信号量,SystemV信号量的分配和操作是以信号量集为单位的。:;,则进程可以使用该资源;使用资源时,进程将该信号量减1(P操作);不再使用资源时,进程将该信号量值加1(V操作);,则进程进入睡眠状态P操作和V操作都原子操作。2. 创建或打开信号量集semget()系统调用创建一个新信号量集或获取一个既有信号量集的表示符。函数原型:#include<sys/>intsemget(key_tkey,intnsems,intflag);返回值:成功返回信号量集ID,出错返回-1。nsems信号量集中信号量个数;flags:IPC_CREAT,IPC_EXCL,权限组合;第一个参数key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量,它代表程序可能要使用的某个资源,程序对所有信号量的访问都是间接的,程序先通过调用semget函数并提供一个键,再由系统生成一个相应的信号标识符(semget函数的返回值),只有semget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。如果多个程序使用相同的key值,key将负责协调工作。第三个参数sem_flags是一组标志,当想要当信号量不存在时创建一个新的信号量,可以和值IPC_CREAT做按位或操作。设置了IPC_CREAT标志后,即使给出的键是一个已有信号量的键,也不会产生错误。而IPC_CREAT|IPC_EXCL则可以创建一个新的,唯一的信号量,如果信号量已存在,返回一个错误。注意:建立信号量集时每个信号量的初始值不确定。3. 信号量控制操作semctl()系统调用在一个信号量集或集合中的单个信号量上执行各种控制操作。函数原型:#include<sys/>intsemctl(intsemid,intsemnum,intcmd, …/*unionsemunarg*/)semnum:信号量编号或0,表示对指定信号量做控制操作;cmd:操作命令,实施的控制操作;cmd参数:IPC_STAT获取信号量集的属性IPC_SET设置信号量集的属性IPC_RMID删除信号量集GETVAL返回semnum信号量的值SETVAL设置semnum信号量的值GETALL获取所有信号量的值SETALL设置所有信号量的初始值 第四个参数是unionsemunu