深入理解计算机操作系统 / 关键计算技术核心课程系列教材
定价:¥69.00
作者: 宫晓利,张金,高小鹏
出版时间:2025-12-03
出版社:机械工业出版社
- 机械工业出版社
- 9787111791409
- 1-1
- 564102
- 平装
- 2025-12-03
- 317
内容简介
本书以提升读者的系统能力为目标,构建以工程案例为主线的层层递进的学习路径,通过“文件整理”“矩阵乘法”等实际问题,逐步引入进程、线程、虚拟内存、I/O等操作系统概念,以及cache、指令流水等底层细节,并通过编程实践、观察测量等方法将抽象的知识具象展示出来,再融入调试工具、版本管理、数据分析等系统开发常用的工程技术手段的介绍,使读者深入理解操作系统,并充分利用操作系统的特点,优化系统性能。本书适合作为高校计算机类相关专业操作系统课程的教材或实践教材,也适合对操作系统感兴趣的读者和技术人员阅读。
目录
目 录
丛书序
前言
第一部分 基础知识
第1章 绪论 2
1.1 对操作系统的感性认知 2
1.2 常见的操作系统 2
1.2.1 Windows 3
1.2.2 macOS 5
1.2.3 Linux及其衍生系统 10
1.2.4 HarmonyOS 16
1.3 操作系统的发展历史 16
1.3.1 批处理系统 16
1.3.2 多道程序、分时复用和进程 17
1.3.3 现代个人计算机 17
1.4 操作系统为用户提供的交互方式 17
1.4.1 图形用户界面 18
1.4.2 命令行终端 22
1.4.3 系统API 24
1.5 操作系统支持的典型开发模式 25
1.5.1 shell编程 25
1.5.2 Python编程 26
1.5.3 C语言编程 27
1.5.4 程序性能优化 28
1.6 操作系统的代价 30
第二部分 基础实验
第2章 批量文件重命名 34
2.1 shell是什么 34
2.2 进入shell的方式 35
2.3 shell的原理 35
2.4 shell命令的功能 36
2.5 利用shell进行编程 37
2.5.1 shell的输入/输出 37
2.5.2 变量 38
2.5.3 在shell中进行文件重命名 39
2.5.4 循环与通配符 40
2.6 shell脚本 41
2.6.1 执行shell脚本 42
2.6.2 调试shell脚本 44
2.7 操作系统的运行权限管理 45
2.8 任务实现 46
2.9 shell编程扩展 46
第3章 正则表达式与文本内容过滤 47
3.1 shell编程中的字符串 48
3.1.1 字符串的声明 48
3.1.2 计算字符串的长度 49
3.1.3 字符串的拼接 50
3.1.4 字符串的截取 50
3.2 正则表达式 51
3.2.1 普通字符 52
3.2.2 特殊字符 52
3.2.3 限定符 52
3.2.4 运算符优先级 53
3.3 shell中的文件操作 54
3.4 文本处理任务的实现 57
3.5 Linux中的定时任务 58
3.5.1 何谓定时任务 58
3.5.2 实现定时任务的工具 58
3.5.3 Cron的原理 59
3.5.4 Cron的使用 59
3.6 Linux中的服务管理 62
3.7 延伸阅读 62
3.7.1 独立服务的管理 63
3.7.2 基于xinetd服务的管理 63
3.7.3 源码包服务的管理 63
第4章 单个大规模文件的处理 64
4.1 文件读写相关的系统调用 67
4.1.1 read的原理分析 67
4.1.2 write的原理分析 68
4.1.3 任务实现 68
4.1.4 延伸阅读:GDB、makef?ile的用法 69
4.1.5 使用读写接口产生的内存
消耗 74
4.2 内存映射相关的系统调用 74
4.2.1 mmap的原理 75
4.2.2 缺页异常的处理过程 77
4.2.3 利用user page fault handler/
eBPF的观测分析 78
4.2.4 任务实现 84
4.2.5 延伸阅读:中断事件过程
分析 84
4.3 虚拟内存的管理机制 85
4.3.1 内存资源的观测 86
4.3.2 内存的分配与回收方法 86
第5章 多进程与多线程 89
5.1 Linux的进程管理 89
5.1.1 Linux的进程模型 89
5.1.2 阻塞式系统调用 90
5.2 多进程协作的编程模式 91
5.2.1 进程管理的系统调用 91
5.2.2 进程间通信协作的方式 95
5.2.3 任务实现 97
5.2.4 共享内存的管理 99
5.2.5 多进程的资源消耗 100
5.3 多线程协作的编程模式 101
5.3.1 线程 101
5.3.2 多核心任务调度 102
5.4 线程的编程接口 102
5.4.1 pthread线程库的线程API 103
5.4.2 线程同步的API 104
5.4.3 任务实现 107
5.5 多进程和多线程的对比 109
5.6 延伸阅读:线程的软硬件发展 110
5.6.1 硬件支持的上下文 110
5.6.2 硬件支持的原子指令 111
5.6.3 快速系统调用 111
第6章 多机协作处理 113
6.1 网络编程 113
6.1.1 socket()函数 114
6.1.2 bind()和connect()函数 116
6.1.3 listen()和accept()函数 117
6.1.4 send()函数 118
6.1.5 recv()函数 119
6.2 基础任务实现 119
6.2.1 初始化套接字 120
6.2.2 建立连接 121
6.2.3 传输数据 122
6.2.4 调用命令 122
6.3 多机协作的任务实现 122
6.3.1 实现细节 122
6.3.2 分布式通信协议 124
6.3.3 协议的实现 124
6.4 异常处理 126
6.4.1 操作系统的异常处理
机制 127
6.4.2 C++中的异常处理机制 128
6.5 延伸阅读:MapReduce的设计
理念 131
6.6 分布式系统与单一系统 132
第三部分 进阶实验
第7章 Python矩阵乘法 136
7.1 矩阵乘法的Python实现 136
7.1.1 神经网络中的矩阵乘法 136
7.1.2 Python实现 138
7.2 计时方法:函数调用 142
7.3 性能分析 142
7.4 Python的解释执行机制 144
第8章 C矩阵乘法 147
8.1 矩阵乘法的C语言实现 147
8.1.1 编译执行机制 147
8.1.2 编译器的工作流程 148
8.1.3 编译器的代码优化 149
8.2 编译器中的优化选项 156
8.3 性能分析 157
第9章 面向cache的优化 160
9.1 基础知识 160
9.1.1 存储体系结构 160
9.1.2 cache的工作原理 161
9.1.3 行主序与列主序 164
9.2 面向cache优化矩阵乘法 164
9.2.1 交换循环顺序 165
9.2.2 分块矩阵乘法 168
9.3 性能分析 170
9.3.1 高精度计时方法 170
9.3.2 perf工具 171
9.3.3 评价指标 173
9.3.4 性能对比结果 174
9.4 延伸阅读:进一步提升cache
利用率的方法 176
第10章 多线程优化 179
10.1 多线程的矩阵乘法实现 179
10.1.1 矩阵分块方法 180
10.1.2 多线程实现矩阵乘法 180
10.2 并行化程序的设计思路 182
10.2.1 需求分析与算法确定 183
10.2.2 工作分解 183
10.2.3 选择编程模型 183
10.2.4 性能检查及优化 184
10.3 性能分析 185
10.3.1 选择工作负载 185
10.3.2 加速比的计算 185
10.3.3 算术平均和几何平均 186
10.4 并行化程序的优化 187
10.4.1 优化方案:调整线程数量 187
10.4.2 优化方案:改变矩阵划分
方法 189
10.4.3 看似正确的优化方案 194
10.4.4 锁的实现 195
10.5 延伸阅读 196
10.5.1 缓存一致性协议 196
10.5.2 多线程编程—OpenMP 196
10.5.3 benchmark的制定 200
第11章 面向硬件加速器的优化 203
11.1 SIMD指令的原理 203
11.2 任务实现:基于SIMD指令的
矩阵乘法 207
11.3 延伸阅读:面向SIMD的编译优化和智能优化 212
11.4 加速器的工作原理(以GPU
为例) 213
11.5 任务实现:基于OpenCL的矩阵
乘法 217
11.6 性能分析 229
11.7 数据分段分析 233
11.8 延伸阅读:设备间数据一致性
维护与CXL协议 235
丛书序
前言
第一部分 基础知识
第1章 绪论 2
1.1 对操作系统的感性认知 2
1.2 常见的操作系统 2
1.2.1 Windows 3
1.2.2 macOS 5
1.2.3 Linux及其衍生系统 10
1.2.4 HarmonyOS 16
1.3 操作系统的发展历史 16
1.3.1 批处理系统 16
1.3.2 多道程序、分时复用和进程 17
1.3.3 现代个人计算机 17
1.4 操作系统为用户提供的交互方式 17
1.4.1 图形用户界面 18
1.4.2 命令行终端 22
1.4.3 系统API 24
1.5 操作系统支持的典型开发模式 25
1.5.1 shell编程 25
1.5.2 Python编程 26
1.5.3 C语言编程 27
1.5.4 程序性能优化 28
1.6 操作系统的代价 30
第二部分 基础实验
第2章 批量文件重命名 34
2.1 shell是什么 34
2.2 进入shell的方式 35
2.3 shell的原理 35
2.4 shell命令的功能 36
2.5 利用shell进行编程 37
2.5.1 shell的输入/输出 37
2.5.2 变量 38
2.5.3 在shell中进行文件重命名 39
2.5.4 循环与通配符 40
2.6 shell脚本 41
2.6.1 执行shell脚本 42
2.6.2 调试shell脚本 44
2.7 操作系统的运行权限管理 45
2.8 任务实现 46
2.9 shell编程扩展 46
第3章 正则表达式与文本内容过滤 47
3.1 shell编程中的字符串 48
3.1.1 字符串的声明 48
3.1.2 计算字符串的长度 49
3.1.3 字符串的拼接 50
3.1.4 字符串的截取 50
3.2 正则表达式 51
3.2.1 普通字符 52
3.2.2 特殊字符 52
3.2.3 限定符 52
3.2.4 运算符优先级 53
3.3 shell中的文件操作 54
3.4 文本处理任务的实现 57
3.5 Linux中的定时任务 58
3.5.1 何谓定时任务 58
3.5.2 实现定时任务的工具 58
3.5.3 Cron的原理 59
3.5.4 Cron的使用 59
3.6 Linux中的服务管理 62
3.7 延伸阅读 62
3.7.1 独立服务的管理 63
3.7.2 基于xinetd服务的管理 63
3.7.3 源码包服务的管理 63
第4章 单个大规模文件的处理 64
4.1 文件读写相关的系统调用 67
4.1.1 read的原理分析 67
4.1.2 write的原理分析 68
4.1.3 任务实现 68
4.1.4 延伸阅读:GDB、makef?ile的用法 69
4.1.5 使用读写接口产生的内存
消耗 74
4.2 内存映射相关的系统调用 74
4.2.1 mmap的原理 75
4.2.2 缺页异常的处理过程 77
4.2.3 利用user page fault handler/
eBPF的观测分析 78
4.2.4 任务实现 84
4.2.5 延伸阅读:中断事件过程
分析 84
4.3 虚拟内存的管理机制 85
4.3.1 内存资源的观测 86
4.3.2 内存的分配与回收方法 86
第5章 多进程与多线程 89
5.1 Linux的进程管理 89
5.1.1 Linux的进程模型 89
5.1.2 阻塞式系统调用 90
5.2 多进程协作的编程模式 91
5.2.1 进程管理的系统调用 91
5.2.2 进程间通信协作的方式 95
5.2.3 任务实现 97
5.2.4 共享内存的管理 99
5.2.5 多进程的资源消耗 100
5.3 多线程协作的编程模式 101
5.3.1 线程 101
5.3.2 多核心任务调度 102
5.4 线程的编程接口 102
5.4.1 pthread线程库的线程API 103
5.4.2 线程同步的API 104
5.4.3 任务实现 107
5.5 多进程和多线程的对比 109
5.6 延伸阅读:线程的软硬件发展 110
5.6.1 硬件支持的上下文 110
5.6.2 硬件支持的原子指令 111
5.6.3 快速系统调用 111
第6章 多机协作处理 113
6.1 网络编程 113
6.1.1 socket()函数 114
6.1.2 bind()和connect()函数 116
6.1.3 listen()和accept()函数 117
6.1.4 send()函数 118
6.1.5 recv()函数 119
6.2 基础任务实现 119
6.2.1 初始化套接字 120
6.2.2 建立连接 121
6.2.3 传输数据 122
6.2.4 调用命令 122
6.3 多机协作的任务实现 122
6.3.1 实现细节 122
6.3.2 分布式通信协议 124
6.3.3 协议的实现 124
6.4 异常处理 126
6.4.1 操作系统的异常处理
机制 127
6.4.2 C++中的异常处理机制 128
6.5 延伸阅读:MapReduce的设计
理念 131
6.6 分布式系统与单一系统 132
第三部分 进阶实验
第7章 Python矩阵乘法 136
7.1 矩阵乘法的Python实现 136
7.1.1 神经网络中的矩阵乘法 136
7.1.2 Python实现 138
7.2 计时方法:函数调用 142
7.3 性能分析 142
7.4 Python的解释执行机制 144
第8章 C矩阵乘法 147
8.1 矩阵乘法的C语言实现 147
8.1.1 编译执行机制 147
8.1.2 编译器的工作流程 148
8.1.3 编译器的代码优化 149
8.2 编译器中的优化选项 156
8.3 性能分析 157
第9章 面向cache的优化 160
9.1 基础知识 160
9.1.1 存储体系结构 160
9.1.2 cache的工作原理 161
9.1.3 行主序与列主序 164
9.2 面向cache优化矩阵乘法 164
9.2.1 交换循环顺序 165
9.2.2 分块矩阵乘法 168
9.3 性能分析 170
9.3.1 高精度计时方法 170
9.3.2 perf工具 171
9.3.3 评价指标 173
9.3.4 性能对比结果 174
9.4 延伸阅读:进一步提升cache
利用率的方法 176
第10章 多线程优化 179
10.1 多线程的矩阵乘法实现 179
10.1.1 矩阵分块方法 180
10.1.2 多线程实现矩阵乘法 180
10.2 并行化程序的设计思路 182
10.2.1 需求分析与算法确定 183
10.2.2 工作分解 183
10.2.3 选择编程模型 183
10.2.4 性能检查及优化 184
10.3 性能分析 185
10.3.1 选择工作负载 185
10.3.2 加速比的计算 185
10.3.3 算术平均和几何平均 186
10.4 并行化程序的优化 187
10.4.1 优化方案:调整线程数量 187
10.4.2 优化方案:改变矩阵划分
方法 189
10.4.3 看似正确的优化方案 194
10.4.4 锁的实现 195
10.5 延伸阅读 196
10.5.1 缓存一致性协议 196
10.5.2 多线程编程—OpenMP 196
10.5.3 benchmark的制定 200
第11章 面向硬件加速器的优化 203
11.1 SIMD指令的原理 203
11.2 任务实现:基于SIMD指令的
矩阵乘法 207
11.3 延伸阅读:面向SIMD的编译优化和智能优化 212
11.4 加速器的工作原理(以GPU
为例) 213
11.5 任务实现:基于OpenCL的矩阵
乘法 217
11.6 性能分析 229
11.7 数据分段分析 233
11.8 延伸阅读:设备间数据一致性
维护与CXL协议 235















