本书全面系统地介绍了现代计算机操作系统的基本实现原理。全书共7章。第1章介绍操作系统的概念、特征和功能、发展历史、用户接口及结构模型;第2章介绍操作系统的硬件基础相关知识,包括处理器计算、存储系统、中断和时钟;第3章深入阐述进程与线程的概念、进程调度、死锁、同步与通信机制等;第4至6章分别介绍操作系统的存储器管理、设备管理和文件管理;第7章给出由简单到综合的实践环节建议实验项目。此外,本书以Linux系统的2.6.24内核及openEuler系统为实例,简要介绍其基本实现原理,力求方便读者学习时能理论联系实际。
本书结构清晰,内容丰富,基本覆盖研究生招生考试大纲的内容,强调理论与实践相结合,既可作为普通高等院校计算机及相关专业的操作系统课程教材,也可供计算机应用和开发技术人员参考。
操作系统是计算机系统中最重要的系统软件,负责管理系统中所有的硬件资源和软件资源,因此操作系统课程是计算机相关专业非常重要的核心课程,它所涉及的概念、原理及算法是从事软硬件开发等计算机相关工作的工程技术人员所必不可少的基础知识。但该课程本身概念多、知识面广、原理性和实践性强,教学过程中老师难教、学生难学。鉴于此,作者基于自己多年操作系统课程的教学经验与体会,通过广泛阅读和分析国内外操作系统相关优秀教材及最新操作系统研究论文,结合工程教育专业认证及考研的需要,精心编写了此书。
本书主要内容共包括7章,分别是操作系统引论、操作系统硬件基础、进程管理、存储器管理、设备管理、文件系统和操作系统实验。为激发读者的学习兴趣,每章开头提出若干与本章内容密切相关且读者所熟知却未必能准确回答的问题,以问题引导学习。下面按照章节介绍本书的特点。
(1) 在操作系统引论部分,注重内容的组织和增加内容的趣味性,把操作系统的来龙去脉和主要技术组织成一个逻辑清晰的整体,并且内容上不失阅读的趣味性。
(2) 在操作系统硬件基础部分,阐述与操作系统紧密相关的硬件知识。该部分除了处理器指令、寻址方式、中断、系统时钟、堆栈、寄存器、磁盘、内存之外,还引入其他操作系统教材较少介绍的Cache和非易失性存储。
(3) 在进程管理部分,采用操作系统原理和实际Linux系统有机融合的方式进行编排。在每节介绍进程管理相关原理的基础上,直接给出Linux中的具体实现技术和算法;为方便读者查询源码,对重要数据结构和函数的定义,都给出详细的检索路径。
(4) 在存储器管理部分,为兼顾知识的新颖性和系统性,对已经过时的存储管理方式,如连续分配方式只做简单介绍,而对广泛使用的分页存储管理及虚拟存储系统则进行系统描述。此外,本章还介绍了Linux系统的寻址机制、物理内存管理及进程的虚拟地址空间管理。
(5) 在设备管理部分,相对系统地介绍操作系统中设备管理的基本概念及相关知识,并介绍Linux系统字符设备驱动程序的设计及中断处理机制。
(6) 在文件系统部分,采用从逻辑结构到物理结构的方式进行阐述。在介绍Linux的虚拟文件系统VFS的基础上,讲述其经典的Ext2文件系统。
(7) 本书将操作系统原理教学和实践环节结合到一起,不再分列两本书,方便教师教学和学生学习。本书共提供5个实验项目,全部在Linux系统中开发。实验题目与操作系统原理紧密结合且难度适中,能帮助学生掌握Linux系统中底层的编程技术,熟悉相关的系统调用。为方便读者阅读分析Linux源码,本书还介绍了几种常用的源码检索工具。
为方便学生课后及考研复习,每一章都给出了数量众多、内容丰富的习题。本书是一本立体化的计算机操作系统教材,除了高质量的课件,我们还将提供面向课堂改革所需要的所有教学资源,如教学大纲、教学视频、习题详解、拓展知识、Linux源码分析教学案例、课堂讨论和测试题目等,可满足翻转课堂教学、工程认证对学生处理复杂问题能力的要求。
本书由杭州电子科技大学赵伟华、刘真、贾刚勇、周旭编写。其中,第1章和第4章由周旭编写,第2章和第5章由贾刚勇与赵伟华编写,第3章由赵伟华编写,第7章由赵伟华、贾刚勇、刘真编写,第6章由刘真编写。
本书的编写参阅了大量的书籍和资料,主要的参考文献列于书后,在这里对相关书籍及资料的编著者表示诚挚的谢意!
本书自2018年出版以来,经几轮教学实践及课程的持续建设,作者对教学内容与实践环节进行了更加深入的研究与设计,并将其充分体现在本次修订中。相对于第一版内容,本次主要修订了以下内容:
(1) 在1~6章的“本章小结”中增加了知识点思维导图,以方便学生复习总结。
(2) 第3章增加了多处理器调度。
(3) 第3章、第4章、第6章分别增加了openEuler进程管理、存储器管理、文件管理相关内容。
(4) 第7章增加了操作系统原理典型算法模拟实现实验、Linux系统块设备驱动程序设计实验,以充分满足不同层次教学需要。此外,调整了原书7.2节及7.3节的顺序,使实践环节的开展更加符合由简单到综合的原则。
虽经多次修改、补充和完善,但限于作者时间、水平和能力,书中仍难免还有不当和疏漏之处,恳请读者批评指正。作者联系邮箱:whzhao@hdu.edu.cn。
作 者
2022年1月
第1章 操作系统引论 1
1.1 什么是操作系统 2
1.1.1 计算机系统 2
1.1.2 操作系统的概念 3
1.2 操作系统的发展与分类 4
1.3 操作系统的特征和功能 8
1.3.1 操作系统的特征 8
1.3.2 操作系统的功能 9
1.4 操作系统用户接口 10
1.5 操作系统内核结构 11
1.6 典型操作系统介绍 13
1.7 本章小结 14
本章习题 15
第2章 操作系统硬件基础 17
2.1 处理器计算 17
2.1.1 处理器指令 17
2.1.2 寻址方式 19
2.1.3 寄存器 21
2.1.4 处理器特权级 23
2.2 存储系统 23
2.2.1 高速缓冲存储器 25
2.2.2 内存 27
2.2.3 堆栈 28
2.2.4 磁盘 29
2.2.5 非易失性存储 31
2.2.6 局部性原理 31
2.3 中断和时钟 33
2.3.1 中断和异常 33
2.3.2 系统调用 39
2.3.3 系统时钟 42
2.4 本章小结 44
本章习题 45
第3章 进程管理 47
3.1 进程的引入 47
3.1.1 程序的并发执行及特征 48
3.1.2 进程管理功能 50
3.2 进程的概念 51
3.2.1 进程定义与特征 51
3.2.2 进程状态及转换 52
3.2.3 Linux进程状态解析 53
3.2.4 进程控制块 54
3.3 进程控制 56
3.3.1 进程创建 56
3.3.2 进程撤销 57
3.3.3 进程阻塞与唤醒 57
3.3.4 Linux进程管理 58
3.4 进程同步 64
3.4.1 进程同步的基本概念 64
3.4.2 进程同步机制及应用 66
3.4.3 经典进程同步问题 76
3.4.4 管程机制 80
3.4.5 Linux同步机制解析 83
3.5 进程调度 91
3.5.1 进程调度的基本概念 91
3.5.2 进程调度算法 95
3.5.3 多处理器调度 100
3.5.4 Linux调度算法解析 104
3.6 进程通信 116
3.6.1 进程通信类型 116
3.6.2 消息缓冲队列通信机制 121
3.6.3 Linux进程通信机制 123
3.7 进程死锁 131
3.7.1 死锁的基本概念 131
3.7.2 预防死锁 134
3.7.3 避免死锁 135
3.7.4 死锁的检测与解除 139
3.8 线程机制 142
3.8.1 线程的基本概念 142
3.8.2 线程的实现机制 146
3.8.3 Linux线程机制 149
3.9 openEuler进程管理简介 153
3.9.1 进程控制块 153
3.9.2 进程创建与终止 157
3.9.3 进程调度 158
3.9.4 进程同步 161
3.10 本章小结 163
本章习题 165
第4章 存储器管理 173
4.1 存储器管理概述 173
4.1.1 多级存储器体系 173
4.1.2 存储器管理功能 175
4.1.3 程序的装入和链接 176
4.2 连续存储器管理方式 177
4.2.1 固定分区方式 177
4.2.2 可变分区方式 178
4.3 分页存储管理方式 181
4.3.1 分页存储管理基本原理 181
4.3.2 两级和多级页表 185
4.4 分段存储管理方式 185
4.5 段页式存储管理方式 188
4.6 虚拟存储系统 190
4.6.1 虚拟存储器的基本概念 190
4.6.2 请求分页存储管理方式 191
4.7 Linux内存管理机制 196
4.7.1 Linux地址映射机制 196
4.7.2 Linux物理内存空间管理 201
4.7.3 Linux虚拟地址空间管理 218
4.8 openEuler中的多级页表 223
4.8.1 openEuler的虚拟内存 223
4.8.2 内存管理单元MMU 225
4.8.3 openEuler多级页表 225
4.8.4 加速地址转换 227
4.8.5 标准大页和大页池 227
4.9 本章小结 230
本章习题 231
第5章 设备管理 237
5.1 设备管理的功能 237
5.2 I/O系统 238
5.2.1 设备的分类 238
5.2.2 设备控制器 239
5.2.3 I/O通道 241
5.2.4 I/O系统结构 242
5.3 I/O控制方式 243
5.4 缓冲管理 245
5.4.1 缓冲的引入 245
5.4.2 缓冲的实现机制 246
5.5 I/O软件 249
5.5.1 I/O软件的层次模型 249
5.5.2 独立于设备的软件 250
5.5.3 设备驱动程序的基本概念 252
5.5.4 用户空间的I/O软件 254
5.6 设备分配 255
5.7 SPOOLing系统 256
5.8 Linux字符设备驱动程序 257
5.8.1 Linux字符设备驱动程序基础 257
5.8.2 字符设备驱动程序设计 261
5.8.3 字符设备驱动程序举例 263
5.9 Linux中断处理机制 269
5.9.1 Linux中断处理机制概述 269
5.9.2 中断服务例程的注册和注销 271
5.9.3 上半部的处理过程 272
5.9.4 下半部的实现机制 273
5.10 本章小结 279
本章习题 280
第6章 文件系统 281
6.1 文件和文件系统 282
6.1.1 文件 282
6.1.2 文件系统 283
6.1.3 文件操作 284
6.2 文件的结构和存取 285
6.2.1 文件的逻辑结构 285
6.2.2 文件的物理结构 287
6.2.3 文件存取 292
6.3 文件目录管理 292
6.3.1 文件目录的概念 293
6.3.2 文件目录结构 296
6.3.3 目录检索技术 299
6.4 文件存储空间管理 299
6.5 文件共享和文件保护 304
6.5.1 文件共享 304
6.5.2 文件保护 306
6.6 磁盘调度 309
6.6.1 磁盘管理概述 309
6.6.2 磁盘调度算法 310
6.7 Linux文件系统 312
6.7.1 Linux文件系统概述 312
6.7.2 虚拟文件系统VFS 314
6.7.3 文件系统的注册、安装和卸载 320
6.7.4 Linux文件系统对文件的操作 324
6.7.5 Ext文件系统 329
6.8 本章小结 337
本章习题 338
第7章 操作系统实验 342
7.1 Linux常用工具介绍 342
7.1.1 Linux基本使用 342
7.1.2 查看Linux源码内容工具 347
7.1.3 Linux中的汇编语言 355
7.2 操作系统原理典型算法的模拟实现 359
7.2.1 设计目的和实验环境 359
7.2.2 设计内容 360
7.2.3 实验思考 365
7.3 实验一:Linux内核模块编程 366
7.3.1 设计目的和内容要求 366
7.3.2 Linux内核模块简介 366
7.3.3 内核模块编程基础 367
7.3.4 实验指南 372
7.3.5 添加内核模块或系统调用
备选题目 374
7.4 实验二:Linux内核编译及添加
系统调用 376
7.4.1 设计目的和内容要求 376
7.4.2 Linux系统调用的基本概念 377
7.4.3 Linux添加系统调用的步骤 378
7.4.4 Linux内核编译步骤 380
7.5 实验三:Linux进程管理 383
7.6 实验四:Linux设备驱动程序开发 384
7.6.1 设计目的和内容要求 384
7.6.2 Linux字符设备驱动程序的设计 385
7.6.3 Linux字符设备驱动程序的
编译及加载 388
7.6.4 USB大容量存储设备驱动程序
编写指导 389
7.6.5 USB字符设备驱动程序
编写指导 393
7.7 实验五:简单文件系统的实现 399
7.7.1 设计目的和内容要求 399
7.7.2 预备知识 400
7.7.3 实例系统的设计与实现 402
参考文献 407