计算机操作系统实验讲义_第1页
计算机操作系统实验讲义_第2页
计算机操作系统实验讲义_第3页
计算机操作系统实验讲义_第4页
计算机操作系统实验讲义_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

《计算机操作系统》实验指导书

曲阜师范大学计算机科学学院

课程内容简介

操作系统是计算机教学中最重要的环节之一,也是计算机专业学生的一门重

要的专业课程。操作系统质量的好坏,直接影响整个计算机系统的性能和用户对

计算机的使用。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分

发挥系统中各种设备的使用效率,提高系统工作的可靠性。由于操作系统涉及计

算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。要学好

这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。培养计算机

专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过

操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、

合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地

掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设

计、构造和开发现代操作系统的基本能力。

本实验指导书通过操作系统编程接口,提供一些编程指导,以此加深学生对

操作系统工作原理的领会和对操作系统实现方法的理解,并且使学生在操作系统

层面的程序设计得到基本的训练。

本书提供了操作系统的安装与使用、生产者和消费者的问题、银行家调度算

法、操作系统内存结构、简单文件系统的实现以及操作系统构成实验等6个实验。

本书的使用对象是曲阜师范大学计算机科学与技术专业(本科)的学生。

实验一操作系统的安装与使用

1.实验目的

(1)巩固课程中讲授的WINDOWSXP的使用知识,提高学生的WINDOWS

XP或WINDOWSSEVER2003等操作系统的实战演练水平。

(2)熟悉WindowsXP等操作系统系统的定制安装过程,明确各安装部件的

作用。要求学生掌握图形用户接口元素和图形用户接口元素的基本操作;熟悉控

制面板中各组件的作用及设置;能够了解Windows系统对各种软件资源和硬件

资源管理的策略。

(3)结合教材绪论,让学生对WINDOWS系统进程管理、处理机的调度与

死锁、存储器管理、设备管理、文件管理以及系统接口有一个感性的认识并熟悉

相关操作。

2.实验预备知识

(1)阅读教材第一章(操作系统引论),熟悉操作系统的目标、作用和层次;

了解操作系统的发展过程;熟悉操作系统实现的功能(存储器管理功能、处理机

管理功能、设备管理功能、文件管理功能以及用户接口);了解操作系统的发展

的历史和未来的发展趋势。

(2)完成一本WINDOWS操作系统技术书籍的阅读(根据个人情况任选)。

(3)学习微软认证(MCSE)中有关WINDOWS2003操作系统的知识(通

过课堂补充教授、阅读有关书籍或网上资料)。

3.实验环境

(1)PC计算机;

(2)WINDOWSXP或WINDOWSSEVER2003等操作系统的安装盘。

4.实验时间:2个机时。

5.实验内容

(1)了解安装WINDOWSXP和WINDOWSSEVER2003的硬件需求;

熟悉安装过程。熟悉安装过程中各种组件的选择;设置操作系统双重启动;

熟悉各种物理设备驱动程序的安装。

(2)熟悉WINDOWSXP的用户界面。重点掌握各类操作系统的各类用户

接口;掌握资源管理器的使用。

(3)掌握对操作系统的配置和维护,掌握控制面板的使用。掌握安装和删

除硬件设备的方法,熟练对打印机、鼠标、键盘、网卡、显示卡、声卡等硬件设

备进行配置。

(4)了解网络的配置和网络协议的原理和设置,熟练对计算机进行网络设

置。

(5)熟练掌握WINDOWSXP的管理工具。利用“计算机管理”选项对计

算机进行设置。“计算机管理工具”为用户提供六种系统工具:“事件查看器”,

“系统信息”、“性能日志和警报”,“共享文件夹”、设备管理器“和”本地用户

和组。

(6)了解WINDOWSXP活动目录。目录是一个存储对象信息的分层结构,

要求学生掌握配置活动目录的方法。

(7)掌握WINDOWSXP的存储管理。要求学生掌握以下内容:WINDOWS

XP的基本存储和动态存储;智能镜像、存储工具、视图的设置和硬盘转换、动

态磁盘中的卷以及相关卷的操作、磁盘碎片整理程序。

(8)熟悉用WINDOWS任务管理器来观察计算机的应用程序列表、进程列

表以及系统的处理机使用情况、内存分配和使用情况、句柄数、线程数等等。

6.思考

WINDOWS操作系统中如何实现了处理机管理、内存管理、设备管理、文件

管理和磁盘管理?如何操作?

有条件的同学可参阅有关UNIX、LINUX或MINIX书籍和上机实践,思考

和了解在UNIX、LINUX或MINIX操作系统中是如何实现了处理机管理、内存

