发表于2024-11-23
操作系统之编程观察 pdf epub mobi txt 电子书 下载
本书弥合了操作系统理论课程和操作系统编码实现之间的断层。以Linux真实操作系统为观察对象,主要利用proc文件系统展示出来的内核行为数据来讲述操作系统的核心概念。
目录
第1章Linux安装与访问1
1.1安装Linux1
1.1.1下载CentOS 71
1.1.2CentOS 7安装3
1.2虚拟机安装Linux9
1.2.1VirtualBox安装9
1.2.2虚拟机配置17
1.2.3虚拟机安装Linux19
1.3ssh远程终端访问21
1.4初次接触Linux24
1.4.1简单操作24
1.4.2运行HelloWorld程序29
1.4.3操作系统接口32
1.5阅读注意事项33
1.6本章小结34
第2章进程控制35
2.1进程基本概念35
2.1.1进程实体37
2.1.2进程间组织关系38操作系统之编程观察目录2.1.3进程控制命令42
2.2创建与撤销进程44
2.2.1fork()创建子进程44
2.2.2孤儿进程和僵尸进程47
2.2.3exec函数族49
2.2.4通过kill()撤销进程51
2.2.5创建守护进程51
2.3创建pthread线程56
2.3.1进程与线程57
2.3.2创建方法58
2.4进程和线程资源开销60
2.4.1PCB开销60
2.4.2内存描述符开销63
2.5本章小结64
2.6练习65
第3章进程调度66
3.1调度与均衡66
3.1.1调度与均衡框架71
3.1.2全系统的调度统计72
3.2进程状态及其转变75
3.2.1进程状态75
3.2.2状态转换80
3.2.3进程的调度统计83
3.3进程的调度88
3.3.1普通进程的CFS调度88
3.3.2实时进程调度93
3.4进程迁移与负载均衡103
3.4.1CFS进程的负载均衡104
3.4.2实时进程的负载均衡111
3.5本章小结114
3.6练习114
第4章进程间通信与同步115
4.1进程间通信115
4.1.1管道115
4.1.2System V IPC120
4.2进程间同步133
4.2.1System V IPC信号量集133
4.2.2POSIX信号量145
4.3本章小结154
4.4练习154
第5章内存管理156
5.1虚存空间管理156
5.1.1进程映像156
5.1.2堆区161
5.1.3文件映射区168
5.1.4栈区171
5.1.5访问任意进程的虚存176
5.1.6虚存使用的物理页帧179
5.2分页机制与页表181
5.2.1分页机制182
5.2.2进程页表186
5.3物理内存组织管理193
5.3.1页帧、节点、内存域193
5.3.2空闲页帧管理——buddy系统200
5.3.3物理内存分配与回收204
5.3.4内存回收215
5.4本章小结227
5.5练习228
第6章综合——新进程创建到运行229
6.1shell读入命令229
6.1.1用户空间与内核空间229
6.1.2读入命令231
6.2创建进程237
6.2.1fork()复制进程237
6.2.2替换进程映像238
6.2.3开始运行新进程239
6.2.4进程映像与缺页240
6.3本章小结240
6.4练习241
第7章VFS文件系统242
7.1VFS242
7.1.1VFS对象243
7.1.2文件系统类型245
7.2文件基本操作246
7.2.1命令行基本操作246
7.2.2编程接口248
7.3目录结构253
7.3.1树形结构253
7.3.2软/硬链接254
7.3.3文件系统创建与安装258
7.4页缓存264
7.4.1页缓存基本概念265
7.4.2页缓存动态变化266
7.5非文件功能268
7.5.1交换268
7.5.2设备接口273
7.5.3proc文件系统279
7.6本章小结280
7.7练习280
第8章EXT2文件系统281
8.1EXT2磁盘数据的组织281
8.1.1整体布局281
8.1.2超级块283
8.1.3块组描述符285
8.1.4索引节点286
8.1.5目录结构289
8.2EXT2文件系统的创建291
8.2.1分配磁盘空间291
8.2.2创建环回设备292
8.2.3创建EXT2文件系统293
8.2.4安装文件系统293
8.3查看EXT2磁盘数据294
8.3.1布局信息294
8.3.2块组描述符299
8.3.3索引节点与文件内容300
8.3.4目录结构304
8.4本章小结309
8.5练习310
附录vi编辑命令311
第5章
内存管理
在学习内存管理的时候,需要注意区分虚拟内存、物理内存,以及连续内存管理方式、离散内存管理方式等几个概念的关系。本书假设读者已经学习过操作系统原理性课程,对虚拟内存的工作原理有初步了解。
本章中“物理页帧”通常用“页帧”指代,而虚存空间的页通常用“虚页”指代。
5.1虚存空间管理
首先来观察一个进程内部的进程空间是如何管理的。回顾图2��2和图2��3可知,进程空间是一个虚存空间,被分割成两大区域——内核空间(所有进程共享该空间)和进程的用户空间。多个进程各自的虚存空间并存于系统中,形成图2��8所示的内存子系统完整视图。其中用户空间则是由多个内存区间(VMA)构成,其他未分配的空间不能使用,否则出现非法错误。该进程PCB(struct task_struct)的mm成员(struct mm_struct)描述整个进程用户空间,而mm_struct结构体内部有管理着该进程内部全部的虚存空间(struct vm_area_struct),具体如图2��3所示。内核空间的管理未进行讨论。
5.1.1进程映像
如果运行HelloWorld�瞘etchar程序,然后用ps获得其PID,就能通过/proc/PID/maps查看这些区间的地址范围和相关属性,如屏显5��1所示。
屏显5��1中cat /proc/25085/maps命令输出的是进程25085(即HelloWorld�瞘etchar)内存布局信息。每一行是一个具有特定属性的连续内存区,每行的开头是该区间的地址范围。后面的rwxp分别代表: r=可读、w=可写、x=可执行、s=共享以及p=操作系统之编程观察第5章内存管理屏显5��1HelloWorld�瞘etchar的内存布局
[lqm@localhost ~]$ps
PID TTYTIME CMD
4330 pts/000:00:00 bash
25085 pts/000:00:00 HelloWorld-getc
25090 pts/000:00:00 ps
[lqm@localhost ~]$cat /proc/25085/maps
00400000-00401000 r-xp 00000000 fd:00 12641267/home/lqm/HelloWorld-getchar
00600000-00601000 r--p 00000000 fd:00 12641267 /home/lqm/HelloWorld-getchar
00601000-00602000 rw-p 00001000 fd:00 12641267 /home/lqm/HelloWorld-getchar
7f0e039a7000-7f0e03b5d000 r-xp 00000000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03b5d000-7f0e03d5d000 ---p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d5d000-7f0e03d61000 r--p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d61000-7f0e03d63000 rw-p 001ba000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d63000-7f0e03d68000 rw-p 00000000 00:00 0
7f0e03d68000-7f0e03d88000 r-xp 00000000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f70000-7f0e03f73000 rw-p 00000000 00:00 0
7f0e03f84000-7f0e03f87000 rw-p 00000000 00:00 0
7f0e03f87000-7f0e03f88000 r--p 0001f000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f88000-7f0e03f89000 rw-p 00020000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f89000-7f0e03f8a000 rw-p 00000000 00:00 0
7ffe7dc5e000-7ffe7dc7f000 rw-p 00000000 00:00 0 [stack]
7ffe7dd0a000-7ffe7dd0c000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
[lqm@localhost ~]$
序
深圳大学计算机与软件学院正在进行教学改革,基于明仲教授和王志强教授两位领导的构想,计算机与软件学院参照美国纽约宾汉姆敦大学教学要求,将其课程在深圳大学原样重现。对计算机系统系列课程和操作系统课程都进行了改革,其中操作系统课程缩减了理论授课,增加了实验操作环节。同时深圳大学计算机与软件学院计算机系统课程组正在承担广东省教育厅应用型人才培养项目(计算机系统系列核心课课程),强调丰富的动手实践经验并提高系统能力、系统思维。在上述环境下,为了充实实验内容,保持学生在课程学习中全程充实,我们完成了本书以配合理论教学。
在过去的操作系统教学过程中,作者深感理论教学与实践的脱节之困。虽然也有老师讲授Linux工程实践和系统编程,从而拉近了两者的距离,但都还未能与操作系统的核心概念紧密联系,仍似隔靴搔痒,可望而不可即。另外也考虑过将Linux内核源码分析或增强作为实践内容,但是由于学习曲线过于陡峭需要花费太多的时间,并不太适合作为课程内容——难以在一个学期课程中结合进来,甚至还可能让学生产生无功而返的挫败感。
根据我们在个人高性能计算机(PHPC)系统研制过程中对研究生培养的经验积累,将Linux系统编程的基础知识结合Linux的内核行为观察,利用/proc文件系统中探测到的内核数据,以及其他各种工具收集的内核数据,直观生动地将进程与内核的交互、内核的行为展示给学生,获得非常好的学习效果。学生对进程行为、内存分配管理、进程间通信和文件系统等各方面的认知,都远比传统的操作系统课程教学效果好。
读者在学习和体验操作系统各种概念的同时,也获得了初步的系统编程实践锻炼,并为进一步阅读Linux内核源代码做好了充足的准备。将proc文件系统和相关工具加入到操作系统的学习过程中,相当于有了电路系统课程中的“万用表、示波器和逻辑分析仪”等工具,有了观测工具后,操作系统的教学和实验才算基本成熟了。正因为这些观测工具,使得一些读者在完成全书学习后可能会觉得: “哦,原来这才是操作系统!”经过这样的实践锻炼后,读者不仅可以在后续学习中加快系统编程的学习进度,还可以加快获得分析和修改Linux内核代码能力的培养进程。
本书是作者这些年在本科教学和研究生培养过程中积累的经验汇总,相信读者会喜欢。
限于作者的水平和能力,书中会有疏漏,欢迎读者指正。
编者
2018年4月操作系统之编程观察
致谢
本书获得深圳市科创委基础研究JCYJ20150930105133185项目和JCYJ20170302153920897云环境中的异构存储资源分配与性能优化研究的资助。感谢深圳大学计算机与软件学院操作系统课程组的各位老师,大家一起完成了操作系统实验课程的改革,特别是张滇和周明洋两位老师在相关实验内容的检查和教学工作中做出了极大的贡献。
还需要感谢2014级几位同学在相关的材料整理和实验代码的设计中做出的贡献。其中林润胜同学完成了第5章的匿名映射、文件映射、meminfo和zoneinfo解读及相关代码,第8章的EXT2文件系统中文件内容读取、目录读取及相关代码,协助完成了第6章的勘误;张永昌同学完成了5.1.1节、7.3.3节的内容和相应的代码。这两位同学一起提供了5.3.3节的部分内容,完成了第5章内存管理和第8章EXT2文件系统的勘误工作。罗文杰同学完成了4.2.1节的信号量集相关代码和材料。2017级研究生汤钊扬同学作为第一位读者,协助验证代码和完成勘误工作。
在上述老师和同学的大力支持下,本书终于完稿并与读者见面,再次对他们表示衷心的感谢!
操作系统之编程观察 pdf epub mobi txt 电子书 下载