操作系统 实验指导书综述.docx

上传人:b****1 文档编号:800815 上传时间:2022-10-13 格式:DOCX 页数:38 大小:41.90KB
下载 相关 举报
操作系统 实验指导书综述.docx_第1页
第1页 / 共38页
操作系统 实验指导书综述.docx_第2页
第2页 / 共38页
操作系统 实验指导书综述.docx_第3页
第3页 / 共38页
操作系统 实验指导书综述.docx_第4页
第4页 / 共38页
操作系统 实验指导书综述.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

操作系统 实验指导书综述.docx

《操作系统 实验指导书综述.docx》由会员分享,可在线阅读,更多相关《操作系统 实验指导书综述.docx(38页珍藏版)》请在冰豆网上搜索。

操作系统 实验指导书综述.docx

操作系统实验指导书综述

 

《操作系统》课程实验

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

【实验目的】

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

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

【条件要求】

1)认真阅读和掌握预备知识。

2)上机操作。

【预备知识】

一、BACI简介

并行和同步是计算机科学中的重要课题。

由于对并行和分布式计算的日益重视,理解并行和同步变得愈发重要。

为了获得对于这些概念的感性认识,编写并行程序的实践经验将是必不可少的。

BACI是帮助学生获得需要的“第一手”并行程序设计经验的选项之一。

BACI是Ben-AriConcurrentInterpreter(Ben-Ari并行解释器)的缩写。

编译器和解释器最初由M.Ben-Ari设计完成,主要基于NiklausWirth的Pascal编译器。

最初版本的BACI编译器和解释器基于这些代码,并运行于一个PRIME大型机。

经过大量的修改和扩充,目前版本已经移植到了PC上,支持的语言包括TurboPascal,SunPascal以及C。

此外,编译器和解释器被分成了两个独立的程序。

后来,BACI中还加入了C--编译器,这是一个有限的C++子集,它可以编译C--程序为解释器能够解释的中间代码(PCODEobjectcode)。

与其他并行语言相比,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(semaphores,integer_expression):

能够初始化BACI中两种信号量s的唯一的函数。

●p(semaphores)和wait(semaphores):

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

●v(semaphores)和signal(semaphores):

如果semaphore=0并且存在等待它的进程,则将随机地唤醒一个,并且semaphore递增1。

无论如何v的调用者将继续。

3.monitors

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

在BACI中,monitor只能在全局域中定义,并且不能嵌套。

任意时刻只能有一个monitor块中的过程或函数被执行。

这一特性使得能够使用monitor来实现互斥。

有三个可以被过程或函数使用的monitor机制:

condition变量,waitc(条件等待)以及signalc(条件信号)。

●condition变量:

只能被monitor的函数访问。

这种变量不能有实际的值,它是进行P操作或V操作的标志。

●voidwaitc(conditioncond,intprio):

monitor进程将被阻塞,并赋予指定的优先级(prio)以备重新唤醒。

这个阻塞动作允许就绪的其他进程继续执行。

●voidwaitc(conditioncond):

与waitc调用语义相同,但这一P操作将被赋予优先级10。

●voidsignalc(conditioncond):

如果存在的话,唤醒等待cond的优先级最高的进程。

●voidempty(conditioncond):

当没有等待cond的进程时返回“1”,反之返回“0”。

4.其他并行结构

●atomic(原子的)关键字:

如果某个函数被定义为“atomic”,则函数将是不可剥夺的。

解释器将不会在进程切换时中断atomic函数。

●voidsuspend(void):

将调用进程置为休眠状态。

●voidrevive(intprocess_id):

激活给定id的进程。

●intwhich_proc(void):

返回当前进程的线程数。

●intrandom(intrange):

返回0到“range-1”之间,包括端点的伪随机数。

四、怎样使用BACI

BACIC--编译器源文件的扩展名必须是“.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”,进入该目录。

#cdbalnxxe

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

#viexam8a.cm

其内容如下:

voidfunc1()

{

cout<<"**************"<

cout<<"AAAAAAAAAAAAAA"<

cout<<"BBBBBBBBBBBBBB"<

}

voidfunc2()

{

cout<<"$$$$$$$$$$$$$$"<

cout<<"CCCCCCCCCCCCCC"<

cout<<"DDDDDDDDDDDDDD"<

}

main()

{

cobegin{func1();func2();}

}

3)保存退出“exam8a.cm”。

4)在Linux下编译“exam8a.cm”。

#./baccexam8a.cm

5)解释执行“exam8a.pco”。

#./bainterpexam8a.pco

记录执行结果。

6)再次解释执行“exam8a.pco”。

#./bainterpexam8a.pco

比较这次结果与上次结果有何不同,试说明原因。

7)使用Vi编辑一个新文件“exam8b.cm”。

#viexam8b.cm

其内容如下:

intx=0;

inty=0;

voidfunc1()

{

x=4;

cout<

y=y+x;

}

voidfunc2()

{

y=3;

cout<

x=x+2;

}

main()

{

cobegin{func1();func2();}

cout<<"x=="<

}

8)保存退出“exam8b.cm”。

9)在Linux下编译“exam8b.cm”。

#./baccexam8b.cm

10)解释执行“exam8b.pco”。

#./bainterpexam8b.pco

记录执行结果。

11)再次解释执行“exam8b.pco”。

#./bainterpexam8b.pco

比较这次结果与上次结果有何不同,试说明原因。

并解释每种结果的语句执行次序。

12)使用Vi编辑一个新文件“exam8c.cm”。

#viexam8c.cm

其内容如下:

intx=0;

voidfunc1()

{

inti=0;

for(i=0;i<50;i=i+1)

{x=x+1;}

}

voidfunc2()

{

inti=0;

for(i=0;i<50;i=i+1)

{x=x+1;}

}

main()

{

cobegin{func1();func2();}

cout<<"x=="<

}

13)保存退出“exam8c.cm”。

14)在Linux下编译“exam8c.cm”。

#./baccexam8c.cm

15)解释执行exam8c.pco

./bainterpexam8c.pco

记录执行结果。

看看x的结果是否等于100。

试说明原因。

16)使用Vi编辑一个新文件“exam8d.cm”。

#viexam8d.cm

其内容如下:

intx=0;

intturn=0;

voidfunc1()

{

inti=0;

for(i=0;i<50;i=i+1)

{

while(turn!

=0);

x=x+1;/*临界区*/

turn=1;

}

}

voidfunc2()

{

inti=0;

for(i=0;i<50;i=i+1)

{

while(turn!

=1);

x=x+1;/*临界区*/

turn=0;

}

}

main()

{

cobegin{func1();func2();}

cout<<"x=="<

}

17)保存退出“exam8d.cm”。

18)在Linux下编译“exam8d.cm”。

#./baccexam8d.cm

19)解释执行“exam8d.pco”。

#./bainterpexam8d.pco

记录执行结果。

看看x的结果是否等于100。

试说明原因。

20)使用Vi编辑一个新文件“exam8e.cm”。

#viexam8e.cm

其内容如下:

intx=0;

semaphores;

voidfunc1()

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1