操作系统 实验指导书

2020-06-05 08:54

《操作系统》课程实验

目 录

实验1 BACI环境下进程的并发执行 ....................................................................................... 3 实验2 BACI环境下解决死锁问题 ........................................................................................... 11 实验3 μC/OS-II操作系统的进程调度模块源码分析 ........................................................... 16 实验4 μC/OS-II操作系统的动态内存管理 ........................................................................... 18 实验5 磁盘调度算法模拟实验 ................................................................................................. 21 附1: 创建进程(开设Linux基础课程班级选作) ............................................................. 26 附2: 线程的创建及线程间互斥的实现(开设Linux基础课程班级选作) ..................... 34

实验1 BACI环境下进程的并发执行

【实验目的】

1)了解BACI并发运行环境。

2)使用BACI设计并发程序,深入理解并发概念。

【条件要求】

1)认真阅读和掌握预备知识。 2)上机操作。

【预备知识】 一、BACI简介

并行和同步是计算机科学中的重要课题。由于对并行和分布式计算的日益重视,理解并行和同步变得愈发重要。为了获得对于这些概念的感性认识,编写并行程序的实践经验将是必不可少的。BACI是帮助学生获得需要的“第一手”并行程序设计经验的选项之一。

BACI是Ben-Ari Concurrent Interpreter(Ben-Ari并行解释器)的缩写。编译器和解释器最初由M. Ben-Ari设计完成,主要基于Niklaus Wirth的Pascal编译器。最初版本的BACI编译器和解释器基于这些代码,并运行于一个PRIME大型机。经过大量的修改和扩充,目前版本已经移植到了PC上,支持的语言包括Turbo Pascal, Sun Pascal以及C。此外,编译器和解释器被分成了两个独立的程序。后来,BACI中还加入了C--编译器,这是一个有限的C++子集,它可以编译C--程序为解释器能够解释的中间代码(PCODE object code)。

与其他并行语言相比,BACI在学生熟悉的语法框架内提供了多种并行技术,所有具有C或Pascal程序设计经验的学生都可以在几小时内掌握BACI的使用,BACI已经被成功地运用于很多大学的课堂教学。

二、C--编译器语法

BACI的C--是C++的一个子集。换言之,C--符合C++语法,此外,它包括一些限制和新的数据类型,例如:

1)除了标准输入输出(cout,cin,endl)之外不支持其他文件操作。

2)C-- BACI只支持简单的C/C++类型:int和char。简单类型的常量修饰符(const)也被支持,所有的变量必须在代码块的开头定义。

3)支持字符串类型(string)。BACI同时包括内建的字符串处理函数,例如stringCopy, stringCompare, stringConcat等等。

4)支持简单类型和字符串数组,数组定义遵循常见的C语法。

5)支持过程和函数,采用标准的作用域规则,参数定义可以使用传值和传递引用的方

式,执行开始于对“main()”的调用。

6)过程控制语句包括if-else,switch/case,for,while,do-while,break和continue,这些语句的句法和标准的C/C++相同。

三、并行结构

1.cobegin

cobegin块包括一组并发执行的进程列表,这样的块不允许嵌套,而且只能出现在主程序中。列表中的PCODE语句将被解释器以任意、随机的顺序执行,于是多次执行包括cobegin块的相同程序的结果将呈现不可预测性。主程序将挂起,直到cobegin块终结,此时主程序将恢复执行紧随块后的下一条语句。下面是一个例子: cobegin {

proc1( ... ); proc2( ... ); ... ; procN( ... ); }

2.semaphore

semaphore是一个BACI预定义类型,它是一个非负的整数变量,并且只能通过受限的方式访问。BACI也提供了一个它的子类型——binarysem,这是一个二元信号量,它的值只能是0或1。信号量函数包括:

● initialsem ( semaphore s, integer_expression ):能够初始化BACI中两种信号量s的唯一的函数。

● p(semaphore s)和wait(semaphore s ):如果semaphore > 0,则递减1并返回,从而调用者能够继续运行;如果semaphore = 0,则递减1,p的调用者将休眠。

● v(semaphore s)和signal(semaphore s):如果semaphore=0并且存在等待它的进程,则将随机地唤醒一个,并且semaphore递增1。无论如何v的调用者将继续。 3.monitors

BACI也支持有限的Hoare monitor概念,monitor是包括附加属性的C--块,所有monitor变量中的函数都对外可见,但monitor变量不可以在块外访问,而只能由monitor函数访问。

在BACI中,monitor只能在全局域中定义,并且不能嵌套。任意时刻只能有一个monitor块中的过程或函数被执行。这一特性使得能够使用monitor来实现互斥。

有三个可以被过程或函数使用的monitor机制:condition变量,waitc(条件等待)以及signalc(条件信号)。

● condition变量:只能被monitor的函数访问。这种变量不能有实际的值,它是进行P操作或V操作的标志。

● void waitc(condition cond, int prio):monitor进程将被阻塞,并赋予指定的优先级(prio)

以备重新唤醒。这个阻塞动作允许就绪的其他进程继续执行。

● void waitc(condition cond):与waitc调用语义相同,但这一P操作将被赋予优先级10。

● void signalc(condition cond):如果存在的话,唤醒等待cond的优先级最高的进程。 ● void empty(condition cond):当没有等待cond的进程时返回“1”,反之返回“0”。 4.其他并行结构

● atomic(原子的)关键字:如果某个函数被定义为“atomic”,则函数将是不可剥夺的。解释器将不会在进程切换时中断atomic函数。

● void suspend(void):将调用进程置为休眠状态。 ● void revive(int process_id):激活给定id的进程。 ● int which_proc( void ):返回当前进程的线程数。

● int random(int range):返回0到“range-1”之间,包括端点的伪随机数。

四、怎样使用BACI

BACI C--编译器源文件的扩展名必须是“.cm”,在BACI中运行程序的步骤是: 1)编译“.cm”文件以获得PCODE文件(.pco)。命令格式为:

bacc [参数] 源文件名 常见的参数包括: ● –h:显示帮助信息。

● –c:产生“.pob”目标文件,以便进行后续的连接操作。 2)使用解释器解释执行PCODE(.pco)文件。命令格式为:

bainterp [参数] PCODE文件名 常见的参数包括:

● –d:调试模式,单步执行,可以设置断点。 ● –e:在每一进程项旁边显示活动记录(AR)。 ● –x:每一进程退出时显示AR。 ● –t:通知进程结束。 ● –h:显示帮助信息。

● –p:执行时显示PCODE指令。

【实验内容】

1)设包含可执行文件bacc,bainterp的目录名为“balnxxe”,进入该目录。 #cd balnxxe

2)使用Vi编辑一个新文件“exam8a.cm”。 #vi exam8a.cm

其内容如下:


操作系统 实验指导书.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Unity中文手册 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: