操作系统上机实验指导书
(第一版)
闫大顺 李晟编著 吴家培 主审
计算机科学与工程学院
2014.8
1
操作系统实验指导
本课程是为《计算机操作系统》课所开的实验。计算机操作系统课程是一门实践性很强的技术课程,本课程实验的目的在于培养学生的实践能力,促进理论与实践的结合。要求学生通过上机编程,熟悉对操作系统原理,并熟练使用程序接口,并了解如何模拟操作系统原理的实现,从而加深对操作系统原理的领会,加深对操作系统实现方法的理解,与此同时使学生在程序设计方面也能够得到很大程度的提高。
实验的目的是使学生理论联系实际,提高学生系统理解与开发能力。这里所列的实验分为必做和选做。具体实验题的选择,不仅要考虑课程内容,而且要考虑学生目前的编程能力,要由浅入深。教师可通过运行示例或动画,帮助学生理解实验要求。学生应选择自己熟悉的语言与开发环境去完成实验。根据以往的教学经验,Delphi、C++ Builder,JBuilder由于提供了许多可重用的构件,易于学习、使用,VC++学习、使用困难较多。实验要求尽量在windows操作系统下,也可以在Linux下完成,由于多数没有专门学习Linux,在其平台下做试验比较困难。实验的硬件要求是能够支持VC++、Delphi、C++ Builder,JBuilder的微机即可。每个学生都在一台计算机上完成自己的实验内容,杜绝学生的抄袭。
实验报告的要求
1. 每位同学准备实验报告本,上机前作好充分的准备工作,预习本次实验的内容,事先熟悉与实验有关的软硬件环境。
2. 实验时遵守实验室的规章制度,爱护实验设备,对于实验设备出现的问题,要及时向指导老师汇报。
3. 提交实验文件格式:[班级][学号]_[实验题号].[扩展名] 例:计051班学号为03的学生第四个实验的文件名为:j05103_4.c 4. 最终的实验报告按照实验名称、实验目的、实验内容,实验过程(程序设计、实现与调试)、实验总结五部分书写,按时上交。实验总结是对于实验过程中出现的问题或疑惑的分析与思考。认真按照要求填写到实验报告纸上。
2
实验一、进程管理(3学时、必做) 一、实验目的
通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标:
1、 理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。 2、 复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实
现进程的管理。
二、实验内容
1、 建立一个结点,即 PCB 块包括用户标识域、状态域(执行、等待、就
绪)、 link 域。
2、 建立三个队列(执行队列、就绪队列、等待队列)。
3、 根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时
间片算法或手动调度的形式完成三个状态之间的转换 4、 用 switch 选择语句选择状态。
5、 按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。
三、实验步骤
1、 复习进程管理三状态模型部分内容。
2、 预习C++ Builder或VC++、Delphi、JBuilder线程编程。
3、 运行示例程序,进一步明确实验要求。可以采用控制台模式或窗口模式。 4、 上机编程、调试程序。 5、 完成实验报告。
3
实验1的附加资料
1、控制台模式进程管理的使用说明
图1. 输入结束字符
本程序是输入一个字符串,每个作为一个进程的名称,以指定的字符为结束字符,比较容易实现,其实可以在程序运行期间任意创建进程才是最好的。
图2. 输入进程名称
一次性的创建了多个进程,进入三状态模型,按照要求进行状态之间的转移,只要输入1、2、3、4、5数字,按回车即可。
4
图3. 进程管理程序的主界面
2、窗口模式的进程管理
图4. 简单进程管理的主界面
创建进程进入就绪队列,其排序可以按照FIFO的形式,也可以按照优先级
的形式,为此需要在PCB节点中增加优先级数。进程状态的转化在三个队列之间实现,输入进程的名称,选择合适的功能按钮。如果不符合状态转换的规则,则弹出错误的对话框,说明原因。
5
3、基于时间片调度的进程管理
图5. 基于时间片的进程管理主界面
创建一个进程,给出工作量,每个进程所占的时间片大小为20个单位,实现就绪状态到执行状态之间的转化。如果一个进程在执行,点击其I/O请求即可产生阻塞,实现了等待一个事件的状态转移。阻塞状态到就绪状态需要事件发生,本程序为了简化,过40个时间单位自动解锁。本程序可以在VC、Delphi或VB程序设计语言中实现,容易使用时钟控件。在控制台模式下,该方式不是非常合适。
4、Windows 2000进程控制
Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C++ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。这些详细的内容可以参考相关的MSDN 模块。 1)创建进程
CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1详细地列出了每个参数的类型和名称。
表1 CreateProcess() 函数的参数
参数名称 LPCTSTR lpApplivationName LPCTSTR lpCommandLine 使用目的 全部或部分地指明包括可执行代码的EXE文件的文件名 向可执行文件发送的参数 LPSECURIITY_ATTRIBUTES 返回进程句柄的安全属性。主要指明这一句柄是否应该由其他
6
lpProcessAttributes 子进程所继承 LPSECURIITY_ATTRIBUTES 返回进程的主线程的句柄的安全属性 lpThreadAttributes BOOL bInheritHandle DWORD dwCreationFlage LPVOID lpEnvironment LPCTSTR lpCurrentDirectory STARTUPINFO lpStartupInfo 一种标志,告诉系统允许新进程继承创建者进程的句柄 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 向新进程发送的一套环境变量;如为null值则发送调用者环境 新进程的启动目录 STARTUPINFO结构,包括新进程的输入和输出配置的详情 LPPROCESS_INFORMATION 调用的结果块;发送新应用程序的进程和主线程的句柄和ID lpProcessInformation 可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。
然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。
接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参数。第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。
CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。
2)正在运行的进程
如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,
7
这种进程使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。
首先可查看的进程特性是系统进程标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和GetProcessShutdownParameters() ,可给出进程存活期内的配置详情。
通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。在创建应用程序时可使用的另一个API函数是IsDebuggerPresent() 。
可利用API函数GetGuiResources() 来查看进程的GUI资源。此函数既可返回指定进程中的打开的GUI对象的数目,也可返回指定进程中打开的USER对象的数目。进程的其他性能信息可通过GetProcessIoCounters()、GetProcessPriorityBoost() 、GetProcessTimes() 和GetProcessWorkingSetSize() API得到。以上这几个API函数都只需要具有PROCESS_QUERY_INFORMATION访问权限的指向所感兴趣进程的句柄。
另一个可用于进程信息查询的API函数是GetProcessVersion() 。此函数只需感兴趣进程的PID (进程标识号) 。本实验程序清单3-6中列出了这一API函数与GetVersionEx() 的共同作用,可确定运行进程的系统的版本号。
3)终止进程
所有进程都是以调用ExitProcess() 或者TerminateProcess() 函数结束的。但最好使用前者而不要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的。而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行为。
TerminateProcess() API函数只要打开带有PROCESS_TERMINATE访问权的进程对象,就可以终止进程,并向系统返回指定的代码。这是一种“野蛮”的终止进程的方式,但是有时却是需要的。
8
实验二、进程通信 (3学时、选做) 一、实验目的
通过实验使学生进一步了解进程之间的各种通信方式、基本原理和不同操作系统中具体的实现。基本能达到下列具体的目标:
1、 理解进程消息通信的概念,如何实现两个创建进程之间的数据传递。。 2、 理解进程共享变量的进程通信。
二、实验内容
1、 选择Window或Linux,并选择该操作系统中一种进程通信的方式。 2、 查找该进程通信的API使用方式,设计出一个合适的应用程序。 3、 采用高级程序语言实现该应用程序。
4、 测试进程通信程序,能够满足微机操作系统中进程之间的通信。
三、实验步骤
1、 复习进程通信部分内容。
2、 预习C++ Builder或VC++、Delphi、JBuilder线程编程。
3、 Window或Linux操作系统上,运行示例程序,进一步明确实验要求。 4、 上机编程、调试程序。 5、 完成实验报告。
9
实验2的附加资料
计算机中心的微型计算机安装了Window操作系统,只有微机1和5拥有双
启动,能够运行Red Linux操作系统。本文的进程通信附加资料,以Window为主,应用在项目开发和系统集成上应用得非常广泛。编程使用的进程之间的通信技术有利用Windows消息(WM_COPYDATA)、全局原子、内存文件映射、命令管道、邮槽等等
1、利用WM_COPYDATA消息实现的进程间通信
利用RegisterWindowMessage()函数来注册相同的消息字符串,来实现客户机和服务
器之间相互获得窗口句柄,从而可以相互发送消息。消息可以捎带32个字符串和一个整数。
图6. 基于消息的进程通信服务器
输入一个特定的字符串,作为会话的名称,启动监听功能,此时状态栏给出连接状态。启动客户端程序,输入相同的名字,则可以实现客户服务器之间的连接。此时可以实现服务器和客户端之间直接发送字符串和整数。
10
图7. 基于消息的进程通信客户端
2、利用内存映射文件实现的进程间通信
利用RegisterWindowMessage()函数来注册相同的消息字符串,来实现客户机和服务
图8. 基于内存映射的进程通信客户端
3、利用Socket套接字实现的进程间通信
利用Window或Linux操作系统的Socket套接字实现两个进程之间的通信是非常方便的,此时两个进程不要求在同一台计算机中,只要知道对方的IP地址,采用网络层的通信协议和端口即可。
11
实验三、银行家算法(3学时、必做) 一、实验目的
通过实验使学生进一步了解资源安全分配的算法。基本能达到下列具体的目标:
1、 理解死锁概念,以及死锁产生的必要条件。 2、 理解银行家算法基本原理。
3、 掌握一种资源和多种资源的银行家算法的设计与实现。
二、实验内容
1、 设计出管理的资源种类和数量 2、 设计出银行家算法的基本数据结构 3、 设计出完成该资源的银行家算法
4、 设计出简单的进程创建、运行资源需求、结束的过程 5、 采用高级语言实现该应用程序
三、实验步骤
1、 复习死锁部分内容。
2、 预习C++ Builder或VC++、Delphi、JBuilder编程。 3、 运行示例程序,进一步明确实验要求。 4、 上机编程、调试程序。 5、 完成实验报告。
12
实验3的附加资料
银行家算法用于避免死锁的保守算法,其基本原理和算法逻辑在教材上都有
详细的介绍。本试验是让学生选择有多少种资源和多少个进程,采用银行家算法能够灵活的实现一个资源分配的过程,给出每次资源分配时的进程安全序列,如果不能资源分配,给出不能分配的理由。具体的灵活性可以根据每个学生的自己需要来选择。
图9. 基于银行家算法的资源分配控制程序
基于VC的银行家算法
试验主要步骤:
1. 在VC中建立一个Banker程序,是基于对话框。
2. 添加Group Box控件,静态文本控件,编辑文本控件和按钮控件,构成计算机程序界面,编程需要的控件设定控件变量。
13
图1. 银行家算法应用程序
3. 在Dlg类中定义数据结构
表示系统整个资源数量、每个进程各种资源最大需求量、每个进程已分配的资源数量、系统各种资源现在可用量。 int sys_resource[3]; //系统整个资源数量
int sys_available[3]; //系统各种资源现在可用量 int pro_max[5][3]; //每个进程各种资源最大需求量 int pro_alloc[5][3]; //每个进程已分配的资源数量
int pro_need[5][4]; //每个进程还需要的资源数量,第四位指示安全测试时的数组集合。
CString m_AllProcessNames[5]; // 存放进程名称的数组,显示在按钮上。
CButton * m_pCurrentBtn; // 系统当前进程所指示的按钮 int m_iCurrentProcess; // 系统当前进程数组中序号
4. 在Dlg类中定义函数,为整个类服务。
int checkRequestSource(CEdit &curEdit, int nindex);//检查文本编辑框中所代表的资源申请是否满足小于本进程的需求、是否小于系统可用资源数量,其中nindex代表了资源的种类。如果满足则返回整数。 int GetEditControlToInt(CEdit &curEdit); //返回文本框的数值 void SetCurrentProcess(CButton &newCButton, int nindex);//根据选择按钮,设定当前进程,并在本按钮上设置*指示,同时在左边框内
14
根据选择设定显示,并以最大需要为三种资源请求的缺省值 void DefaultSystemData();// 系统的缺省数据重新设定。
void DisplayCurrentSourceStatu(); //根据各种数据结构的数值显示在表格中,各个进程的资源状况。
int IsSystemSafe(); //当前资源状况是否存在一个安全序列,如果有在返回1并在分析报告框内显示,否则返回-1在分析报告框说明。这个是本试验的基础。
5. 在Dlg类中定义多个按钮,完成银行家算法。 默认数据:设置各个数据结构的初始数据
请求资源:根据三个编辑框内的资源来请求,根据银行家算法处理,假设能够分配,找一个安全序列,如果不能找到,则用“恢复数据”来恢复已经分配的资源,重新处理
释放进程资源:释放当前进程已经分配的资源,归还给系统 进程1——进程5:设定当前进程
安全检查:检查当前数据结构代表的资源是否安全,如果安全给出安全序列,否则报告
恢复数据:尝试分配资源,如果不安全则退回已分配的资源。 6. 在Dlg类中定义需要实现的内容。
int IsSystemSafe();
“释放进程资源”按钮处理过程 “恢复数据”按钮处理过程 “安全检查”按钮处理过程
15
实验四、内存管理(3学时、必做) 一、实验目的
通过实验使学生了解可变式分区管理使用的主要数据结构,分配、回收的主要技术,了解最优分配、最坏分配、最先分配等分配算法。基本能达到下列具体的目标:
1、 掌握初步进程在内存中的映像所需要的内存需求。
2、 内存的最先分配算法首先实现,再逐步完成最优和最坏的分配算法。
二、实验内容
1、 在进程管理的基础上实现内存分配。 2、 学生了解实验目的,画出流程框图。
3、 复习单向链操作编程,编写全部程序。能够实现多种分配算法。 4、 创建和撤消进程时,完成内存的分配和回收操作,必须可以显示空闲内
存块队列状态。注意回收内存时,空闲块的合并操作。 5、 学生要在上一次实验的基础上对队列的删除、插入进一步熟练。
三、实验步骤
1、 复习可变式分区管理部分的内容。
2、 按照要求编出内存分配、回收与合并过程的程序。 3、 上机调试程序。 4、 完成实验报告。
16
实验4的附加资料
基于可变分区管理的内存管理是比较容易实现的,关键是选择那种算法,首次适应算法、下次适应算法、最佳分配算法、最坏分配算法,其中回收时的空闲区合并和这些算法关联比较紧密,一定要区分4中情况。 1、基于窗口的可变分区管理
图11 可变分区管理程序
2、基于控制台的可变分区管理
系统的整个内存可以为100单位,或者其他数据。学生也可以和试验1结合起来,在创建进程时接收一个参数描述,该进程所需要内存的大小,进行分配,如果系统没有足够的空间可以进行移动操作,如果整体空闲空间不够,则拒绝进程创建。当进程结束时进程回收,加入到内存队列节点。
17
实验五、文件管理(3学时、选做) 一、实验目的
通过本次实验对一个班级学生成绩的管理,使学生了解文件的主要操作。详细的目标如下:
1、 通过实验中文件的创建、复制和删除等操作完成对文件管理。 2、 了解文件、文件目录的结构。
3、 掌握文件的读写、文件指针移动基本操作,并了解文件控制的作用。
二、实验内容
1、 学生了解实验目的,创建文件、输入班级成绩、保存文件等功能需要画
出流程框图。
2、 利用磁盘文件对学生成绩进行管理:查询成绩、修改成绩、显示所有的
学生成绩。
3、 编写一个班级成绩复制到另一个文件的功能。
4、 学习使用文件控制,实现指定班级成绩文件的删除操作(选做)。 5、 实现目录的管理,创建与删除子目录、搜索指定的文件等(选做)。
三、实验步骤
1、 复习文件操作部分内容。
2、 按照要求编出复制文件和利用磁盘文件管理学生情况的程序。 3、 预习VC++、Java、C++ Builder或Delphi的文件控制。 4、 上机调试程序。 5、 完成实验报告。
18
实验六、综合实验(5学时、选做)
一、实验目的
综合操作系统的多个知识点,结合一个实例掌握实际操作系统windows或Linux的进程管理、内存管理、设备管理、文件管理、通信管理等,深入了解windows或Linux系统实现原理。 二、实验要求与内容:
1.必须是两个以上知识点的综合
2.必须是针对windows或Linux操作系统实现。 3.必须通过应用程序接口来实现对内部的管理。
4.每个班级内,每个同学一人一题,提高完成能力。 5.必须对程序系统进行需求分析、系统设计的步骤。 三、实验步骤
1.选题,学生根据自己的兴趣和知识结构选择一个题目,或者自己确定一个题目(必须通过任课教师的认可)。
2.分析题目涉及到的知识,收集材料,进行学习。 3.按照系统的目标进行需求分析。 4.选择开发平台和开发工具。
5.在需求分析的基础上进行系统设计。
6.在各个模块流程图的基础上,通过编程实现系统功能。 7.测试
8.撰写文档,并进行分析。
19
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务