基本信息
编辑推荐
Linux老司机的仪表盘——菜鸟与高手的分界线
目录
第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
前言
深圳大学计算机与软件学院正在进行教学改革,基于明仲教授和王志强教授两位领导的构想,计算机与软件学院参照美国纽约宾汉姆敦大学教学要求,将其课程在深圳大学原样重现。对计算机系统系列课程和操作系统课程都进行了改革,其中操作系统课程缩减了理论授课,增加了实验操作环节。同时深圳大学计算机与软件学院计算机系统课程组正在承担广东省教育厅应用型人才培养项目(计算机系统系列核心课课程),强调丰富的动手实践经验并提高系统能力、系统思维。在上述环境下,为了充实实验内容,保持学生在课程学习中全程充实,我们完成了本书以配合理论教学。
在过去的操作系统教学过程中,作者深感理论教学与实践的脱节之困。虽然也有老师讲授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级研究生汤钊扬同学作为第一位读者,协助验证代码和完成勘误工作。
在上述老师和同学的大力支持下,本书终于完稿并与读者见面,再次对他们表示衷心的感谢!
书摘
内存管理
在学习内存管理的时候,需要注意区分虚拟内存、物理内存,以及连续内存管理方式、离散内存管理方式等几个概念的关系。本书假设读者已经学习过操作系统原理性课程,对虚拟内存的工作原理有初步了解。
本章中“物理页帧”通常用“页帧”指代,而虚存空间的页通常用“虚页”指代。
5.1虚存空间管理
首先来观察一个进程内部的进程空间是如何管理的。回顾图22和图23可知,进程空间是一个虚存空间,被分割成两大区域——内核空间(所有进程共享该空间)和进程的用户空间。多个进程各自的虚存空间并存于系统中,形成图28所示的内存子系统完整视图。其中用户空间则是由多个内存区间(VMA)构成,其他未分配的空间不能使用,否则出现非法错误。该进程PCB(struct task_struct)的mm成员(struct mm_struct)描述整个进程用户空间,而mm_struct结构体内部有管理着该进程内部全部的虚存空间(struct vm_area_struct),具体如图23所示。内核空间的管理未进行讨论。
5.1.1进程映像
如果运行HelloWorldgetchar程序,然后用ps获得其PID,就能通过/proc/PID/maps查看这些区间的地址范围和相关属性,如屏显51所示。
屏显51中cat /proc/25085/maps命令输出的是进程25085(即HelloWorldgetchar)内存布局信息。每一行是一个具有特定属性的连续内存区,每行的开头是该区间的地址范围。后面的rwxp分别代表: r=可读、w=可写、x=可执行、s=共享以及p=操作系统之编程观察第5章内存管理屏显51HelloWorldgetchar的内存布局
\\[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