操作系统之编程观察

操作系统之编程观察 pdf epub mobi txt 电子书 下载 2025

罗秋明 著
图书标签:
  • 操作系统
  • 编程
  • 计算机科学
  • 底层原理
  • 内核
  • 系统编程
  • x86
  • 汇编
  • 实践
  • 代码分析
想要找书就要到 静思书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302489733
版次:1
商品编码:12342973
包装:平装
开本:16开
出版时间:2018-04-01
用纸:纯质纸
页数:315
字数:410000

具体描述

内容简介

本书弥合了操作系统理论课程和操作系统编码实现之间的断层。以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级研究生汤钊扬同学作为第一位读者,协助验证代码和完成勘误工作。

在上述老师和同学的大力支持下,本书终于完稿并与读者见面,再次对他们表示衷心的感谢!



《代码深处:理解与构建现代软件系统》 简介: 在这本名为《代码深处:理解与构建现代软件系统》的书籍中,我们并非聚焦于某个特定的技术领域,或是罗列堆砌冰冷的概念。相反,我们致力于深入探寻软件开发的核心,以一种观察者和实践者的视角,剖析那些构成现代软件系统基石的原理、模式与实践。本书旨在引导读者超越表面的语法和框架,去理解“为什么”和“如何”——为什么某些设计决策得以流传至今,又如何构建出健壮、高效且易于维护的软件。 我们相信,真正的软件工程艺术在于对底层机制的深刻洞察,以及将这些洞察转化为实际代码的能力。因此,本书的结构并非线性地介绍某种特定技术的演进,而是从多个维度,层层递进地揭示软件系统是如何运转的。我们将首先从更宏观的视角出发,探讨软件系统设计的哲学,以及在面对复杂性时,我们应该如何思考。这包括对抽象、模块化、封装等基本原则的深入剖析,以及理解它们如何在不同层级的软件中得到体现。 随后,我们将把目光聚焦到代码本身的艺术。我们不会提供“速成”的秘籍,而是引导读者去审视代码的“可读性”、“可维护性”和“可扩展性”。本书将详细探讨代码风格、命名约定、注释的艺术,以及如何通过清晰的结构和逻辑来降低代码的认知负担。更重要的是,我们将深入研究设计模式,但不是将其视为僵化的模板,而是作为解决常见问题的经过时间考验的智慧结晶。我们将从动机、结构、优缺点以及适用场景等角度,深入分析各种设计模式,并结合实际的编程示例,展示它们如何在真实世界中发挥作用。 在构建大型软件系统时,数据管理是不可或缺的一环。本书将花大量篇幅讨论数据结构和算法。我们不会仅仅停留在理论层面,而是将重点放在如何选择最合适的数据结构来优化性能,以及如何设计高效的算法来解决实际问题。从数组、链表、树、图到哈希表,我们都将探讨它们的内在工作原理,以及在不同场景下的表现。算法部分,我们将涵盖排序、搜索、图遍历、动态规划等经典算法,并强调理解它们的复杂度和时间、空间复杂度分析的重要性。我们将通过实例,展示如何将这些理论知识转化为清晰、高效的代码。 对于现代软件开发而言,并发与并行处理是提升性能和响应能力的关键。本书将深入浅出地讲解并发编程的基本概念,包括线程、进程、锁、信号量等。我们还将探讨常见的并发模型,如Actor模型、CSP(Communicating Sequential Processes)等,并分析它们在不同编程语言和环境中的应用。理解并发带来的挑战,如死锁、竞态条件等,以及如何有效地规避它们,是本书的重要组成部分。我们将通过详实的示例,展示如何编写线程安全的代码,并利用并行处理来加速计算密集型任务。 网络通信是现代软件系统不可或缺的组成部分,无论是分布式系统、Web服务还是移动应用,都离不开网络的支持。本书将深入探讨网络通信的原理,从TCP/IP协议栈到HTTP协议,我们将一层一层地揭开网络通信的神秘面纱。我们将探讨客户端-服务器架构,RESTful API的设计原则,以及异步I/O在网络编程中的应用。此外,我们还将触及消息队列、负载均衡等分布式系统中的关键技术,帮助读者理解构建可扩展、高可用性网络服务的核心要素。 在软件开发的生命周期中,测试扮演着至关重要的角色。本书将强调测试的价值,并介绍各种有效的测试策略和技术。我们将深入讲解单元测试、集成测试、端到端测试的理念和实践,并探讨如何编写有意义的测试用例。对于测试框架的选择和使用,以及如何利用自动化测试来提高开发效率和软件质量,本书都将提供详实的指导。我们还将讨论代码覆盖率、测试驱动开发(TDD)等概念,帮助读者建立起严谨的测试思维。 随着软件系统的日益复杂,性能优化和资源管理成为持续的挑战。本书将引导读者掌握性能分析和调优的技巧。我们将介绍各种性能分析工具的使用,以及如何通过监控、日志分析等手段来定位性能瓶颈。同时,我们将探讨内存管理、CPU调度、I/O优化等底层机制,并提供实用的代码优化策略,帮助读者编写出更高效、更具响应性的软件。 最后,本书将触及软件开发的实践层面,包括版本控制、持续集成/持续部署(CI/CD)等现代开发流程中的关键环节。我们相信,良好的开发流程能够极大地提升团队的协作效率和软件交付的速度。我们将强调Git等版本控制系统的核心概念和常用命令,并介绍CI/CD流水线如何自动化构建、测试和部署过程。 《代码深处:理解与构建现代软件系统》并非一本“说明书”或“字典”,而是一次思维的旅程。我们希望通过这本书,能够激发读者对软件本质的好奇心,培养他们独立思考和解决问题的能力,最终帮助他们成为更优秀、更具洞察力的软件工程师。本书适合所有对软件开发怀有热情,并希望深入理解其核心原理的开发者,无论您是初学者还是经验丰富的从业者,都能从中获得启发和价值。我们将一起探索代码的深处,理解软件的灵魂,并学会如何构建出真正有价值的现代软件系统。