管理、设备管理、文件管理和磁盘管理?

实验二EOS实验环境的使用

实验性质:验证

建议学时:2学时

一、实验目的

•熟悉操作系统集成实验环境OSLab的基本使用方法。

•练习编译、调试EOS操作系统内核以及EOS应用程序。

二、预备知识

阅读《EOS实验指南》第章,对EOS操作系统和集成实验环境有一个初步的了解。

三、实验内容

3.1启动OSLab

1.在安装有OSLab的主机上,可以使用两种不同的方法来启动OSLab:

•在桌面上双击“TevationOSLab”图标。

•点击“开始”菜单,在“程序”中的“TevationOSLabw中选择“Tevation

OSLab”。

2.OSLab每次启动后都会首先弹出一个用于注册用户信息的对话框(可以选择对话

框标题栏上的“帮助”按钮获得关于此对话框的帮助信息)。在此对话框中填入学

号和姓名后,点击“确定”按钮完成本次注册。

3.观察OSLab主窗口的布局。OSLab主要由下面的若干元素组成:菜单栏、工具栏

以及停靠在左侧和底部的各种工具窗口,余下的区域用来放置编辑器窗口。

3.2学习OSLab的基本使用方法

通过练习使用OSLab编写一个Windows控制台应用程序,熟悉OSLab的基本使用方法

(主要包括新建项目、生成项目、调试项目等)。

3.2.1新建Windows控制台应用程序项目

新建一个Windows控制台应用程序项目的步骤如下:

1.在“文件”菜单中选择“新建”,然后单击“项目”。

2.在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。

3.在“名称”中输入新项目使用的文件夹名称“oslab”。

4.在“位置”中输入新项目保存在磁盘上的位置“C:\Test”。

5.点击“确定”按钮。

新建完毕后,OSLab会自动打开这个新建的项目。在“项目管理器”窗口中,树的根

节点表示项目,可以看到项目的名称是“console”,各个子节点是项目包含的文件夹或者

文件。此项目的源代码主要包含一个头文件“console/”和一个C语言源文件

Kconsole,c”,如图1,

使用Windows资源管理器打开磁盘上的"C:\test\oslab”文件夹查看项目中包含的文

件(提示,在“项目管理器”窗口的项目节点上点击右键,然后在弹出的快捷菜单中选择“打

开所在的文件夹”即可)。

项目管理器

console项目节点

gu头文件文件夹节点

_h]console,h文件节点

日D源文件

©console,c

图1:打开Windows控制台应用程序项目后的“项目管理器”窗口

3.2.2生成项目

使用“生成项目”功能可以将程序的源代码编译为可执行的二进制文件,方法十分简

单:在“生成”菜单中选择“生成项目”。

在项目的生成过程中,“输出”窗口会实时显示生成的进度和结果。如果源代码中不

包含语法错误,会在最后提示生成成功,如图2:

输出

生成,,,款〔三

已启动生成:项目:console,配置:Debug

正在编译...

console,c

正在链接...

console-统计到0个错误,0个警告

====================生成:成功====================

图2:成功生成Windows控制台应用程序项目后的“输出”窗口

如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件

的路径,错误在文件中的位置,以及错误原因),并在最后提示生成失败。此时在“输出”

窗口中双击错误信息所在的行,OSLab会使用源代码编辑器打开错误所在的文件,并自动

定位到错误对应的代码行。可以在源代码中故意输入一些错误的代码(例如删除一个代码行

结尾的分号),然后再次生成项目,练习在“输出”窗口中双击错误信息来定位存在错误的

代码行,将代码修改正确后再生成项目。

生成过程是将每个源代码文件(.c、.cpp、.asm等文件)编译为一个对象文件(.。文

件),然后再将多个对象文件链接为一个目标文件(.exe、.dll等文件)。成功生成Windows

控制台应用程序项目后,默认会在"C:\test\oslab\debug”目录下生成一个名称为

“console.。”的对象文件和名称为wconsole.exew的Windows控制台应用程序,可以使

用Windows资源管理器查看这些文件。

3.2.3执行项目

在OSLab中选择“调试”菜单中的“开始执行(不调试)”,可以执行此控制台应用程

序.启动执行后会弹出一个Windows控制台窗口,显示控制台应用程序输出的内容。按任意

健即可关闭此控制台窗口。

3.2.4调试项目

OSLab提供的调试器是一个功能强大的工具,使用此调试器可以观察程序的运行时行

为并确定逻辑错误的位置,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中

的变量,查看寄存器,以及查看从源代码创建的指令。为了顺利进行后面的各项实验,应该

学会灵活使用这些调试功能。

