具体描述
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》首先回顾了与全书其他内容切实相关的UNIX系统内幕。回顾的目的是增进读者对UNIX操作系统概念的了解,并且定义随后使用的术语。《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》接下来的内容分为3个部分。第一部分“高速缓存存储系统”介绍了高速缓存体系结构、术语和概念,详细考察了4种常见的高速缓存实现——3种虚拟高速缓存的变体和物理高速缓存。第二部分“多处理器系统”讨论了调整单处理器内核的实现,使之适合于紧密耦合、共享存储多处理器上运行时所面临的问题和设计事宜,还研究了几种不同的实现。最后一部分介绍多处理器高速缓存一致性,这一部分通过研究高速缓存加入到一个紧密耦合、共享存储器多处理器系统时出现在操作系统和高速缓存体系结构上的问题,从而将前两个部分的内容结合到一起。
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》适合于大学计算机及相关专业高年级本科生或者研究生使用。每一章都包含有一组练习题,问题都需要采用这一章所提供的信息以及一些额外学到的知识来解答,习题大都建立在这一章中所出现的例子的基础之上。在本书的末尾有选择地给出了习题的答案。
作者简介
Curt Schimmel 操作系统架构师,他曾经从事过针对各种系统(从微处理器到多处理器的超级计算机)的移植和增强UNIX内核的工作,他还参加过为高效支持UNIX环境而开发的新硬件系统的设计工作。他曾是AT&T贝尔实验室的UNIX开发小组成员,后来为SGI(Silicon Graphics, Inc.)工作,目前是苹果公司高级软件工程师。
目录信息
1.1 引言 1
1.2 进程、程序和线程 2
1.3 进程地址空间 3
1.3.1 地址空间映射 5
1.4 上下文切换 6
1.5 内存管理和进程管理的系统调用 6
1.5.1 系统调用fork 7
1.5.2 系统调用exec 9
1.5.3 系统调用exit 9
1.5.4 系统调用sbrk和brk 9
1.5.5 共享内存 10
1.5.6 I/O操作 10
1.5.7 映射文件 11
1.6 小结 11
1.7 习题 11
1.8 进一步的读物 12
第一部分 高速缓存存储系统
第2章 高速缓存存储系统概述 17
2.1 存储器层次结构 17
2.2 高速缓存基本原理 19
2.2.1 如何存取高速缓存 19
2.2.2 虚拟地址还是物理地址 21
2.2.3 搜索高速缓存 21
2.2.4 替换策略 22
2.2.5 写策略 22
2.3 直接映射高速缓存 24
2.3.1 直接映射高速缓存的散列算法 25
2.3.2 直接映射高速缓存的实例 27
2.3.3 直接映射高速缓存的缺失处理和替换策略 30
2.3.4 直接映射高速缓存的总结 31
2.4 双路组相联高速缓存 31
2.5 n路组相联高速缓存 33
2.6 全相联高速缓存 33
2.7 n路组相联高速缓存的总结 33
2.8 高速缓存冲洗 34
2.9 无缓存的操作 35
2.10 独立的指令高速缓存和数据高速缓存 35
2.11 高速缓存的性能 37
2.12 各种高速缓存体系的差异 38
2.13 习题 38
2.14 进一步的读物 41
第3章 虚拟高速缓存 45
3.1 虚拟高速缓存的操作 45
3.2 虚拟高速缓存的问题 47
3.2.1 歧义 47
3.2.2 别名 48
3.3 管理虚拟高速缓存 50
3.3.1 上下文切换 51
3.3.2 fork 51
3.3.3 exec 54
3.3.4 exit 54
3.3.5 brk和sbrk 54
3.3.6 共享内存和映射文件 55
3.3.7 I/O 55
3.3.8 用户-内核数据的歧义 58
3.4 小结 59
3.5 习题 59
3.6 进一步的读物 61
第4章 带有键的虚拟高速缓存 63
4.1 带有键的虚拟高速缓存的操作 63
4.2 管理带有键的虚拟高速缓存 64
4.2.1 上下文切换 64
4.2.2 fork 65
4.2.3 exec 67
4.2.4 exit 68
4.2.5 brk和sbrk 68
4.2.6 共享内存和映射文件 68
4.2.7 I/O 70
4.2.8 用户-内核数据的歧义 71
4.3 在MMU中使用虚拟高速缓存 71
4.4 小结 72
4.5 习题 72
4.6 进一步的读物 74
第5章 带有物理地址标记的虚拟高速缓存 75
5.1 带有物理标记的虚拟高速缓存的组成 75
5.2 管理带有物理标记的虚拟高速缓存 78
5.2.1 上下文切换 78
5.2.2 fork 78
5.2.3 exec 79
5.2.4 exit 79
5.2.5 brk和sbrk 79
5.2.6 共享内存和映射文件 80
5.2.7 I/O 80
5.2.8 用户-内核数据的歧义 80
5.3 小结 81
5.4 习题 81
5.5 进一步的读物 82
第6章 物理高速缓存 83
6.1 物理高速缓存的组成 83
6.2 管理物理高速缓存 85
6.2.1 上下文切换 85
6.2.2 fork 85
6.2.3 exec、exit、brk和sbrk 85
6.2.4 共享内存和映射文件 86
6.2.5 用户-内核数据的歧义 86
6.2.6 I/O和总线监视 86
6.3 多级高速缓存 91
6.3.1 带有次级物理高速缓存的主虚拟高速缓存 91
6.3.2 带有物理标记的主虚拟高速缓存和次级物理高速缓存 93
6.4 小结 94
6.5 习题 95
6.6 进一步的读物 96
第7章 高效的高速缓存管理技术 97
7.1 引言 97
7.2 地址空间布局 97
7.2.1 虚拟索引的高速缓存 97
7.2.2 动态地址绑定 100
7.2.3 物理索引的高速缓存 101
7.3 受限于高速缓存大小的冲洗操作 102
7.4 滞后的高速缓存无效操作 103
7.4.1 带有键的虚拟高速缓存 104
7.4.2 没有总线监视机制的物理标记高速缓存 104
7.5 缓存对齐的数据结构 105
7.6 小结 107
7.7 习题 107
7.8 进一步的读物 108
第二部分 多处理器系统
第8章 多处理器系统概述 111
8.1 引言 111
8.2 紧密耦合、共享存储的对称多处理器 113
8.3 MP存储器模型 114
8.3.1 顺序存储模型 115
8.3.2 原子读和原子写 115
8.3.3 原子读-改-写操作 117
8.4 互斥 119
8.5 回顾单处理器UNIX系统上的互斥 120
8.5.1 短期互斥 121
8.5.2 带有中断处理器的互斥 121
8.5.3 长期互斥 122
8.6 在MP上使用UP互斥策略的问题 124
8.7 小结 125
8.8 习题 125
8.9 进一步的读物 127
第9章 主从内核 129
9.1 引言 129
9.2 自旋锁 130
9.3 死锁 131
9.4 主从内核的实现 133
9.4.1 运行队列的实现 133
9.4.2 从处理器的进程选择 136
9.4.3 主处理器的进程选择 137
9.4.4 时钟中断处理 137
9.5 性能考虑 137
9.6 小结 139
9.7 习题 140
9.8 进一步的读物 142
第10章 采用自旋锁的内核 145
10.1 引言 145
10.2 巨型上锁 145
10.3 不需要上锁的多线程情况 147
10.4 粗粒度上锁 148
10.5 细粒度上锁 150
10.5.1 短期互斥 150
10.5.2 长期互斥 151
10.5.3 带有中断处理器的互斥 152
10.5.4 锁的粒度 153
10.5.5 性能 154
10.5.6 内核抢占 154
10.6 休眠和唤醒对多处理器的影响 155
10.7 小结 156
10.8 习题 156
10.9 进一步的读物 159
第11章 采用信号量的内核 161
11.1 引言 161
11.1.1 采用信号量的互斥 162
11.1.2 采用信号量的同步 162
11.1.3 采用信号量分配资源 163
11.2 死锁 163
11.3 实现信号量 164
11.4 粗粒度信号量的实现 167
11.5 采用信号量的多线程 168
11.5.1 长期互斥 168
11.5.2 短期互斥 169
11.5.3 同步 169
11.6 性能考虑 170
11.6.1 测量锁争用 170
11.6.2 结对 171
11.6.3 多读锁 173
11.7 小结 177
11.8 习题 177
11.9 进一步的读物 178
第12章 其他MP原语 181
12.1 引言 181
12.2 管程 181
12.3 事件计数和定序器 183
12.4 SVR4.2 MP的MP原语 185
12.4.1 自旋锁 185
12.4.2 休眠锁 187
12.4.3 同步变量 188
12.4.4 多读锁 190
12.5 比较MP同步原语 191
12.6 小结 193
12.7 习题 193
12.8 进一步的读物 194
第13章 其他存储模型 197
13.1 引言 197
13.2 Dekker算法 198
13.3 其他存储模型 199
13.4 完全存储定序 201
13.5 部分存储定序 204
13.6 作为存储层次结构一部分的保存缓冲区 206
13.7 小结 207
13.8 习题 207
13.9 进一步的读物 208
第三部分 带有高速缓存的多处理器系统
第14章 MP高速缓存一致性概述 213
14.1 引言 213
14.2 高速缓存一致性问题 214
14.3 软件高速缓存一致性 217
14.3.1 共享数据不被缓存 218
14.3.2 选择性的高速缓存冲洗 219
14.3.3 处理其他存储模型 222
14.4 小结 223
14.5 习题 223
14.6 进一步的读物 224
第15章 硬件高速缓存一致性 229
15.1 引言 229
15.2 写-使无效协议 231
15.2.1 写直通-使无效协议 231
15.2.2 写一次协议 231
15.2.3 MESI协议 234
15.3 写-更新协议 235
15.3.1 Firefly协议 235
15.3.2 MIPS R4000 更新协议 236
15.4 读-改-写操作的一致性 236
15.5 多级高速缓存的硬件一致性 237
15.6 其他主要的
· · · · · · (收起)
读后感
如果你读过pongba的C++多线程内存模型的博文(http://blog.csdn.net/pongba/article/details/1659952),对里面的一些内容抱有疑惑,并且你想从本质上逐步去解决这些疑惑。这本书可以帮你解答影响内存模型在SMP体系上,以及受Cache影响的所有问题。这本书的内容并不单纯面向内...
如果你读过pongba的C++多线程内存模型的博文(http://blog.csdn.net/pongba/article/details/1659952),对里面的一些内容抱有疑惑,并且你想从本质上逐步去解决这些疑惑。这本书可以帮你解答影响内存模型在SMP体系上,以及受Cache影响的所有问题。这本书的内容并不单纯面向内...
从单核的cache设计 引申出 多核smp架构的cache设计,并对单核和多核smp的cache一致性的实现,以及在内核设计时面临的同步和互斥的实现,提供了解决方案。 本书前半部分介绍cache, 后半部分介绍同步和互斥等内核原语的实现方式。 对想了解cache原理和内核原语实现方式的同学有...
如果你读过pongba的C++多线程内存模型的博文(http://blog.csdn.net/pongba/article/details/1659952),对里面的一些内容抱有疑惑,并且你想从本质上逐步去解决这些疑惑。这本书可以帮你解答影响内存模型在SMP体系上,以及受Cache影响的所有问题。这本书的内容并不单纯面向内...
如果你读过pongba的C++多线程内存模型的博文(http://blog.csdn.net/pongba/article/details/1659952),对里面的一些内容抱有疑惑,并且你想从本质上逐步去解决这些疑惑。这本书可以帮你解答影响内存模型在SMP体系上,以及受Cache影响的所有问题。这本书的内容并不单纯面向内...
用户评价
这本书如同一次深入浅出的探险,带领我穿越了现代计算机体系结构的核心地带。翻开第一页,便被作者严谨的逻辑和精妙的阐述所吸引。这本书并非简单罗列技术名词,而是构建了一个宏大而清晰的知识框架,让我得以窥见UNIX系统在多处理器环境下如何展现其强大的生命力。作者在解释对称多处理(SMP)时,并没有停留在概念层面,而是通过对内核调度器、进程同步机制以及内存管理策略的深度剖析,让我真切地感受到了不同CPU核心之间如何协同工作,如何高效地分配和管理计算资源。书中对锁机制、信号量和自旋锁的讨论,以及它们在避免竞态条件和保证数据一致性方面的作用,都给我留下了深刻的印象。尤其让我惊叹的是,作者将抽象的并发模型与具体的硬件实现巧妙地结合起来,让我理解了这些软件机制如何在底层硬件的支持下得以高效运行。每一次阅读都像是在解锁新的层次,每一个章节都充满了引人入胜的细节,让我不禁沉浸其中,对UNIX系统的内在运作原理有了更深层次的理解。
这本书不仅仅是关于UNIX的内核,更重要的是它深入探讨了现代处理器架构与操作系统内核之间的协同作用。作者在阐述对称多处理(SMP)时,详细讲解了内核如何处理CPU的亲和性(affinity),以及如何通过 NUMA(Non-Uniform Memory Access)架构的特性来优化内存访问。我过去对NUMA的概念只停留在字面上,但通过这本书,我理解了不同CPU访问本地内存和远程内存的性能差异,以及操作系统如何通过调度和内存分配策略来最大化利用NUMA的优势。书中的内容涉及了大量的底层细节,但作者凭借其深厚的功底,将这些复杂的概念清晰地呈现出来,使得读者能够逐步掌握。阅读过程中,我时常会停下来思考,对比自己曾经遇到过的性能问题,尝试用书中提供的新视角来分析和解决。这本书让我对“性能”这个词有了更深刻的理解,它不再是一个笼统的概念,而是由一系列精巧的硬件和软件机制共同支撑的结果。
这本书在缓存技术部分的深度和广度都令人印象深刻。作者对于缓存的层级结构、缓存行的大小、缓存替换策略(如LRU, LFU)的优缺点以及它们如何影响程序性能的分析,都非常透彻。我尤其对书中关于缓存一致性协议的工作原理以及它们在MESI、MOESI等状态转换的详细描述印象深刻。这让我理解了当多个CPU核同时访问同一块内存区域时,是如何通过这些协议来确保数据的一致性的。作者还讨论了TLB(Translation Lookaside Buffer)作为虚拟地址到物理地址翻译的缓存,以及它对页面调度和性能的影响。这种从底层硬件到操作系统内核,再到应用程序优化的全方位视角,为我构建了一个完整的性能理解框架,让我能够更有效地识别和解决性能瓶颈。
这本书对于理解现代体系结构中,UNIX内核是如何处理并发和并行计算的,提供了一个无与伦比的视角。作者在对对称多处理(SMP)的阐述中,深入到了内核锁、信号量、读写锁以及原子操作等同步原语的细节。我过去在编写多线程程序时,经常会遇到各种难以捉摸的bug,而这本书为我揭示了这些bug产生的根源,以及如何通过正确的同步机制来避免它们。更重要的是,作者将这些软件层面的同步机制与底层的硬件支持,例如缓存一致性协议和内存屏障(memory barriers)联系起来,让我对它们在保证数据一致性方面的作用有了更深刻的理解。书中关于内存模型和序言(ordering)的讨论,对于理解跨CPU核的数据访问至关重要。
缓存技术在现代计算中的重要性不言而喻,而这本书恰好抓住了这一核心。作者对缓存延迟、缓存抖动(cache thrashing)等概念的分析,以及如何通过指令预取(prefetching)和数据预取来弥补缓存延迟,都让我受益匪浅。我尤其对书中关于缓存失效(cache invalidation)的处理方式进行了深入研究,理解了各种失效机制如何影响程序的性能。作者还特别强调了编译器在优化缓存使用方面的作用,比如通过循环展开(loop unrolling)和数据重组(data restructuring)来提高缓存命中率。这种从操作系统内核到硬件架构,再到编译器优化,层层递进的分析方式,为我构建了一个完整的性能优化知识体系。我开始思考,即使是看似简单的内存访问,其背后也隐藏着如此多的复杂性和优化空间。
这本书对于理解缓存技术在现代体系结构中的作用,无疑是一部不可多得的宝典。作者对缓存一致性协议的阐述,如MESI、MOESI等,以及它们在多处理器环境下的复杂交互,让我眼前一亮。我一直对CPU缓存如何提升性能感到好奇,而这本书则为我揭示了其背后的精妙设计。从一级缓存到二级缓存,再到可能的三级缓存,作者循序渐进地解释了数据在不同缓存层级之间如何流动,以及缓存命中率对整体性能的影响。更重要的是,书中详细介绍了软件层面如何优化缓存使用,比如如何通过数据布局和访问模式来提高缓存命中率,避免假共享(false sharing)等问题。这种从硬件到软件,再到软件如何反哺硬件优化的思路,极大地拓宽了我的视野。我开始重新审视自己的编程习惯,思考如何在代码层面更充分地利用CPU缓存,从而写出更高效、更具响应性的程序。书中的图示和案例分析,将这些复杂的概念具象化,使得学习过程更加生动有趣。
这本书在缓存技术方面的讲解,可以说是细致入微,让我对现代处理器的工作原理有了全新的认识。作者对于缓存行的对齐、缓存一致性协议在不同场景下的行为以及如何避免伪共享等问题的深入探讨,都极具启发性。我特别欣赏书中关于“缓存友好型”数据结构设计的建议,例如使用数组而不是链表来存储连续的数据,或者通过重新组织数据结构来减少缓存行的浪费。这些看似细微的调整,却能对程序的性能产生巨大的影响。此外,作者还介绍了如何使用性能分析工具(如perf)来识别缓存相关的性能瓶颈,并根据分析结果进行优化,这为我提供了一条实践性的路径。我开始更加有意识地在我的代码中考虑数据布局和访问模式,力求让我的程序能够更好地利用CPU缓存。
我对缓存技术部分的理解,可以说是在阅读这本书之后得到了质的飞跃。作者对于缓存行的划分、写回策略(write-back)和写通策略(write-through)的对比分析,以及它们在不同场景下的权衡,都非常透彻。我特别欣赏作者在讲解缓存一致性时,引入了“总线嗅探”(bus snooping)和“目录式”(directory-based)两种主要协议,并详细阐述了它们的工作原理和优缺点。这让我明白,看似简单的缓存操作,背后却蕴含着如此复杂的硬件协同。书中还提及了对伪共享(false sharing)的避免策略,例如使用对齐(padding)和更细粒度的锁,这些都是在实际开发中能够直接应用的宝贵经验。我曾经编写过一些多线程程序,在遇到性能瓶颈时,常常束手无策,而这本书提供了一种新的思考方向,让我能够从缓存的角度去审视和优化我的代码。
阅读这本书的过程,就像是与一位经验丰富的向导一同深入探索UNIX系统的腹地。作者在阐述对称多处理(SMP)的挑战时,毫不避讳地展示了其复杂性,例如内存总线的争用、缓存一致性协议的开销以及锁的粒度选择等问题。我过去对这些问题 hanya 有模糊的认识,但通过书中详实的分析和案例,我得以系统地理解了这些问题是如何产生的,以及内核是如何通过各种精巧的设计来加以解决的。例如,关于多处理器调度器如何平衡负载、减少上下文切换开销以及支持CPU亲和性,这些内容都给我留下了深刻的印象。作者的叙述方式非常引人入胜,他能够将枯燥的技术细节转化为生动的故事,让读者在不知不觉中掌握核心概念。
这本书对于我理解UNIX内核的动态行为,提供了前所未有的洞察力。作者在讲解对称多处理(SMP)时,详细剖析了内核如何管理进程和线程在多个CPU核上的调度。我过去一直以为调度就是简单地轮流执行,但这本书让我认识到了诸如就绪队列、优先级、时间片轮转以及抢占式调度等概念的精妙之处。更重要的是,作者将这些概念与CPU核的亲和性、中断处理以及TLB(Translation Lookaside Buffer)的刷新等硬件特性联系起来,揭示了内核如何在多核环境下实现高效的资源分配和上下文切换。书中的某些章节,如关于内核锁的深入讨论,让我对并发编程中的各种挑战有了更清晰的认识。理解这些底层机制,对于我编写更健壮、更高效的系统级软件至关重要。
绝对是物超所值,如果想找到并发编程困难的原因的话,这本书一定会让你满意。还要提到一点,本书对cache的的讲解顺序是从无到有的。若果有可能还是看英文版吧,中文版的翻译让人发指。
翻了一点,并不觉得很好啊,说的不详细很简略。
绝对是物超所值,如果想找到并发编程困难的原因的话,这本书一定会让你满意。还要提到一点,本书对cache的的讲解顺序是从无到有的。若果有可能还是看英文版吧,中文版的翻译让人发指。
绝对是物超所值,如果想找到并发编程困难的原因的话,这本书一定会让你满意。还要提到一点,本书对cache的的讲解顺序是从无到有的。若果有可能还是看英文版吧,中文版的翻译让人发指。
软件实现锁 多核硬件cache同步 老书 基本概念