《代码大全2》(英文限量珍藏版)《程序员修炼之道》《计算机程序的构造和解释》《C程序设计语言》《算法导论》《重构 改善既有代码的设计》《人月神话》《设计模式》(典藏版)《计算机程序设计艺术》《编译原理》《深入浅出设计模式》《代码整洁之道》《编程珠玑》《修改软件的艺术》《编码:隐匿在计算机软硬件背后的语言》《黑客与画家》《深入理解计算机系统》《HTTP权威指南》《重来》《集体智慧编程》《活着》《编程之美》《程序员思维修炼》《系统化思维导论》《大话数据结构》《UNIX网络编程》《高性能Linux服务器运维实战》《TCP/IP详解》《计算机网络:自顶向下方法》《UNIX环境高级编程》《程序员的自我修养》《数据密集型应用系统设计》《现代操作系统》《操作系统真象还原》《Windows核心编程》《深入理解LINUX内核》《传世经典书丛:UNIX编程艺术》《清醒思考的艺术》《C和指针》《C专家编程》《C 陷阱与缺陷》《C++ Primer Plus》《STL源码剖析》《Effective C++》《深度探索C++对象模型》《Java核心技术》《Effective Java中文版》《深入理解Java虚拟机》《Java并发编程实战》《轻量级Java Web整合开发》《精通Spring》《Java编程思想》《Java性能权威指南》《大话设计模式》《图解HTTP》《Redis实战》《Redis设计与实现》《高性能MySQL》《鸟哥的Linux私房菜》《Spring Cloud Alibaba微服务原理与实战》《第一本Docker书》《MySQL必知必会》《MySQL技术内幕:InnoDB存储引擎》《深入浅出MySQL》《SQL基础教程》《CSS权威指南》《CSS揭秘》《CSS世界》《Head First HTML与CSS》《零基础学HTML5+CSS3》《HTML5+CSS3+JavaScript从入门到精通》《JavaScript DOM编程艺术》《JavaScript高级程序设计》《JavaScript语言精粹》《你不知道的JavaScript 》《JavaScript设计模式与开发实践》《ES6标准入门》《深入理解ES6》《高性能JavaScript》《数据结构与算法JavaScript描述》《JavaScript ES6 函数式编程入门经典》《HTML5权威指南》《锋利的jQuery》《深入React技术栈》《React状态管理与同构实战》《React进阶之路》《React学习手册》《React Native移动开发实战》《React+Redux前端开发实战》《Spring Boot+Vue全栈开发实战》《Vue.js项目实战》《Vue.js入门与商城开发实战》《Vue.js 从入门到实战》《Vue.js实战》《深入浅出Node.js》《Node.js实战》《Node.js无服务器应用实战》《Node与Express开发》《编写可维护的JavaScript》《大型网站技术架构 核心原理与案例分析》《Web性能权威指南》《点石成金》

《现代操作系统》

点击购买

内容简介

本书是操作系统领域的经典教材,主要内容包括进程与线程、内存管理、文件系统、输入/输出、死锁、虚拟化和云、多处理机系统、安全,以及关于UNIX、Linux、Android和Windows的实例研究等。第4版对知识点进行了全面更新,反映了当代操作系统的发展与动向。本书适合作为高等院校计算机专业的操作系统课程教材,也适合相关技术人员参考。


目录