在练习各种调试功能之前,需要对例子程序进行必要的修改,步骤如下:

1.右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选

择“添加”中的“添加新文件”。

2.在弹出的“添加新文件”对话框中选择“C源文件”模板。

3.在“名称”中输入文件名称“func”。

4.点击“添加”按钮添加并自动打开文件func.c,此时的“项目管理器”窗口如图3:

项目管理器

曰console

$&头文件

h]console,h

白O源文件

•…回console,c

L向func.c

图3:添加func.c文件后的“项目管理器”窗口

5.在func.c文件中添加函数:

intFunc(intn)

n=n+1;

returnn;

6.点击源代码编辑器上方的console,c标签,切换到console,c文件。将main函数

修改为:

intmain(intargc,char*argv[])

intFunc(intn);//声明Func函数

intn=0;

n=Func(10);

printf("HelloWorld!\n");

return0;

|

代码修改完毕后按F7(“生成项目”功能的快捷键)。注意查看“输出”窗口中的内容,

如果代码中存在语法错误,就根据错误信息进行修改,直到成功生成项目。

3.2.4.1使用断点中断执行

1.在main函数中定义变量n的代码行

intn=0;

上点击鼠标右键,在弹出的快捷菜单中选择“插入/删除断点”,会在此行左侧的

空白处显示了一个红色圆点,表示已经成功在此行代码处添加了一个断点,如图4:

intFunc(intn);//声明Func函数

intn=0;

n=Func(10);

printf("HelioWorld!\n");

图4:在console,c文件的main函数中添加断点后的代码行

2.在“调试”菜单中选择“启动调试",Windows控制台应用程序开始执行,随后

OSLab窗口被自动激活,并且在刚刚添加断点的代码行左侧空白中显示了一个黄

色箭头,表示程序已经在此行代码处中断执行(也就是说下一个要执行的就是此

行代码),如图5:

intFunc(intn);//声明Func函数

intn=0;

n=Func(10);

printf("HelioWorld!\n");

图5:Windows控制台应用程序启动调试后在断点处中断执行

3.激活Windows控制台应用程序的窗口,可以看到窗口中没有输出任何内容,因为

printf函数还没有被执行。

3.2.4.2单步调试

按照下面的步骤练习使用“逐过程”功能:

1.在OSLab的“调试”菜单中选择“逐过程”,“逐过程”功能会执行黄色箭头当

前指向的代码行,并将黄色箭头指向下•个要执行的代码行。

2.按F10(“逐过程”功能的快捷键),黄色箭头就指向了调用printf函数的代码行。

查看控制台应用程序窗口,仍然没有任何输出。

3.再次按F10执行printf函数,查看控制台应用程序窗口,可以看到已经打印出了

内容。

4.仔细体会“逐过程”调试功能后,在“调试”菜单中选择“停止调试”,结束此

次调试。

按照下面的步骤练习使用“逐语句”功能和“跳出”功能:

1.按F5(“启动调试”功能的快捷键),仍然会在之前设置的断点处中断。

2.按F10逐过程调试,此时黄色箭头指向了调用函数Func的代码行。

3.在“调试”菜单中选择“逐语句”,可以发现黄色箭头指向了函数Func中,说明

“逐语句”功能可以进入函数来调试函数中的语句。

4.选择“调试”菜单中的“跳出”,会跳出Func函数,返回到上级函数中继续调试

(此时Func函数已经执行完毕)。

5.按SHIFT+F5(“停止调试”功能的快捷键),结束此次调试。

自己练习使用“逐过程”、“逐语句”和“跳出”功能,注意体会“逐过程”和“逐语

句”的不同。

3.2.4.3查看变量的值

在调试的过程中,OSLab提供了三种查看变量值的方法,按照下面的步骤练习这些方

法:

1.按F5启动调试,仍然会在之前设置的断点处中断。

2.将鼠标移动到源代码编辑器中变量n的名称上,此时会弹出一个窗口显示出变量n

当前的值(由于此时还没有给变量n赋值,所以是一个随机值)。

3.在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“快

速监视”,可以使用“快速监视”对话框查看变量n的值。点击“关闭”按钮关

闭“快速监视”对话框。

4.在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“添

加监视”,变量n就被添加到了“监视”窗口中。使用“监视”窗口可以随时查

看变量的值和类型。此时按F10进行一次单步调试,可以看到“监视”窗口中变

量n的值会变为0,如图6:

监视

名称值类型

n0x0int

图6:使用“监视”窗口查看变量的值和类型

如果需要使用十进制查看变量的值,可以点击工具栏上的“十六进制”按钮,从而在

