Linux信号量机制编程设计说明书_第1页
Linux信号量机制编程设计说明书_第2页
Linux信号量机制编程设计说明书_第3页
Linux信号量机制编程设计说明书_第4页
Linux信号量机制编程设计说明书_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1 号量机制编程设计说明书 1 课程设计的目的及要求 程设计的目的 某寺庙中有小和尚、老和尚若干人。庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳 30 桶水,每次入水、取水仅为 1 桶,不可同时进行。水取自同一水井,水井路窄,每次只能容纳一个水桶取水,设水桶个数为 5 个。和尚挑水问题就是使用某种机制,能够使得若干名老和尚可以顺利地喝到水,若干名小和尚之间能够有条不紊地往水缸中入水。 本课程设计的目的是使用 信号量机制编程解决和尚挑水问题,通过本课程设计掌握 程 创建的方法,掌握信号量的使用方法。 程设计的要求 本课题所设计的系统要求实现以下功能。 编写 2 个程序,程序 1 创建 3 个子进程,分别编号 A、 B、C,用于模 拟 3 名老和尚;程序 2 创建 3 个子进程,分别编号 C、D、 E,用于模拟 3名小和尚。通过向屏幕输出语句模拟取水过程,如输出 “ 目前水缸水量为 10 桶 ” 表示目前水缸中有存水 10桶;输出 “ 小和尚取水成功 ” 表示从水井中成功取到 1 桶水;输出“ 小和尚倒 1 桶水到水缸中 ” 表示小和尚将 1 桶水倒入水缸 2 中。通过观察输出语句,可以发现执行 过程是否发成冲突。 使用 信号量机制,编写解决和尚挑水问题的代码。 要求给出编译所用到的 件。 2 准备工作 件及软件需要 译器 辑器 解信号量及信号量的系统调用函数: 号量定义 最简单的信号量是一个只有 0 与 1 两个值的变量,二值信号量。这是最为通常的形式。具有多个正数值的信号量被称之为通用信号量。在本章的其余部分,我们将会讨论二值信号量。 P 与 V 的定义出奇的简单。假定我们有一个信号量变量 个操作定义如下: P(如果 于 0,减小 果 0,挂起这个进程的执行。 V(如果有进程被挂起等待 其恢复执行。如果没有进行被挂起等待 加 信号量的另一个理解方式就是当临界区可用时信号量变量 临界区忙时信号量变量被 P(小,从而变为 3 当临界区再次可用时被 V(加。注意,简单的具有一个我们可以减小或是增加的通常变量并不足够,因为我们不能用 C, C+或是其他的编程语言来表述生成信号,进行原子测试来确定变量是否为 果是则将其变为 就是使得信号量操作特殊的地方。 信号量函数定义如下: # .); 事实上,为了获得我们特定操作所需要的 #义,我们需要在包含 件之前通常需要包含 件。而在某些情况下,这并不是必须的。 因为我们会依次了解每一个函数,记住,这些函数的设计是用于操作信号量值数组的,从而会使用其操作向比单个信号量所需要的操作更为复杂。 注意, 作用类似于一个文件名,因为他表示程序也许会使用或是合作所用的资源。相类似的,由 返回的并且为其他的共享内存函数所用的标识符与由 数所返回的十分相似,因为他被进程用来访问共享文件。而且与 文件类似,不同的进程会有不同的信号量标识符,尽管他们指向相同的信号量。 标识符的用法对于在这里所讨论的所有 序都是通用的,尽管每一个程序会使用独立的 标识符。 4 号量集得创建与打开 数创建一个新的信号量或是获得一个已存在的信号量键值。 调 用 原 型 : 第一个参数 一个用来允许不相关的进程访问相同信号量的整数值。所有的信号量是为不同的程序通过提供一个 间接访问的,对于每一个信号量系统生成一个信号量标识符。信号量键值只可以由 得,所有其他的信号量函数所用的信号量标识符都是由 返回的。 还有一个特殊的信号量 , 常为 0),其作用是创建一个只有创建进程可以访问的信号量。这通常并没有有用的目的,而幸运的是,因为在某些 统上,手册页将没有阻止其他的进程访问信号量作为一个 出。 数是所需要的信号量数目。这个值通常总是 1。 数 是一个标记集合,与 数的标记十分类似。低九位是信号的权限,其作用与文件权限类似。另外,这些标记可以与 行或操作来创建新的信号量。设置记并且指定一个已经存在的信号量键值并不是一个错误。如果不需要, 记只是被简单的忽略。我们可以使用 组合来保证我们可以获得一个新的,唯一的信号量。如果这个信号量已经存在,则会返回一个错误。 如果成功, 数会返回一个正数;这是用于其他信号量函数的标识符。如果失败,则会 返回 5 号量的操作 函数 来改变信号量的值: 调用原型: 第一个参数, 由 数所返回的信号量标识符。 第二个参数, 一个指向结构数组的指针,其中的每一个结构至少包含下列成员: 第一个成员, 信号量数目,通常为 0,除非我们正在使用一个信号量数组。 员是信号量的变化量值。(我们可以以任何量改变信号量值,而不只是 1)通常情况下中使用两个值, 我们的 P 操作,用来等待一个信号量变得可用,而 +1是我们的 V 操作,用来通知一个信号量可用。 最后一个成员, 常设置为 会使得操作系统跟踪当前进程对信号量所做的改变,而且如果进程终止而没有释放这个信号量,如果信号量为这个进程所占有,这个标记可以使得操作系统自 动释放这个信号量。将 置为一个好习惯,除非我们需要不同的行为。如果我们确实变我们需要一个不同的值而不是 致性是十分重要的,否则我们就会变得十分迷惑,当我们的进程退出时,内核是 6 否会尝试清理我们的信号量。 所用动作会同时作用,从而避免多个信号量的使用所引起的竞争条件。 号量的控制 数允许信号量信息的直接控制 调 用 原 型 : .); 第一个参数, 由 获得的信号量标识符。数是信号量数目。当我们使用信号量数组时会用到这个参数。通常,如果这是第一个且是唯一的一个信号量,这个值为 0。数是要执行的动作,而如果提供了额外的参数,则是据 X/范,这个参数至少包括下列参数: 许多版本的 通常为 定义了 管 X/认说我们必须定义我们自己的联合。 有多个不同的 可以用于 这里我们描述两个会经常用到的值。 这两个通常的 为: 于初始化信号量为一个已知的值。所需要的值作为联合 员来传递。在信号量第一次使用之前需要 7 设置信号量。 信号量不再需要时用于删除一个信号量标识。 数依据 数会返回不同的值。对于 果成功则会返回 0,否则会返回 8 3 需求分析 某寺庙中有小和尚、老和尚若干人。庙内有一水缸,由小和尚提水入缸 , 供老和尚饮用。水缸可容纳 30 桶水,每次入水、取水仅为 1 桶,不可同时进行。水取自同一水井,水井路窄,每次只能容纳一个水桶取水,设水桶个数为 5 个。和尚挑水问题就是使用某种机制,能够使得若干名老和尚可以顺利地喝到水,若干名小和尚之间能够有条不紊地往水缸中入水。 先创建一个程序,创建三个子进程 A、 B、 C 模拟三个老和尚,隔一段时间久从水缸中取水饮用;创建另外一个 程序,创建三个子进程 a、 b、 c 模拟三个小和尚,隔一段时间获得一个水桶并从水井中取水注入水缸中。如果水缸中没有水,老和尚就停止从水缸中取水,并等待小和尚加水;而当水缸中容量少于 30 桶,那么小和尚就向水缸中加水,直到水缸注满为止。如此循环不止。实现功能如下: ( 1)创建进程:手动创建 A、 B、 C、 a、 b、 c 六个进程,都在界面上完成;要求包括进程的名称(不能重复)、执行时间和申请资源的等待时间等。在同一时刻可能有多个进行在内存申请资源,即可以输入多个进程的资源申请。 ( 2)临界资源的管理,包括申请以及分配等,通过 信号量和信号量集实现。 ( 3)生产者消费者算法,判断是否可以进行资源的分配。 任务目标通过信号量实现多进程之间对共享资源的互斥和同步。 9 4 整体设计 要设计 系统 2 个模块:输入输出,进程对资源的随机申请及分配,通过信号量和信号量集机制及生产者消费者算法实现临界资源管理,避免死锁。 输入输出:包括系统运行所需要的进程的名称,执行时间,申请资源的等待时间,进程对资源的需要量等信息以及系统所要显示出的进程的创建信息,资源的分配信息,进行执行信息,进行动态申请资源信息等。 进程对资源的随机申请 及分配:根据所输入的进程、资源、以及进程对资源的最大申请情况,随机产生进程当前对资源的申请,输出相应的分配信息与进程执行信息并使用生产者消费者算法对进程的资源申请进行判断。 临界资源的管理:创建相应个数的进程,完成进程的并发执行,使用互斥信号量使各进程互斥的进入各自的临界区对资源进行申请,进程执行完毕后,互斥的对资源进行恢复。 避免死锁:对当前进程对资源的申请利用生产者消费者算法进行判断,看系统分配后是否处于安全状态,若处于安全状态,则将资源分配给进程,并输出分配信息,否则对不予以分配。 序流程图及运行结果 下图为 序的流程图 10 开始 调用 产生子进程 用 产生子进程用 产生子进程0? 0? 0? 出错返回 结束 循环调用 循环调用 N Y N Y Y N Y Y N Y Y Y N 见图 11 图 1 程序运行结果为下图: 调用 水缸中有没有水? 取 水 发出取水通知 等待 2s Y N 12 如上图当水缸没水的时候执行 序 13 此图为 序的流程图,下图为程序执行结果: 开始 0? 0? 0? 出错返回 结束 循环调用 循环调用 N Y Y Y Y Y 调用 水缸水量 30桶? 桶和井可同时取用? 取水入缸 水满 放弃已得到的桶或井 N Y N Y N Y 调用 创建 三个子程序 14 当水缸有水时,老和尚可以喝水: 15 实验结果 16 总 结 经过这次的课程设计,让我经历了一次有意义的过程,让我了解了团队合作的重要性,起初我们只是在不停的各干各的,发现根本不可能完成预期的任务,后来我们坐下来讨论了系统的功能,然后各司其职,发现效果真的不一样,虽然在这一周的时间里我们做了很多,中间也遇到了一些问题,比如说临界资源管理和算法模块怎样结合起来,起初是将两个交叉起来,可是效果不是很好,最后还是决定将它们分开,慢慢地其他问题也同样得到了解决,这就是团队合 作的力量,这个系统需要完善的内容还有很多,我们以后还会在一起讨论完善并改进,在此过程中,我也发现了编程是需要绝对的耐心与细心的,不然会造成一些难以修改的错误,导致整个程序进展出现问题。这对我们真的是一次很好的锻炼。 17 参考文献 1 华清远见嵌入式培训中心嵌入式 用程序开发第二版人民邮电出版社, 2 鸟哥 房菜基础学习篇第三版人民邮电出版社, 8 附 录 程序 # #0 _ ., v), 1, 0666| /s ; if(= 0) ) A); is to %n, if(0) 19 ; if(= 0) ) B); is to %n, if( 0) ; if(= 0) ) C); is to %n, if(= n); 47; n); 53; 20 n); 59; ); _ 0; ( 0, & ! ; Oh,c up n, 21 程序 # #0 _ ., v), 1, 0666| /s ; if(= 0) ) A); is to %n, if(0) 22 ; if(= 0) ) B); is to %n, if( 0) ; if(= 0) ) C); is to %n, if(= n); 47; n); 53; 23 n); 59; );

温馨提示

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

评论

0/150

提交评论