logo资料库

操作系统中哲学家就餐问题和生产者消费者问题实验报告.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
实验题目: 在 BACI 并发程序设计系统 中实现哲学家就餐问题和生产 者/消费者问题 一、BACI 简介: BACI 提供了一个可以编写并发程序的环境,在这个平台上,我们可以很容易的模拟程序的 并发执行,在这种并行的编译环境中,可以把 BACI 中的一些语句嵌 入到 C++,C,Java 等高等程序中,使程序可以并行执行 . 基于 C++的 BACI 语法(C—BACI Compiler) 该语法结构是在 C++语法结构的基础上,增加一些并发语句扩展而来,一下是一些常 用的并发语句 1. cobegin 函数 在 BACI 系统中,并发进程与并发线程同步,多个进程可以并发的在 cobegin 块中来并 发执行,该函 数必须在主函数中,语法结构为: cobegin { proc1(...);proc2(...);. . . . procN(...); } 其中每个进程并发随机执行,每次执行的顺序可能会不一样,当所有的进程接受后, 该函数结束。 2. Semaphores/Binarysem 信号量的(Semaphores)机制可以 更方便的实现进程 同步,Semaphores 是一种 如 C 中”int”一样的 类 型,可以用来定义信号量类型的变量,Binarysem 是一种二进制信号量,它所定义 的变量只能取 1 或 0,用来表示互斥。 1).信号量的声明和初始化 semaphores a; binarysem s; 上面声明了两个信号量 a,b,其中 b 为二进制信号量信号量按如下方式初始化: 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,则该进 程阻塞,该函 数操作是原子性的. 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_number 二、BACI 开发过程: 1、开发环境: Ubuntu 10.04 2、开发工具: 采用带有 GUI 的 BACI 工具软件,下载地址: http://inside.mines.edu/fs_home/tcamp/baci/index.html 3、解压后的目录:
4、实验测试过程 (a)软件测试用例: 源代码:jqk.cm
测试结果: (b):生产者消费者问题(Bounded-Buffer) 在 BACI 系统中模拟生产者,消费者问题,用 PV 操作实现同步,与互斥 源代码(ex1.cm):
在终端进行编译: 运行 GUI
运行结果: (c):哲学家就餐问题(Dining-Philosophers) 源代码:ex2.cm
编译运行 GUI:
运行结果:
分享到:
收藏