第1章 引论1
1.1 什么是操作系统2
1.1.1 作为扩展机器的操作系统2
1.1.2 作为资源管理者的操作系统3
1.2 操作系统的历史4
1.2.1 第一代(1945~1955):真空管和穿孔卡片4
1.2.2 第二代(1955~1965):晶体管和批处理系统4
1.2.3 第三代(1965~1980):集成电路和多道程序设计6
1.2.4 第四代(1980年至今):个人计算机8
1.2.5 第五代(1990年至今):移动计算机10
1.3 计算机硬件简介11
1.3.1 处理器12
1.3.2 存储器14
1.3.3 磁盘15
1.3.4 I/O设备16
1.3.5 总线18
1.3.6 启动计算机19
1.4 操作系统大观园20
1.4.1 大型机操作系统20
1.4.2 服务器操作系统20
1.4.3 多处理器操作系统20
1.4.4 个人计算机操作系统20
1.4.5 掌上计算机操作系统21
1.4.6 嵌入式操作系统21
1.4.7 传感器节点操作系统21
1.4.8 实时操作系统21
1.4.9 智能卡操作系统21
1.5 操作系统概念22
1.5.1 进程22
1.5.2 地址空间23
1.5.3 文件23
1.5.4 输入/输出25
1.5.5 保护25
1.5.6 shell25
1.5.7 个体重复系统发育26
1.6 系统调用28
1.6.1 用于进程管理的系统调用31
1.6.2 用于文件管理的系统调用32
1.6.3 用于目录管理的系统调用32
1.6.4 各种系统调用34
1.6.5 Windows Win32 api34
1.7 操作系统结构35
1.7.1 单体系统36
1.7.2 层次式系统36
1.7.3 微内核37
1.7.4 客户端–服务器模式38
1.7.5 虚拟机39
1.7.6 外核41
1.8 依靠C的世界41
1.8.1 C语言41
1.8.2 头文件41
1.8.3 大型编程项目43
1.8.4 运行模型43
1.9 有关操作系统的研究44
1.10 本书其他部分概要45
1.11 公制单位45
1.12 小结46
习题46
第2章 进程与线程48
2.1 进程48
2.1.1 进程模型48
2.1.2 进程的创建49
2.1.3 进程的终止51
2.1.4 进程的层次结构51
2.1.5 进程的状态51
2.1.6 进程的实现53
2.1.7 多道程序设计模型54
2.2 线程54
2.2.1 线程的使用54
2.2.2 经典的线程模型57
2.2.3 POSIX线程60
2.2.4 在用户空间中实现线程60
2.2.5 在内核中实现线程63
2.2.6 混合实现63
2.2.7 调度程序激活机制64
2.2.8 弹出式线程64
2.2.9 使单线程代码多线程化65
2.3 进程间通信67
2.3.1 竞争条件67
2.3.2 临界区68
2.3.3 忙等待的互斥68
2.3.4 睡眠与唤醒71
2.3.5 信号量73
2.3.6 互斥量74
2.3.7 管程78
2.3.8 消息传递81
2.3.9 屏障82
2.3.10 避免锁:读–复制–更新83
2.4 调度84
2.4.1 调度简介84
2.4.2 批处理系统中的调度88
2.4.3 交互式系统中的调度89
2.4.4 实时系统中的调度92
2.4.5 策略和机制93
2.4.6 线程调度93
2.5 经典的IPC问题94
2.5.1 哲学家就餐问题94
2.5.2 读者–写者问题96
2.6 有关进程与线程的研究97
2.7 小结97
习题98
第3章 内存管理102
3.1 无存储器抽象102
3.2 一种存储器抽象:地址空间104
3.2.1 地址空间的概念104
3.2.2 交换技术106
3.2.3 空闲内存管理107
3.3 虚拟内存109
3.3.1 分页110
3.3.2 页表112
3.3.3 加速分页过程112
3.3.4 针对大内存的页表114
3.4 页面置换算法117
3.4.1 最优页面置换算法117
3.4.2 最近未使用页面置换算法118
3.4.3 先进先出页面置换算法118
3.4.4 第二次机会页面置换算法118
3.4.5 时钟页面置换算法119
3.4.6 最近最少使用页面置换算法119
3.4.7 用软件模拟LRU120
3.4.8 工作集页面置换算法121
3.4.9 工作集时钟页面置换算法123
3.4.10 页面置换算法小结124
3.5 分页系统中的设计问题124
3.5.1 局部分配策略与全局分配策略124
3.5.2 负载控制126
3.5.3 页面大小126
3.5.4 分离的指令空间和数据空间127
3.5.5 共享页面128
3.5.6 共享库128
3.5.7 内存映射文件130
3.5.8 清除策略130
3.5.9 虚拟内存接口130
3.6 有关实现的问题131
3.6.1 与分页有关的工作131
3.6.2 缺页中断处理131
3.6.3 指令备份132
3.6.4 锁定内存中的页面132
3.6.5 后备存储133
3.6.6 策略和机制的分离134
3.7 分段134
3.7.1 纯分段的实现136
3.7.2 分段和分页结合:MULTICS136
3.7.3 分段和分页结合:Intel x86138
3.8 有关内存管理的研究141
3.9 小结141
习题142
第4章 文件系统147
4.1 文件148
4.1.1 文件命名148
4.1.2 文件结构149
4.1.3 文件类型149
4.1.4 文件访问151
4.1.5 文件属性151
4.1.6 文件操作152
4.1.7 使用文件系统调用的一个示例程序152
4.2 目录154
4.2.1 一级目录系统154
4.2.2 层次目录系统154
4.2.3 路径名154
4.2.4 目录操作156
4.3 文件系统的实现157
4.3.1 文件系统布局157
4.3.2 文件的实现157
4.3.3 目录的实现160
4.3.4 共享文件162
4.3.5 日志结构文件系统163
4.3.6 日志文件系统164
4.3.7 虚拟文件系统165
4.4 文件系统管理和优化167
4.4.1 磁盘空间管理167
4.4.2 文件系统备份171
4.4.3 文件系统的一致性174