用户评价

评分

这本书的装帧质量相当不错,纸张的触感也很好,拿到手里就觉得是本值得细细品读的书。我一直以来都对计算机的底层原理充满好奇,尤其是操作系统这个核心组件,感觉它就像是整个计算机世界的“管家”,处理着各种各样复杂的任务。我之前读过一些操作系统的教科书,但总觉得它们过于偏重理论,对于一个像我这样的开发者来说,有些难以与实际的编程联系起来。这本书的“编程观察”这个名字,正是我所需要的。我期待它能够提供一些更加贴近实际开发场景的视角,让我能够理解代码是如何在操作系统的调度下运行的,如何与硬件进行交互的。我希望能学到一些能够帮助我写出更高效、更稳定代码的知识。比如,在并发编程中,如何更好地利用操作系统的特性来避免死锁和竞态条件,或者在内存管理方面,如何写出更节省内存的代码。总之,我希望这本书能成为我从一个“代码使用者”向一个“理解原理的开发者”转变的重要桥梁。

评分

我平时是个比较注重实践的学习者,拿到一本新书,我最先关注的往往是它的案例和代码。这本书到货后,我迫不及待地翻到了后面的章节,看有没有一些实际操作的指导。封面设计虽然朴实,但给人一种踏实的感觉,不像有些书那样花里胡哨。我一直对操作系统如何管理硬件资源、如何调度任务这些问题感到好奇,总觉得那些底层的东西才是计算机运行的灵魂。我看了一下目录,似乎涵盖了操作系统很多重要的方面,比如文件系统、设备驱动等等,这些都是我比较陌生的领域,但又觉得非常关键。如果书中的讲解能够结合一些实际的例子,比如如何通过代码来观察进程的行为,或者如何理解文件是如何在磁盘上存储的,那我一定会学得更有劲头。我希望这本书能让我理解“为什么”会这样,而不是仅仅知道“是什么”。毕竟,只有理解了原理,才能更好地进行开发和优化。我个人有个习惯,就是边读边做笔记,然后尝试去复现书中的一些例子,看看能不能跑起来,能不能达到预期的效果。所以,对于这本书,我非常期待它能给我带来一些能实际操作的灵感。

评分

拿到这本书,首先映入眼帘的是它那简洁而又不失专业的封面设计。我一直认为,好的技术书籍,外观往往能传递出一种严谨和可靠的信号。我之前在学习编程的过程中,经常会遇到一些“黑盒”问题,比如程序为什么会突然变得很慢,或者为什么会发生内存泄漏,这些问题往往都指向了操作系统的深层机制,而我之前对这方面的了解可以说是一片空白。这本书吸引我的地方在于它强调“编程观察”,这个词让我觉得它不是一本纯理论的书籍,而是鼓励读者去动手实践,去验证理论。我个人非常喜欢这种将理论与实践相结合的学习方式。我期待书中能够有详细的步骤和清晰的图示,带领我一步一步地去理解操作系统的运作原理。同时,我也希望书中能包含一些关于调试和性能优化的技巧,这对于我这个阶段的学习者来说,会非常有帮助。能够通过这本书,建立起对操作系统更清晰、更系统的认知,从而在未来的编程道路上少走弯路,这是我最大的期望。

评分

这本书的包装比我想象中的要扎实许多,封面设计也挺别致的,那种沉稳的蓝色调,配上烫金的字体,给人一种厚重感,仿佛里面藏着不少宝藏。我一直对计算机底层的东西很感兴趣,但又苦于找不到合适的入门书籍,很多技术类的书要么太晦涩难懂,要么就是泛泛而谈,看得我云里雾里。听朋友推荐说这本书讲解得比较透彻,于是就抱着试试看的心态下单了。拿到手之后,翻开目录,初步看起来似乎内容不少,但愿真的能像朋友说的那样,把我从“小白”级别提升一点点。我比较期待的是书中对一些核心概念的解释,比如进程、线程、内存管理这些,希望它能用更直观、更易懂的方式来呈现,而不是干巴巴的术语堆砌。我个人平时喜欢把学到的知识和实际操作结合起来,所以如果书中能有一些代码示例,或者引导读者去思考如何实际应用,那就更好了。总之,对这本书抱有相当大的期待,希望能通过它,对操作系统有一个更深入的理解,也为我之后学习更高级的编程技术打下坚实的基础。

评分

这本书的封面设计很耐看,没有那种浮夸的广告风格,给人的感觉就是那种“干货满满”的书。我之所以会选择这本书,是因为我总感觉自己在编程时,就像是在使用一个被封装好的“黑盒子”,我能调用各种API,但对底层的原理却知之甚少。尤其是在处理一些复杂的并发场景或者内存相关的问题时,常常会感到力不从心。听说这本书能够从编程者的角度去观察和理解操作系统,我对此深感好奇。我希望能通过这本书,了解进程和线程之间是如何切换的,内存是如何分配和回收的,以及文件系统是如何工作的。如果书中有提供一些实用的工具或者方法,能够让我直接“看到”操作系统的内部活动,那就太棒了。我希望这本书能够帮助我打破对操作系统的“盲区”,让我能够更自信、更深入地去进行软件开发。期待它能为我带来一些全新的视角和实用的技巧。

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.idnshop.cc All Rights Reserved. 静思书屋 版权所有