本书基于作者多年的操作系统课程教学实践,在第1版读者反馈的基础上,充分考虑教学对象的差异性和教学计划的多样性,精心调整、优化实践内容,旨在提供独立于任何操作系统理论教材的系统化实践参考。本书按照由浅入深、循序渐进的原则安排内容,首先介绍实践相关的理论和技术知识,接下来通过8个操作系统核心功能及特性的实验项目,帮助读者理解操作系统关键原理,并通过剖析一个小型开源操作系统Nachos的源代码,使读者透彻理解操作系统的功能和实现机制。
操作系统是计算机系统的重要组成部分,它能为上层程序及软件提供运行的环境和基础,并负责管理计算机软硬件资源,合理控制计算机的工作流程。操作系统因其重要性已成为计算机及相关专业的核心课程,并被列为考研必考科目。
本书第1版自2015年出版以来,受到许多读者的喜爱,很多读者也对内容提出了意见和建议,为此我们决定在第1版的基础上进行更新。我们根据操作系统领域的发展和课程教学的变化,更新、补充了相关内容,对其他内容进行了修改和完善,主要涉及以下方面:首先,为帮助学生全面掌握操作系统的基本概念和原理,从而有效地完成实践,补充了相关理论知识;其次,采用了当前主流的C语言编程软件Dev C++和VS 2015,同时修改了上一版实验中的部分API函数,替换了已被淘汰的 API 函数和软件;后,根据近年来操作系统实验课程的教学情况,调整了部分实验内容,使实验的难易程度更加合理。
在第2版中,我们结合多年操作系统课程的教学经验,充分考虑教学对象的差异性和教学计划的多样性,从实验内容的深度和广度上更有层次、更合理地安排教学内容,从而为教授操作系统课程的教师提供系统化的实践教学参考,为学习该课程的学生提供锻炼自我、自主学习的平台。终目标是让学生在学习操作系统理论的基础上,通过实践加深对操作系统理论,尤其是对操作系统核心内容及经典算法的理解。
本书特色
翔实的基础理论。本书回顾了操作系统课程中的重要知识点,并对实践项目中需要用到的开发环境、编程语言、调试技术等进行了介绍,为学生后续的实践打下坚实的基础。
经典的实验范例。我们精心挑选了能代表操作系统核心功能的8个实验,并系统说明实验思路,提供规范的实验模板。同时,以开源操作系统Nachos为例,深入浅出地讲解可运行的操作系统的实现方式。
系统的实践教学思路。本书结合普通高校学生的操作系统课程学习需求,基于常用的Windows系统和Linux操作系统,通过一系列实践题目,使学生熟悉操作系统,能够动手安装、设置操作系统,熟悉操作系统的核心功能,直至能独立分析一个开源操作系统,终透彻理解操作系统的功能和实现机制。
本书结构
本书分为准备知识、核心实验和Nachos源码分析三个部分。每个部分的难度逐渐加大,既符合学生的学习习惯,又能满足不同层次学生的需求。具体来说,本书的内容框架如下:
部分 准备知识。在这部分中,主要介绍操作系统的核心知识、虚拟机的安装与使用、C语言的相关知识、shell编程、文件I/O、系统进程编程、C程序调试技术等内容,涵盖理论课程中一般不会介绍但后续实践中需要用到的重要知识及关键技术,让学生熟悉实验所需的编程环境、编程方法和工具等,为后面的实验工作奠定基础。
第二部分 核心实验。这部分结合计算机操作系统的核心理论及算法,选择了8个核心实验:Linux编程、进程控制、系统调用、作业调度、同步与互斥、银行家算法、内存管理和文件系统。每个实验中包括实验目的、实验准备、基本知识及原理、实验说明、实验内容、实验总结、参考代码、实验报告等板块,并针对重点和难点进行引导与提示,激励学生在实践中学习、在思考中进步。
第三部分 Nachos 源码分析。在前两部分学习的基础上,这一部分将通过分析操作系统Nachos的源代码,使学生掌握系统调用的实现、同步与互斥机制的实现、线程调度,以及文件系统等操作系统的核心内容。通过分析这个真实系统的源代码,学生可以更加清楚地了解理论知识是如何在实际操作系统中应用的。
读者对象
本书是为高等院校计算机及相关专业的师生编写的,可作为操作系统实践课程的教材或参考书。此外,本书还可供操作系统爱好者自学使用。
本书配套资源
本书为授课教师和读者提供以下资源:
PPT课件:包括核心实验部分课件,可用于课堂教学。
源代码:包括实验源码和修改后的Nachos系统源码。
读者可以登录华章网站(http://www.hzbook.com)下载上述资料。
致谢
本书在编写过程中得到了四川大学计算机学院的多位教师以及机械工业出版社各位编辑的大力支持,在此表示衷心的感谢。
在本书写作过程中,四川大学视觉计算实验室的同学们做了富有成效的工作,感谢封泽希、杨寸月、符敏等人为本书第1版写作所做的工作,以及刘璐、李季倬等人为第2版编写做出的贡献。赵辉老师在本书的编写方面也提出了许多宝贵意见。在本书即将出版之际,谨向上述老师、同学表示诚挚的谢意。
由于作者学识所限,书中难免有错漏之处,恳请读者及同行批评指正。
作者
2021年8月
前言
部分 准备知识
第1章 操作系统概论 2
1.1 操作系统的概念 2
1.2 操作系统的功能 2
1.2.1 处理器管理 2
1.2.2 存储器管理 3
1.2.3 设备管理 4
1.2.4 文件管理 4
1.2.5 用户接口管理 5
1.3 常见的操作系统 5
1.3.1 UNIX操作系统 5
1.3.2 Linux操作系统 6
1.3.3 Windows操作系统 7
1.4 本章小结 7
第2章 虚拟机的安装与使用 8
2.1 虚拟机软件VMware Workstation概述 8
2.2 搭建实践环境 8
2.3 在Windows下安装VMware 9
2.4 VMware下Ubuntu的安装与配置 12
2.5 虚拟机Linux与宿主机Windows的文件访问 17
2.5.1 安装VMware Tools实现虚拟机与主机文件共享 17
2.5.2 在Ubuntu虚拟机下开启Samba服务 24
2.6 本章小结 25
第3章 C语言基础 26
3.1 C语言基本语法回顾 26
3.1.1 分析一个简单的C程序 26
3.1.2 数据类型 26
3.1.3 变量与常量 28
3.1.4 运算符 29
3.1.5 函数 30
3.2 结构体 32
3.2.1 结构体类型的定义 32
3.2.2 结构体变量的定义 34
3.2.3 结构体变量的初始化 35
3.2.4 结构体变量的引用 35
3.3 指针 37
3.3.1 指针基础 37
3.3.2 指针变量的操作 37
3.3.3 指针与函数 39
3.3.4 数组与指针 39
3.4 C标准库 40
3.5 本章小结 41
第4章 shell编程 42
4.1 vim程序编辑器 42
4.1.1 vim的基本概念 42
4.1.2 vim的工作模式 42
4.1.3 vim的使用实例 44
4.2 用shell进行编程 46
4.2.1 shell的基本概念 46
4.2.2 shell脚本文件 46
4.2.3 变量及传递参数 47
4.2.4 数据类型 48
4.2.5 基本运算符 50
4.2.6 echo和test命令 51
4.2.7 流程控制 52
4.3 Linux下shell的常见命令 53
4.4 本章小结 55
第5章 文件I/O 56
5.1 系统调用与C语言标准库 56
5.2 Linux文件系统调用函数 57
5.3 C语言标准库中的文件I/O函数 62
5.4 本章小结 66
第6章 系统进程编程基础 67
6.1 进程的基本概念 67
6.1.1 进程与进程控制块 67
6.1.2 进程状态 67
6.2 进程与线程 68
6.2.1 线程的基本概念 68
6.2.2 线程与进程的比较 69
6.2.3 线程分类与多线程模型 69
6.3 Linux进程的创建与管理 70
6.3.1 fork函数 70
6.3.2 wait和waitpid函数 71
6.3.3 exec函数 72
6.4 Windows进程创建与终止 72
6.4.1 CreateProcess函数 72
6.4.2 ExitProcess函数 73
6.5 本章小结 74
第7章 C语言调试技术 75
7.1 Linux与Windows下的C语言开发环境 75
7.2 Windows下基于Dev C++和VS 2015的调试 76
7.3 Linux下的GDB命令行调试 82
7.4 Linux下基于DDD的图形界面调试 86
7.5 本章小结 92
第二部分 核心实验
第8章 Linux编程实验 94
8.1 实验目的 94
8.2 实验准备 94
8.3 基本知识及原理 94
8.4 实验说明 96
8.5 实验内容 97
8.6 实验总结 97
8.7 参考代码 98
8.8 实验报告 99
第9章 进程控制实验 102
9.1 实验目的 102
9.2 实验准备 102
9.3 基本知识及原理 102
9.4 实验说明 103
9.5 实验内容 105
9.6 实验总结 105
9.7 参考代码 106
9.8 实验报告 110
第10章 系统调用实验 113
10.1 实验目的 113
10.2 实验准备 113
10.3 基本知识及原理 113
10.4 实验说明 116
10.5 实验内容 119
10.6 参考代码 119
10.7 实验报告 122
第11章 作业调度实验 126
11.1 实验目的 126
11.2 实验准备 126
11.3 基本知识及原理 126
11.4 实验说明 128
11.5 实验内容 129
11.6 实验总结 130
11.7 参考代码 130
11.8 实验报告 134
第12章 同步与互斥实验 137
12.1 实验目的 137
12.2 实验准备 137
12.3 基本知识及原理 137
12.4 实验说明 139
12.5 实验内容 143
12.6 实验总结 144
12.7 参考代码 144
12.8 实验报告 152
第13章 银行家算法实验 156
13.1 实验目的 156
13.2 实验准备 156
13.3 基本知识及原理 156
13.4 实验说明 158
13.5 实验内容 159
13.6 实验总结 159
13.7 参考代码 160
13.8 实验报告 167
第14章 内存管理实验 169
14.1 实验目的 169
14.2 实验准备 169
14.3 基本知识及原理 169
14.4 实验说明 173
14.5 实验内容 176
14.6 实验总结 176
14.7 参考代码 177
14.8 实验报告 181
第15章 文件系统实验 185<