前言/序言

前言

如果你是一位软件行业从业者,尤其是从事服务器端或者后台系统软件开发,相信近年来一定被层出不穷的商业名词所包围:NoSQL、Big Data、Web-scale、Sharding、Eventual consistency、ACID、CAP理论、云服务、MapReduce和Real-time等,所有这些其实都围绕着如何构建高效存储与数据处理这一核心主题。

过去十年,在数据库领域与分布式系统方面涌现了许多引人瞩目的进展,由此深刻地影响了如何构建上层应用系统。分析这些激动人心的变化背后,你会发现有以下几个非常重要的驱动因素:

• 互联网公司,包括Google、Yahoo! 、Amazon、Facebook、LinkedIn、Microsoft,以及Twitter等,它们每天都在面对海量数据和负载,迫使其不断创新,并改进支撑系统以更有效地处理这种量级的数据。

• 商业方面因素,如敏捷开发、测试驱动和对市场机会做出快速反应等,都要求尽量缩短产品开发周期,因此系统中的数据模型也要足够灵活以方便调整。

• 免费及开源软件现在已经非常成功,在很多领域足以取代商业或者定制软件。

• 硬件方面,CPU主频增长日趋缓慢,而多核系统成为新常态,网络速度则依旧保持快速发展,这就意味着并行分布式系统将会成为业界主流。

• 如今一个不起眼的小公司,也完全有能力构建起大型分布式系统:跨机器甚至跨地域的数据中心,因为现在有了逐渐普及的IaaS云服务(例如AWS)。

• 很多服务现在都要求高可用。道理很简单,系统失效或者维护时间越长,其损失代价越大,甚至大到无法承受。