十六进制和十进制间切换。自己练习使用不同的进制和不同的方法来查看变量的值,然后结

束此次调试。

3.2.4.4调用堆栈

使用“调用堆栈”窗口可以在调试的过程中查看当前堆栈上的函数,帮助理解函数的

调用层次和调用过程。按照下面的步骤练习使用“调用堆栈”窗口:

1.按F5启动调试,仍然会在之前设置的断点处中断。

2.选择“调试”菜单“窗口”中的“调用堆栈”,激活“调用堆栈”窗口。可以看

到当前“调用堆栈”窗口中只有一个main函数(包括参数值和函数地址)。

3.按FH(“逐语句”功能的快捷键)调试进入Func函数,查看“调用堆栈”窗口可

以发现在堆栈上有两个函数Func和main,其中当前正在调试的Func函数在栈顶

位置,main函数在栈底位置。说明是在main函数中调用了Func函数。

4.在“调用堆栈”窗口中双击main函数所在的行,会有一个绿色箭头指向main函

数所在的行,表示此函数是当前调用堆栈中的活动函数。同时会将main函数所在

的源代码文件打开,并也使用一个绿色箭头指向Func函数返回后的位置。

5.在“调用堆栈”窗口中双击Func函数所在的行,可以重新激活此堆栈帧,并显示

对应的源代码。

6.反复双击“调用堆栈”窗口中Func函数和main函数所在的行,查看“监视”窗

口中变量n的值,可以看到在不同的堆栈帧被激活时,OSLab调试器会自动更新

“监视”窗口中的数据,显示出对应于当前活动堆栈帧的信息。

7.结束此次调试。

3.3EOS内核项目的生成和调试

之前练习了对Windows控制台应用程序项目的各项操作,对EOS内核项目的各项操作

(包括新建、生成和各种调试功能等)与对Windows控制台项目的操作是完全一致的。所以,

接下来实验内容的重点不再是各种操作的具体步骤,而应将注意力放在对EOS内核项目的理

解上。

3.3.1新建EOS内核项目

新建一个EOS内核项目的步骤如下:

1.在“文件”菜单中选择“新建”,然后单击“项目”。

2.在“新建项目”对话框中,选择项目模板“EOSKernel”»

3.在“名称”中输入新项目使用的文件夹名称“eos”。

4.在“位置”中输入新项目保存在磁盘上的位置“C:\”。

5.点击“确定”按钮。

此项目就是一个EOS操作系统内核项目,包含了EOS操作系统内核的所有源代码文件。

在“项目管理器”窗口中查看EOS内核项目包含的文件夹和源代码文件,可以看到不同

的文件夹包含了EOS操作系统不同模块的源代码文件,例如“mm”文件夹中包含了内存管理

模块的源代码文件,“boot”文件夹中包含了软盘引导扇区程序和加载程序的源代码文件。

也可以使用Windows资源管理器打开项目所在的文件夹C:\eos,查看所有源代码文件。

3.3.2生成项目

1.按F7生成项目,同时查看“输出”窗口中的内容,确认生成成功。

2.打开C:\eos\debug文件夹,查看生成的对象文件和目标文件。找到boot.bin、

loader,bin和kernel,dll三个二进制文件,这三个文件就是EOS操作系统在运行

时需要的可执行文件。OSLab每次启动运行EOS操作系统之前,都会将这三个文

件写入个软盘镜像文件中,然后让虚拟机运行这个软盘镜像中的EOS(相当于将

写有这三个二进制文件的软盘放入一个物理机的软盘驱动器中,然后按下开机按

钮)。找到libkernel.a文件,此文件是EOS内核文件kernel,dll对应的导入库

文件。

3.3.3调试项目

1.在“项目管理器”窗口的ke文件夹中找到start.c文件节点,双击此文件节点使

用源代码编辑器打开start.c文件。

2.在start.c文件中KiSystemStartup函数的"KilnitializePicO;”语句所在行

(第61行)添加一个断点,如图7:

60//

。61KilnitializePic();

62KilnitializePit();

图7:在EOS内核项目的ke/start.c文件的第61行添加一个断点

3.按F5启动调试,虚拟机开始运行软盘镜像中的EOS。在虚拟机窗口中可以看到EOS

启动的过程。随后EOS会在刚刚添加的断点处中断执行。激活虚拟机窗口可以看

到EOS也不再继续运行了。各种调试功能(包括单步调试、查看变量的值和各个

调试工具窗口)的使用方法与调试Windows控制台程序完全相同,可以自己练习。

4.按F5继续执行。查看虚拟机窗口,显示EOS操作系统已经启动,并且EOS的控制

