操作系统
课程设计指导书
(2021 级)
计算机科学与工程学院
内部使用
湖南科技大学
2023 年 5 月
一、课程设计目的
通过课程设计,加深学生对教材中的重要理论知识的理解,同时通过用 C/C++语言编程
实现一些重要的算法,并在 Linux 或 Windows 平台上实现,使学生具备将操作系统的基本
概念和基础理论运用于实际工程的能力;使学生掌握基本的分析方法、设计方法、调试方法和
优化方法,具有构建小型、中型软件系统的能力;使学生熟练掌握操作系统领域的相关算法,
可运用高级语言实现操作系统的各个组成模块,提高学生综合运用专业课知识的能力。
二、课程设计要求
1. 每位同学在课程设计之前请做好充分的准备工作,事先准备并熟悉实验的软硬件环境,预
习各项实验任务。请各班学习委员负责组织本班同学完成多样化选题工作(选题要求参见
下面的课程设计考核要求),并在设计开始第一天将选题情况汇报给指导老师。
2. 实验时遵守实验室的规章制度,爱护实验设备,不得在实验室做与实验无关的事情,影响
其他同学的上机。对于实验设备出现的问题,要及时向指导老师汇报。每天按时填写课程
设计工作日志(格式请参见附件 2),并接受指导老师的定期检查。没有日志的学生课程设
计不及格。
3. 最终的课程设计报告要求格式规范,语言通顺,写明使用的数据结构,画出算法的程序流
程图、关键的源程序代码、仔细记录实验结果,对于遇到的问题或疑惑要一并书写,并作
为重点加以思考与分析。另外,对于验证类实验(参见下面的考核部分)的报告,不可直
接抄袭课程设计指导书的背景部分内容,违规者最终成绩直接不及格。
4. 课程设计程序、课程设计报告要求独立完成、不允许相互抄袭。否则不及格。
5. 及时提交课程设计报告(请参见附件 1 的课程设计报告格式要求,封面单面打印,封面之
外正文部分内容建议使用双面打印)、源程序文件、日志文件。每个实验的报告篇幅建议大
约 3-4 面,课程设计报告的总面数大约 30 面左右为宜。
三、课程设计考核
1. 本指导书中的前五个实验为验证性实验,后六个实验为设计类实验,其中标*的实验难度较
大。本次课程设计要求学生完成 8 个及以上实验。建议学习基础一般的同学先完成 5 个验证性实
验,再另选做 3 个及以上设计类实验;对于成绩优秀与良好的学生要求完成 4 个及以上验证性实
验和 4 个设计类实验(注:设计类的选题请尽可能多样化,不要集中在相同的几个实验上;另外,
成绩优秀的同学的 4 个设计类的选题中须包括 2 个带*号的实验)。指导老师也可以根据实际情况
进行适当调整。请各班学习委员负责组织本班同学完成多样化选题工作,并在设计开始第一天将分
组与选题情况汇报给指导老师。
2. 本次课程设计可以由学生独立完成,也可以由学生 2 人一组分工合作来完成。本次时间安
排为 2 周,建议前三天完成验证性实验,余下的时间用于设计类实验。指导老师可以此作为参考进
行阶段性测试。
3. 课程设计成绩主要由以下几部分组成:平时成绩、测试成绩、创新成绩设计、设计报告质量
(请参见附件 3)。 学生平时课堂表现、学生记录课程设计过程和结果(或用到的数据结构、算法等)
形成日志记录文档,计入平时成绩;指导老师进行分段上机测试,在课程设计中期和末期分别进行
测试,形成测试成绩;指导老师可采用学生个人陈述与答辩等方式考察学生课设成果的创新性,形
成创新成绩。
目 录
实验一 Windows 进程管理 ......................................................................................................................... 1
实验二 Linux 进程控制 ............................................................................................................................... 9
实验三 Linux 进程间通信 ......................................................................................................................... 12
实验四 Windows 线程的互斥与同步 ....................................................................................................... 17
实验五 内存管理 ....................................................................................................................................... 21
实验六 银行家算法的模拟与实现 ............................................................................................................ 29
实验七 磁盘调度算法的模拟与实现 ........................................................................................................ 31
实验八* 虚拟内存系统的页面置换算法模拟 .......................................................................................... 32
实验九* 基于信号量机制的并发程序设计 .............................................................................................. 34
实验十* 实现一个简单的 shell 命令行解释器 ........................................................................................ 35
实验十一** 简单二级文件系统设计 ........................................................................................................ 36
附录:Linux 编程基础 ......................................................................................................................... 44
1
实验一 Windows 进程管理
1、实验目的
(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。
(2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操
作系统的进程概念,理解 Windows 进程的“一生”。
(3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基
本程序设计方法。
2、背景知识
Windows 所创建的每个进程都从调用 CreateProcess() API 函数开始,该函数的任务是在对象管
理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或 TerminateProcess() API函数终止。
通常应用程序的框架负责调用 ExitProcess() 函数。对于 C++ 运行库来说,这一调用发生在应用程
序的 main() 函数返回之后。
(1) 创建进程
CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1 详细地列出
了每个参数的类型和名称。
表 2-1 CreateProcess() 函数的参数
参数名称
使用目的
LPCTSTR lpApplivationName
全部或部分地指明包括可执行代码的 EXE 文件的文件名
LPCTSTR lpCommandLine
向可执行文件发送的参数
LPSECURIITY_ATTRIBUTES
lpProcessAttributes
返回进程句柄的安全属性。主要指明这一句柄是否应该由其他
子进程所继承
LPSECURIITY_ATTRIBUTES
lpThreadAttributes
返回进程的主线程的句柄的安全属性
BOOL bInheritHandle
一种标志,告诉系统允许新进程继承创建者进程的句柄
DWORD dwCreationFlage
特殊的创建标志 (如 CREATE_SUSPENDED) 的位标记
LPVOID lpEnvironment
向新进程发送的一套环境变量;如为 null 值则发送调用者环境
LPCTSTR lpCurrentDirectory
新进程的启动目录
STARTUPINFO lpStartupInfo
STARTUPINFO 结构,包括新进程的输入和输出配置的详情
LPPROCESS_INFORMATION
lpProcessInformation
调用的结果块;发送新应用程序的进程和主线程的句柄和 ID
可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者
利用搜索方法找到的路径;lpCommandLine 参数允许调用者向新应用程序发送数据;接下来的三个
参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。
然后是标志参数,用以在 dwCreationFlags 参数中指明系统应该给予新进程什么行为。经常使用
的标志是 CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用 ResumeThread() API
2
来启动进程。另一个常用的标志是 CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,
而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他
的活动进程来说,给此进程多少 CPU 时间。
接着是 CreateProcess() 函数调用所需要的三个通常使用缺省值的 参 数。第一个参数是
lpEnvironment 参数,指明为新进程提供的环境;第二个参数是 lpCurrentDirectory,可用于向主创进
程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是 STARTUPINFO 数据结构所
必需的,用于在必要时指明新应用程序的主窗口的外观。
CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和 ID 的返回值缓冲区。
以 PROCESS_INFORMATION 结构中返回的句柄调用 CloseHandle() API 函数是重要的,因为如果
不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。
(2) 正在运行的进程
如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用主线
程来指示它的存在。当主线程结束时,调用 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
(进程标识号) 。这一 API 函数与 GetVersionEx() 的共同作用,可确定运行进程的系统的版本号。
(3) 终止进程
所有进程都是以调用 ExitProcess() 或者 TerminateProcess() 函数结束的。但最好使用前者而不
要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的。而
外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行
为。
TerminateProcess() API 函数只要打开带有 PROCESS_TERMINATE 访问权的进程对象,就可以
终止进程,并向系统返回指定的代码。这是一种“野蛮”的终止进程的方式,但是有时却是需要的。
如果开发人员确实有机会来设计“谋杀”(终止别的进程的进程) 和“受害”进程 (被终止的进程)
时,应该创建一个进程间通讯的内核对象——如一个互斥程序——这样一来,“受害”进程只在等待
或周期性地测试它是否应该终止。
(4)进程同步
Windows 提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。其中,开发人
员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互