正是由于这些技术,“数据密集型应用”(>目前已经有足够丰富的技术或者工具来辅助、帮助我们开发自己的数据密集型应用,包括存储、处理等方面,而这些技术本身也在快速演进之中。例如很多人在关注新的NoSQL系统,但实际上消息队列、缓存、搜索引擎、批处理与流处理框架等相关技术也非常重要,事实上,很多应用系统总是会集成组合上述多种技术。

开篇所罗列的那一堆商业味颇浓的名词,某种程度上也彰显了当前大时代氛围,机会多自是好事。然而,作为一名软件工程师或者架构师,仍需秉持严谨的态度,深入理解繁杂词汇背后系统设计所面临的优劣权衡,只有这样才能为我所用,构建好自己的系统。所以,抛开那些商业名词,我们要的是深入的探索。

幸好,软件千变万化,终有若干理念贯穿其中。无论你用的什么数据系统,如果可以掌握背后的设计理念,何种工具适用于何种场景,如何最佳使用,又有哪些陷阱(坑),诸如此类,自然会胸有成竹,而这也是本书写作的初衷。

所以,本书旨在帮助大家更好地驾驭处理数据和存储数据相关技术。它不是针对某个特定软件的介绍手册,也不是纯理论的习题。我们会深入探讨一些成功的数据系统案例,剖析其中的技术要点;或许在很多流行的分布式系统里都有它们的身影,正是这些关键技术有效应对了许多生产环境对扩展性、性能和可靠性的苛刻要求。

我们将对这些典型系统深入展开讨论,梳理其核心算法,探讨其设计理念和背后的权衡之道。在此过程中,尝试总结某些经验法则来重新审视系统架构。了解怎么工作自然重要,但更重要的是要思考它为什么这样工作,正所谓“知其然,知其所以然”。

读完本书之后,你应该会对哪些技术适用于哪些场景,常见工具如何搭配来构建应用系统等有所得。或许你不会马上就决定动手开发一个全新的数据库引擎(这几乎完全不需要),但是,关于系统的本质,相信你一定有新的认识与判断力:系统行为是否合理,架构设计如果权衡,个中症状如何处理等,将会更加游刃有余。

本书适合哪些读者?

首先你的应用如果包含服务器端、后台逻辑来存储、处理数据,或者你的应用需要联网,例如Web程序、移动程序以及联网的传感器等,这本书将非常适合。

本书主要针对软件工程师、软件架构师以及技术经理等,特别是那些需要对系统架构做出权衡决定的人,例如需要选择一些工具和软件来解决特定问题,或者如何最佳适用这些现有工具。退一步,如果不需要做这些决定,本书也可以帮助你更好地理解这些技术的优缺点。

当然你最好有一些Web程序或者网络程序的经验,了解一些基本的关系型数据和SQL;虽然不是必须,但如果通晓NoSQL或相关系统,那再好不过。如果有常见网络协议如TCP、HTTP等基本知识也会帮助很大。选择何种编程语言或者框架对于阅读本书没有太大影响。

如果以下若干条适用于你,可能会从本书中有所获益:

• 需要学习了解系统扩展性方面技术,例如支撑百万用户级的Web和移动程序。

• 需要构建高可用(减少宕机影响)和健壮运行的系统 。

• 需要有效方法来提高长时间运行系统的可维护性,应对规模增长、技术和需求不断发生变化等。

• 对系统如何工作有种天然的兴趣或者探索精神,特别是大型Web和在线系统。本书会例举若干典型数据库和数据处理、分析系统,对其设计亮点逐一展开分析,也是乐事一件。

当我在介绍可扩展的系统时,有人会问:“我又不是Google或者Amazon,这些高大上的扩展性太遥远,老老实实用关系数据库就得了。”在特定语境下这的确有道理,打造一个根本不需要的扩展性系统是在浪费精力,而且会丧失其他方面的灵活性,这其实是种过早的优化。然而我要说,选择何种工具也很有讲究或者说极其重要,不同的技术各有优劣,事实上正如本书将要揭示的,关系数据库很重要,但它并非解决数据问题的终极方案。

本书涵盖范围

本书不会就如何安装、配置特定软件包或者API等做太多细节介绍,这方面已有足够多的文档。我们会着重探讨不同的设计理念以及如何权衡,这些通常才是系统的核心,也会例举实践中不同的系统产品最终采用了哪些不同的理念。

本书的电子版已包含所有在线资源的链接,这些链接在书稿付梓之时都做了验证,然而大家都能理解,这些网络链接可能在一段时间之后会失效。如果不巧碰到了失效的链接,或者阅读的是纸质版本,可以随时用搜索引擎来查询相关资料。对于学术论文,推荐用Google Scholar搜索文献标题来下载PDF版本,或者随时访问https://github.com/ept/ddia-references,我们维护了所有最新的链接。

本书主要关注数据处理系统架构方面以及如何集成到数据密集型应用系统中。而关于部署、运营、安全、管理等相关方面,当然也非常重要和足够复杂,不过它们并非本书的重点,也无意做些肤浅的、聊胜于无的介绍,我们认为它们值得单独成书。

书中所涵盖的诸多技术总体都可以纳入到“大数据”的范畴。然而,大数据这个商业词汇有些过于滥用或者太模糊,不太适合在严谨的工程领域展开讨论。本书倾向于使用更加明确的用语,例如单节点、分布式系统,或者在线/交互式分析以及离线/批处理系统等。

本书更偏爱免费及开源软件(Free and Open Source Software,FOSS),主要是通过源码阅读、必要的修改,然后实地执行可以帮助理解系统究竟是如何工作的,此外开放系统也能减少对特定供应商的锁定问题。当然,我们并非局限于此,也会讨论相关商业软件,这包括闭源、软件即服务(Software as a Service)或者一些只出现在文献里但并未公开发行的一些公司内部软件等。

本书内容安排

全书分为三大部分:

1. 第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。

2. 第二部分,我们将从单机的数据存储转向跨机器的分布式系统,这是扩展性的重要一步,但随之而来的是各种挑战。所以将依次讨论数据远程复制(第5章)、数据分区(第6章)以及事务(第7章)。接下来的第8章包括分布式系统的更多细节,以及分布式环境如何达成一致性与共识(第9章)。

3. 第三部分,主要针对产生派生数据的系统,所谓派生数据主要指在异构系统中,如果无法用一个数据源来解决所有问题,那么一种自然的方式就是集成多个不同的数据库、缓存模块以及索引模块等。首先第10章以批处理开始来处理派生数据,紧接着第11章采用流式处理。第12章总结之前介绍的多种技术,并分析讨论未来构建可靠、可扩展和可维护应用系统可能的新方向或方法。


链接: https://fly63.com/course/26_1175