台程序已经开始运行了。

5.在“调试”菜单中选择“停止调试”,结束此次调试。

3.3.4查看软盘镜像文件中的内容

在''项目管理器“窗口中双击软盘镜像文件Floppy,img,就会使用FloppyImageEditor

工具打开此文件(在FloppyImageEditor工具中按Fl可以查看此工具的帮助文件)。在

FloppylmageEditor工具的文件列表中可以找到loader,bin文件和kernel,dll文件,这两

个文件都是在启动调试时被写入软盘镜像文件的(可以查看这两个文件的修改日期)。

boot.bin文件在启动调试时被写入了软盘镜像的引导扇区中,不受软盘文件系统的管理,

所以在文件列表中找不到此文件。关闭FloppylmageEditor工具。

3.3.5查看EOSSDK(SoftwareDevelopmentKit)文件夹

1.点击OSLab工具栏上的“项目配置”下拉列表,选择下拉列表中的“Release”项

目配置,“Release”项目配置被设置为新的活动项目配置(原来的活动项目配置

是“Debug")。如图8:

,»〔Debug漕WRITE_PORT_UCHAR内国

[Debug

:事事:二2」GQ制》Q£幽Release

图8:使用工具栏上的“项目配置”下拉列表切换活动项目配置

2.按F7使用Release配置生成项目。

3.生成完毕后,使用Windows资源管理器打开C:\eos文件夹,可以发现在文件夹中

多出了一个SDK文件夹,此文件夹就是在生成EOSKernel项目的同时自动生成的。

4.SDK文件夹中提供了开发EOS应用程序需要的所有文件。打开SDK文件夹中的bin

文件夹,可以看到有两个名称分别为debug和release的文件夹。debug文件夹是

在使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。

release文件夹是在使用release配置生成项目时生成的,其中存放了发布版本的

EOS二进制文件(不包含调试信息)。分别打开这两个文件夹查看其中包含的文件。

5.打开SDK文件夹中的inc文件夹,可以看到此文件夹中存放了EOS用于导出API

函数和重要数据类型定义的头文件,在编写EOS应用程序时必须包含这些头文件。

每次在开发EOS应用程序之前都应该使用EOSKernel项目的debug配置和release配

置来生成EOSKernel项目,这样才能够得到完全版本的SDK文件夹供EOS应用程序使用。

结合《EOS实验指南》第一章中关于EOS内核从源代码到可在虚拟机中运行过程的介绍,

仔细体会EOS内核项目生成、调试的过程,以及EOSSDK文件夹生成的过程和组织方式。

3.4EOS应用程序项目的生成和调试

3.4.1新建EOS应用程序项目

新建一个EOS内核项目的步骤如下:

1.在“文件”菜单中选择“新建”,然后单击“项目”。

2.在“新建项目”对话框中,选择项目模板“EOS应用程序”。

3.在“名称”中输入新项目使用的文件夹名称“eosapp”。

4.在“位置”中输入新项目保存在磁盘上的位置“C:\”。

5.点击“确定”按钮。

此项目就是一个EOS应用程序项目。

使用Windows资源管理器将之前生成的C:\eos\sdk文件夹拷贝覆盖到C:\eosapp\sdk

位置。这样EOS应用程序就可以使用最新版本的EOSSDK文件夹了。

3.4.2生成项目

1.按F7生成项目,同时查看“输出”窗口中的内容,确认生成成功。

2.打开C:\eosapp\debug文件夹,查看生成的对象文件和目标文件。其中的

EOSApp.exe就是EOS应用程序的可执行文件。OSLab每次启动执行EOS应用程序

时,都会将EOS应用程序的可执行文件写入软盘镜像,并且会将SDK文件夹中时

应配置(Debug或Release)的二进制文件写入软盘镜像,然后让虚拟机运行软盘

镜像中的EOS,待EOS启动后再自动执行EOS应用程序。

3.4.3调试项目

调试EOS应用程序项目与之前的两个项目有较大的不同,之前的两个项目在调试时都

是先添加断点再启动调试,而EOS应用程序项目必须先启动调试再添加断点,步骤如下:

1.按F5启动调试。OSLab会弹出•个调试异常对话框,选择“是”调试异常,EOS

应用程序会中断执行,黄色箭头指向下一个要执行的代码行。

2.在eosapp.c的

printf("Helloworld!\n/z);

代码行添加一个断点,然后按F5继续调试,在此断点处中断。

3.按F10单步调试,查看虚拟机窗口,打印输出了“Hell。world!”。

4.按F5继续调试,查看虚拟机窗口,EOS应用程序执行完毕。

5.在“调试”菜单中选择“停止调试”,调试被终止。

6.选择“调试”菜单中的“删除所有断点”。只有删除所有断点后才能按F5再次启

动调试,否则启动调试会失败。

3.4.4查看软盘镜像文件中的内容

使用FloppyImageEditor工具打开该项目中的Floppy.img文件,查看软盘镜像中的文

件。loader,bin和kernel,dll是从C:\eosapp\sdk\bin\debug文件夹写入的,

C:\eosapp\sdk\bin\debug\boot.bin被写入了软盘镜像文件的引导扇区中。eosapp.exe就

是本项目生成的EOS应用程序。EOS操作系统启动后会根据autorun.txt文本文件中的内容

启动执行eosapp.exe程序,双击autorun.txt文件查看其内容。

结合《EOS实验指南》第一章中关于EOS应用程序从源代码到可在虚拟机中运行过程的

介绍,仔细体会EOS应用程序项目生成、调试的过程,以及EOS应用程序是如何使用EOSSDK

文件夹的。

3.5退出OSLab

1.在“文件”菜单中选择“退出”。

2.在OSLab关闭前会弹出一个保存数据对话框(可以选择对话框标题栏上的“帮

助”按钮获得帮助信息),核对学号和姓名无误后点击“保存”按钮,OSLab关闭。

3.在OSLab关闭后默认会自动使用Windows资源管理器打开数据文件所在的文件夹,

并且选中刚刚保存的数据文件(OUD文件)。将数据文件备份(例如拷贝到自己的

U盘中或者发送到服务器上),做为本次实验的考评依据。

3.6保存EOS内核项目

如果要在课余时间阅读EOS源代码,或者调试EOS源代码,可以按照下面的步骤操作:

1.使用OSLab重新打开之前创建的EOS内核项目(启动OSLab后,在“起始页”的

“最近的项目”列表中会有之前创建的EOS内核项目的快捷方式“kernel")。

2.使用Debug配置生成此项目。再次启动调试此项目后结束调试,从而制作包含Debug

版本EOS操作系统的软盘镜像文件。

3.将此项目文件夹复制到自己的计算机中。注意,项目文件夹在磁盘中的位置不能改

变,例如实验中此项目在C:\eos位置,就必须复制到自己计算机中的C:\eos位置。

4.在自己的计算机中安装OSLab演示版,使用演示版程序阅读EOS源代码,或者调

试EOS源代码。

OSLab演示版程序可以使用教师分发的安装包进行安装。建议使用和正式版版本号相

同的演示版程序。

四、思考与练习

•练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调

试,在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监视”窗

口、“调用堆栈”窗口等)。

•思考生成EOSSDK文件夹的目的和作用。查看EOSSDK文件夹中的内容,明白文件夹的

组织结构和各个文件的来源和作用。查看EOS应用程序包含了SDK文件夹中的哪些头文

件,是如何包含的?

五、相关阅读

•启动osLab后,选择“帮助”菜单中的“帮助主题”,阅读帮助开始页中的“如何:

使用代码阅读工具”,熟练使用各种代码阅读工具可以大大提高阅读EOS源代码的效

率。

•打开OSLab帮助左侧的“目录”标签,阅读“参考”文件夹中的“如何:打开项目属

性页”、“如何:更改活动项目配置”、“如何:为项目添加文件”。阅读其它主题,

了解更多关于OSLab的信息。

•访问http://\v\v\v.tovation,com了解关于OSLab的最新信息。登陆网站中的论坛,可

以在论坛中进行答疑或者参与讨论。

实验三生产者和消费者的问题

1.实验目的

(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)验证用信号量机制实现进程互斥的方法。

(4)验证用信号机制实现进程同步的方法。

2.实验预备内容

(1)阅读课本有关进程管理以及进程同步的有关章节,对临界区和临界资

源概念要清晰,充分理解信号信号量机制。

(2)阅读儿种经典进程同步问题的算法并理解。熟练掌握生产者一消费者

的算法思想。

3.实验环境

(1)一台运行WindowsXP操作系统的计算机。

(2)选用以C、C++、visualC++、Java等任何一种语言。建议采用Java

多线程编程技术

4.实验时间:4个机时。

5.实验内容

问题描述:考虑有一些生产者和消费者进程,生产者进程生产信息并把它们

放入缓冲池中,消费者从缓冲池中取走信息。生产者一消费者问题是相互合作的

进程关系的一种抽象,如在输入时,输入进程是生产者,计算进程是消费者;而

在输出时,则计算进程是生产者,打印进程是消费者。请使用信号量机制来解决

生产者一消费者问题。

一次只可放一个产品

互斥关系:

(I)设缓冲池有n个单元。

(II)当n个单元装满时,生产者必须等待。

(III)当缓冲池空时,消费者必须等待。

6.参考算法

importjavax.swing.JTextArea;/*

*定义临界资源:缓冲队列**/

publicclassBuffers{JTextAreata;staticfinalintproductBu

fferNum=10;〃缓冲单元数

ProductBufferpBuffer[]=newProductBuffer[productBufferNum];/

/缓冲队列

intin=0;〃缓冲单元指针,用于放产品

get()intout=0;〃缓冲单元指针,用于取产品

put()intconsumeProductNo;〃记录消费产品的编号

intusedBufferNum=0;〃记录缓冲队列已使用的缓冲单元个数

publicBuffers(JTextAreata){this,ta=ta;〃初始化

for(intj=0;j<productBufferNum;j++){pBuffer[j]=newProduc

tBuffer0;}

for(inti=0;i<productBufferNum;i++){pBuffer[i].product=-1

;pBuffer[i].hasProduct=false;}}〃取产品

publicsynchronizedvoidget(intid){〃缓冲队列空则等待

if(usedBufferNum==0){try{super,wait();}catch(Excep

tione){e.printStackTrace();}}consumeProductNo=p

Buffer[out],product;〃取出产品

pBuffer[out],product=0;〃清空缓冲单元

pBuffer[out].hasProduct=false;〃置〃无产品〃标识

usedBufferNum--;〃输出本次取产品后缓冲队列的情况

ta.append(〃消费者〃+id+〃将产品〃+consumeProductNo+〃从缓冲单元

〃+out+〃取出,缓冲队列状态如下:\n〃);

printBuffer();

out=(out+1)%productBufferNum;〃更新指针

〃唤醒等待线程

super,notify();}//放产品

publicsynchronizedvoidput(intproductNo,intid){〃缓冲队列

满则等待

if(usedBufferNum==productBufferNum){try{super,wait0

;}catch(Exceptione){e.printStackTrace();}}pBu

ffer[in].product=productNo;〃放产品

pBuffer[in].hasProduct=true;〃置“有产品”标识

usedBufferNum++;〃/输出本次放入产品后,缓冲队列的情况

ta.append(〃生产者〃+id+〃将产品〃+productNo+〃放入缓冲单元〃+ir)+〃,缓冲

队列状态如下:\n〃);

printBuffer();in=(in+1)%productBufferNum;〃更新指

针〃唤醒等待线程

super,notify();}〃打印缓冲队列当前情况

privatevoidprintBuffer(){ta.appendC,缓冲单元

编号产品编号缓冲单元状态\n〃);

for(inti=0;i<productBufferNum;i++){ta.append(〃\t〃+i+〃\t〃+p

Buffer[i]・product+〃\t〃+pBuffer[i]・hasProduct+〃\n〃);}}}

importjava.awt.BorderLayout;

importjava.awt.event.ActionEvent;importjava.awt.event.ActionLi

stener;

importjavax.swing.JButton;importjavax.swing.JFrame;importjav

ax.swing.JPanel;

importjavax.swing.JScrollPane;importjavax.swing.JTextArea;/*

*生产者消费者问题实现(可以有多个生产者消费者)**/

publicclassProducerConsumerMainimplementsActionListener{bo

oleanisRun=true;〃用于控制线程结束

JTextAreata=newJTextAreaO;Buffersbuffers=newBuffers(t

a);〃缓冲队列

staticfinalintproducerNum=8;〃生产者个数

staticfinalintconsumerNum=2;〃消费者个数

ProducerThreadproThread[]=newProducerThread[producerNum];Co

nsumerThreadconThread[]=newConsumerThread[consumerNum];

Threadproducer[]=newThread[producerNum];Threadconsumer[]

=newThread[consumerNum];

publicProducerConsumerMain(){createUI0;//创建界

面〃创建多个生产者和消费者线程并开始执行

for(inti=0;i<producerNum;i++){proThread[i]=newProducer!

hread(i+l);producer[i]=newThread(proThread[i]);produce

r[i].start();}for(intj=0;j〈consumerNum;j++){conTh

read[j]=newConsumerThread(j+1);consumer[j]=newThread(co

nThreadtj]);consumer[j].start();}}

〃创建界面

publicvoidcreateUI0{JFrameframe=newJFrame(〃生产者消

费者

〃);JPanelpanel=newJPanel(newBorderLayout());JScrollP

anescrPane=newJScrollPane(ta);panel.add(scrPane,BorderLay

out.CENTER);JButtonbutton=newJButton(〃停止

〃);button.addActionListener(this);panel,add(button,BorderL

ayout.SOUTH);frame,add(panel);frame.setVisible(true);fra

me.setSize(1000,500);frame.setDefaultCloseOperation(JFrame.EXI

T_ON_CLOSE);}

7/按钮响应事件

publicvoidactionPerformed(ActionEvente){isRun=false;//

控制线程结束System.out.printin(〃停止〃);)

publicstaticvoidmain(Stringargs[J){ProducerConsumerMainp

roducerConsumer=newProducerConsumerMain();}

〃定义生产者线程

classProducerThreadimplementsRunnable{intproductNo=0;

〃产品编号intid;〃生产者

IDpublicProducerThread(intid){this,id=id;

publicvoidrun(){while(isRun){productNo++;//

生产产品buffers.put(productNo,id);〃将产品放入缓冲队

列try{Thread,sleep(100);}catch(Exceptione){

e.printStackTrace();}}}}〃定义消费者线

程classConsumerThreadimplementsRunnable{intid;〃消费

IDpublicConsumerThread(intid){this,id=id;}p

ublicvoidrun(){while(isRun){buffers,get(id);//从缓冲

队歹U中取出产

品try{Thread,sleep(100);}catch(Exceptione){

e.printStackTrace();}}}))/*

一个缓冲单元*/

publicclassProductBuffer{intproduct;〃存放产品编

号booleanhasProduct;〃标识该缓冲区是否有产品,true有产品,

false无产品

7.实验要求

在程序编制中,应有数据显示,最好采用图形界面显示。生产者和消费者的

进程采用程序模拟的方法运行。

实验四时间片轮转算法和优先级调

度算法C语言模拟实现

一、目的和要求

进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加

深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具

体实施办法。

二、实验内容

1.设计进程控制块PCB的结构,通常应包括如下信息:

进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时

间、进程的状态、当前队列指针等。

2.编写两种调度算法程序:

优先数调度算法程序

循环轮转调度算法程序

3.按要求输出结果。

三、提示和说明

分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、就

绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。

(-)进程控制块结构如下:

NAME进程标示符

PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数2)

CPUTIME——进程累计占用CPU的时间片数

NEEDTIME——进程到完成还需要的时间片数

STATE——进程状态

NEXT——链指针

注:

1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;

2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行

时给定。

(-)进程的就绪态和等待态均为链表结构,共有四个指针如下:

RUN——当前运行进程指针

READY——就需队列头指针

TAIL一就需队列尾指针

FINISH——完成队列头指针

(三)程序说明

1.在优先数算法中,进程优先数的初值设为:

50-NEEDTIME

每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间

片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。

2.程序的模块结构提示如下:

整个程序可由主程序和如下7个过程组成:

(1)INSERT1——在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;

(2)INSERT2——在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,

插到就绪队列的队尾;

(3)FIRSTIN——调度就绪队列的第一个进程投入运行;

(4)PRINT——显示每执行一次后所有进程的状态及有关信息。

(5)CREATE——创建新进程,并将它的PCB插入就绪队列;

(6)PRISCH——按优先数算法调度进程;

(7)ROUNDSCH——按时间片轮转法调度进程。

主程序定义PCB结构和其他有关变量。

(四)运行和显示

程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME值。

每次显示结果均为如下5个字段:

namecputimeneedtimeprioritystate

)注:

1.在state字段中,代表执行态,“W”代表就绪(等待)态,“F”代表完成态。

2.应先显示“R"态的,再显示“W"态的,再显示态的。

3.在态中,以优先数高低或轮转顺序排队;在态中,以完成先后顺序排队。

include"stdio.h"

#include"stdliLh"

include“string.h"

typedefstructnode

(

charname[10];/*进程标识符*/

intprio;/*进程优先数*/

intround;/*进程时间轮转时间片*/

intcputime;/*进程占用CPU时间*/

intneedtime;/*进程到完成还要的时间*/

intcount;/*计数器*/

charstate;/*进程的状态*/

structnode*next;/*链指针*/

}PCB;

PCB*finish,*ready,*tail,*run;/*队列指针*/

intN;/*进程数*/

/高・绪题中的第一i.进程投入运行*/

firstin()

(

run=ready;/航绪也回头指针赋值给运行头指针*/

run->state='R';/*进程状态变为运行态*/

/*■绪对列头指针后潜

ready=ready->next;下进程*/

)

/*标题输出函数*/

voidprt1(chara)

{

Mtoupper(a)==P)/*优先数法*/

printf(Hnamecputimeneedtimeprioritystate\nM);

e

温馨提示

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

评论

0/150

提交评论