《操作系统-哲学家就餐问题生产者消费者问题.doc》由会员分享,可在线阅读,更多相关《操作系统-哲学家就餐问题生产者消费者问题.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验题目: 在BACI并发程序设计系统中实现哲学家就餐问题和生产者/消费者问题一、BACI简介:BACI提供了一个可以编写并发程序的环境,在这个平台上,我们可以很容易的模拟程序的并发执行,在这种并行的编译环境中,可以把BACI中的一些语句嵌 入到C+,C,Java等高等程序中,使程序可以并行执行 . 基于C+的BACI语法(CBACI Compiler) 该语法结构是在C+语法结构的基础上,增加一些并发语句扩展而来,一下是一些常用的并发语句 1. cobegin函数 在BACI系统中,并发进程与并发线程同步,多个进程可以并发的在cobegin 块中来并发执行,该函 数必须在主函数中,语法结构为
2、: cobegin proc1(.);proc2(.);. . . . procN(.); 其中每个进程并发随机执行,每次执行的顺序可能会不一样,当所有的进程接受后,该函数结束。 2. Semaphores/Binarysem 信号量的(Semaphores)机制可以更方便的实现进程同步,Semaphores是一种 如C中”int”一样的 类 型,可以用来定义信号量类型的变量,Binarysem是一种二进制信号量,它所定义的变量只能取1 或 0,用来表示互斥。 1).信号量的声明和初始化 semaphores a; binarysem s; 上面声明了两个信号量a,b,其中b为二进制信号量信号
3、量按如下方式初始化: Initialsem(semaphores , interger); Initialsem(binarysem , 0/1); 2)P(wait)/V(signal)函数 强大的PV操作与信号量一次很方便的解决了并发进程同步与互斥问题 函数原型: void p(semaphores &s); or void wait(semaphores &s); void v(semaphores &s); or void signal(semaphores &s); 函数说明: p(sem): 如果sem 0,则sem减1,调用P的进程可以继续执行,如果sem=0,则该进程阻塞,该函
4、 数操作是原子性的. v(sem): 如果v=0,或有进程阻塞,则将其唤醒,如果没有进程等待,将sem加1,在任何时候调用 v的进程可以继续执行,其操作也是原子的. 3.atomic atomic关键字定义了原子操作,即该函数操作不可剥夺,每次只能一个进程访问 用法:在要原子执行的函数前加atomic即可,如: atomic int sum() . . . . 则sum()函数就可以原子操作了 4.void suspend(void) suspend函数将调用的线程挂起 5.void revive (int process_number) 该函数用于唤醒某个进程,其进程号为process_nu
5、mber二、BACI开发过程:1、开发环境:Ubuntu 10.042、开发工具:采用带有GUI的BACI工具软件,下载地址:http:/inside.mines.edu/fs_home/tcamp/baci/index.html3、解压后的目录:4、实验测试过程(a)软件测试用例:源代码:jqk.cm测试结果: (b):生产者消费者问题(Bounded-Buffer)在BACI系统中模拟生产者,消费者问题,用PV操作实现同步,与互斥源代码(ex1.cm):在终端进行编译:运行GUI运行结果:(c):哲学家就餐问题(Dining-Philosophers)源代码:ex2.cm编译运行GUI:运行结果:三、实验总结在本次实验过程中,选定题目后便在网上搜索资料,最终选定了较为简单的BACI测试工具,然后简单学习了一下BACI的语法规则和一些常用的函数,进而编写代码测试实验。同时在实验中又复习了经典的同步算法,以及用信号量和PV操作来实现同步的具体方法。