多处理器编程的艺术

多处理器编程的艺术 pdf epub mobi txt 电子书 下载 2026

☆☆☆☆☆
出版者:机械工业出版社
作者:(美)Maurice Herlihy
出品人:
页数:383
译者:金海
出版时间:2013-5
价格:69.00
装帧:
isbn号码:9787111418580
丛书系列:计算机科学丛书
图书标签:
  • 并发
  • 多处理器
  • 多线程
  • concurrency
  • 计算机
  • java
  • 计算机科学
  • 操作系统
  • 多处理器编程
  • 并行计算
  • 并发编程
  • 多线程
  • 锁机制
  • 同步技术
  • 分布式系统
  • 高性能计算
  • 软件架构
  • 实时系统
想要找书就要到 小哈图书下载中心
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

工业界称为多核的多处理器机器正迅速地渗入计算的各个领域。多处理器编程要求理解新型计算原理、算法及编程工具,至今很少有人能够精通这门编程艺术。

现今,大多数工程技术人员都是通过艰辛的反复实践、求助有经验的朋友来学习多处理器编程技巧。这本最新的权威著作致力于改变这种状况,作者全面阐述了多处理器编程的指导原则,介绍了编制高效的多处理器程序所必备的算法技术。了解本书所涵盖的多处理器编程关键问题将使在校学生以及相关技术人员受益匪浅。

本书特色

本修订版结合2008年第1版出版以来课堂教学和读者反馈的勘误和修改意见,对全书进行了多方面的修订和更新。

循序渐进地讲述共享存储器多线程编程的基础知识。

详细解释当今多处理器硬件对并发程序设计的支持方式。

全面考察主流的并发数据结构及其关键设计要素。

从简单的锁机制到最新的事务内存系统,独立、完整地阐述了同步技术。

给出大量利用Java并发工具包编写的可完全执行的Java实例。

附录提供了采用其他程序设计语言和包(如C#、C及C++的Pthreads库)进行编程的相关背景知识以及硬件基础知识。

深入理解现代计算的基石:并行处理与系统优化 本书旨在为读者提供一个全面、深入的视角,剖析在日益复杂的现代计算环境中,如何设计、实现和优化高效的并行处理系统。我们聚焦于那些构成高性能计算(HPC)、大规模数据处理乃至当代软件架构核心的底层原理与实践。 在单核性能提升趋于平缓的今天,计算能力的增长主要依赖于核心数量的增加和并行化策略的有效部署。本书将带您穿越从理论基础到前沿应用的广阔领域,确保读者不仅掌握“如何做”,更能理解“为何要这样做”。 第一部分:并行计算的理论基石与模型演进 本部分为后续深入讨论奠定坚实的基础。我们首先回顾计算复杂性理论在并行环境下的重构,并详细分析不同并行模型对算法设计的影响。 1.1 并行性的本质与量度: 阿姆达尔定律与古斯塔夫森定律的局限与应用: 深入剖析这些经典定律在评估和预测并行加速上的实际效用,并探讨现代系统中的非理想因素(如通信开销、负载不均衡)如何修正这些理论预测。 并行性度量标准: 介绍效率(Efficiency)、伸缩性(Scalability)、粒度(Granularity)等关键指标,并讨论如何在不同硬件架构下准确测量和报告这些指标。 1.2 经典并行计算模型: PRAM(Parallel Random Access Machine)模型深度解析: 探讨其在理论算法设计中的核心地位,以及对一致性内存访问(如EUA、CREW、CRCW)的分类与操作语义。 数据并行与任务并行: 详细区分两者的适用场景,并探讨如何通过算法结构映射到具体硬件。 流式计算与管道模型(Pipeline Model): 分析数据在连续处理阶段间的流动与同步机制,尤其适用于大规模数据流处理。 1.3 内存一致性与缓存层次结构: 现代处理器的性能瓶颈往往在于数据访问而非计算本身。本章深入探讨内存系统的复杂性。 内存一致性模型: 详细对比顺序一致性(Sequential Consistency)、释放一致性(Release Consistency)和弱一致性(Weak Consistency)的差异,以及它们对程序员编程模型的约束。 缓存一致性协议(Cache Coherence Protocols): 剖析 MESI、MOESI 等核心协议的工作原理、写回与写穿透策略,以及伪共享(False Sharing)现象的成因与规避方法。 --- 第二部分:多核与众核架构的硬件基础 理解硬件架构是有效利用并行资源的前提。本部分侧重于现代CPU、GPU及异构计算单元的内部组织与编程接口。 2.1 现代多核处理器(CMP)设计: 片上系统(SoC)的互连网络(Interconnects): 分析总线结构、交叉开关(Crossbar)和片上网络(NoC)的设计选择,及其对跨核通信延迟的影响。 指令级并行性(ILP)与线程级并行性(TLP)的协同: 探讨乱序执行、超标量架构如何与操作系统和编译器协同工作以最大化指令吞吐量。 2.2 GPU计算的原理与编程范式: GPU已成为科学计算和深度学习的主流加速器。 SIMT(Single Instruction, Multiple Thread)架构详解: 深入理解 Warp/Wavefront 调度机制、共享内存(Shared Memory)的使用,以及内存合并(Coalesced Memory Access)的重要性。 CUDA/OpenCL 编程模型实践: 不仅是语法介绍,更侧重于如何设计高效的内核函数,管理上下文切换,以及优化全局内存与寄存器分配。 2.3 异构计算的挑战与机遇: CPU-GPU 混合编程: 探讨数据在主机(Host)和设备(Device)之间迁移的开销管理,以及库抽象层(如OpenMP offloading, SYCL)的应用。 新型加速器概述: 对FPGA和专用AI加速器(如TPU)的计算模型进行简要概述,强调其在特定领域的优势。 --- 第三部分:同步、互斥与并发数据结构设计 正确的同步机制是保证并行程序正确性的关键,而高效的数据结构则是性能优化的核心。 3.1 线程间通信与同步的精细控制: 锁机制的深度分析: 详细对比互斥锁(Mutex)、读写锁(RWLock)的性能特征。深入探讨自旋锁(Spinlocks)在高并发场景下的适用性与陷阱。 无锁(Lock-Free)与等待自由(Wait-Free)算法: 介绍基于CAS(Compare-and-Swap)等原子操作的实现技术,构建高性能、高可伸缩性的并发数据结构。 内存屏障(Memory Barriers/Fences): 解释编译器和硬件优化可能导致的指令重排问题,以及如何使用内存屏障来强制特定的内存可见性顺序。 3.2 并发数据结构的设计与实现: 并发队列与栈: 从Mesa/Lamport队列到基于指针的无锁实现,分析其吞吐量瓶颈。 并发哈希表与树结构: 探讨如何使用分段锁定(Lock Striping)和乐观并发控制(OCC)来提高大型共享数据结构的访问性能。 --- 第四部分:并行编程模型与软件工程实践 本部分关注如何将并行算法有效地映射到不同的硬件平台,并探讨现代并行编程的工程化挑战。 4.1 领域特定并行模型: 消息传递接口(MPI): 重点讲解点对点通信、集体通信(如广播、归约、All-to-All)的性能优化,以及如何设计可扩展的进程拓扑。 OpenMP: 聚焦于指令级并行(如`pragma omp parallel for`)的调度策略(静态、动态、导向)对负载均衡的影响,以及私有化变量的最佳实践。 任务并行框架(如TBB, Cilk Plus): 分析基于工作窃取(Work-Stealing)的动态调度机制,及其在应对不确定性负载时的优势。 4.2 性能分析、调试与可移植性: 并行程序性能剖析: 介绍硬件性能计数器(Hardware Performance Counters)的应用,使用VTune, gprof, 或特定工具链进行通信开销、缓存未命中率的量化分析。 死锁与活锁的检测与避免: 探讨静态分析工具和运行时检测方法。 可移植性与性能调优: 如何编写既能在CPU上高效运行,又能利用GPU加速的“单源”代码,实现跨架构的最佳性能。 本书的案例和练习将侧重于真实的、具有挑战性的应用场景,如大规模矩阵运算、图算法(如PageRank的并行化)、以及高频数据流处理中的同步优化,旨在培养读者在面对实际高性能计算难题时,具备系统性的分析和解决能力。

作者简介

Maurice Herlihy 哈佛大学的数学学士和麻省理工学院的计算机科学博士,目前为美国布朗大学计算机科学系教授,曾工作于卡内基-梅隆大学和DEC剑桥实验室。他是美国ACM会士,2003年分布式计算领域Dijkstra奖获得者。

Nir Shavit 以色列希伯来大学的计算机科学博士,目前为麻省理工学院电子工程和计算机科学系教授、以色列特拉维夫大学计算机科学系教授。1999~2011年期间,他担任Sun实验室的技术人员。

两位作者在2004年获得了理论计算机领域最高奖——哥德尔奖(G?del Prize),2012年他们共享了分布式计算领域的Edsger W. Dijkstra奖,40多年来他们一起合作,从事并行和分布式计算教学和研发工作。

目录信息

出版者的话
译者序
前言
教学建议
第1章 引言 1
1.1 共享对象和同步 2
1.2 生活实例 4
1.2.1 互斥特性 6
1.2.2 道德 7
1.3 生产者-消费者问题 7
1.4 读者-写者问题 9
1.5 并行的困境 9
1.6 并行程序设计 11
1.7 本章注释 11
1.8 习题 11
第一部分 原 理
第2章 互斥 14
2.1 时间 14
2.2 临界区 14
2.3 双线程解决方案 16
2.3.1 LockOne类 16
2.3.2 LockTwo类 17
2.3.3 Peterson锁 18
2.4 过滤锁 19
2.5 公平性 21
2.6 Bakery算法 21
2.7 有界时间戳 23
2.8 存储单元数量的下界 25
2.9 本章注释 27
2.10 习题 28
第3章 并发对象 31
3.1 并发性与正确性 31
3.2 顺序对象 33
3.3 静态一致性 34
3.4 顺序一致性 35
3.5 可线性化性 38
3.5.1 可线性化点 38
3.5.2 评析 38
3.6 形式化定义 38
3.6.1 可线性化性 39
3.6.2 可线性化性的复合性 40
3.6.3 非阻塞特性 40
3.7 演进条件 41
3.8 Java存储器模型 43
3.8.1 锁和同步块 44
3.8.2 volatile域 44
3.8.3 final域 44
3.9 评析 45
3.10 本章注释 46
3.11 习题 46
第4章 共享存储器基础 50
4.1 寄存器空间 50
4.2 寄存器构造 54
4.2.1 MRSW安全寄存器 55
4.2.2 MRSW规则布尔寄存器 55
4.2.3 M-值MRSW规则寄存器 56
4.2.4 SRSW原子寄存器 57
4.2.5 MRSW原子寄存器 59
4.2.6 MRMW原子寄存器 60
4.3 原子快照 62
4.3.1 无障碍快照 63
4.3.2 无等待快照 64
4.3.3 正确性证明 66
4.4 本章注释 67
4.5 习题 67
第5章 同步原子操作的相对能力 70
5.1 一致数 70
5.2 原子寄存器 72
5.3 一致性协议 74
5.4 FIFO队列 74
5.5 多重赋值对象 77
5.6 读-改-写操作 79
5.7 Common2 RMW操作 80
5.8 compareAndSet()操作 81
5.9 本章注释 82
5.10 习题 83
第6章 一致性的通用性 87
6.1 引言 87
6.2 通用性 88
6.3 一种通用的无锁构造 88
6.4 一种通用的无等待构造 91
6.5 本章注释 95
6.6 习题 95
第二部分 实 践
第7章 自旋锁与争用 98
7.1 实际问题 98
7.2 测试-设置锁 100
7.3 再论基于TAS的自旋锁 102
7.4 指数后退 102
7.5 队列锁 104
7.5.1 基于数组的锁 104
7.5.2 CLH队列锁 106
7.5.3 MCS队列锁 107
7.6 时限队列锁 110
7.7 复合锁 112
7.8 层次锁 118
7.8.1 层次后退锁 118
7.8.2 层次CLH队列锁 119
7.9 由一个锁管理所有的锁 123
7.10 本章注释 123
7.11 习题 124
第8章 管程和阻塞同步 126
8.1 引言 126
8.2 管程锁和条件 126
8.2.1 条件 127
8.2.2 唤醒丢失问题 130
8.3 读者-写者锁 131
8.3.1 简单的读者-写者锁 131
8.3.2 公平的读者-写者锁 132
8.4 我们的可重入锁 134
8.5 信号量 135
8.6 本章注释 136
8.7 习题 136
第9章 链表:锁的作用 139
9.1 引言 139
9.2 基于链表的集合 140
9.3 并发推理 141
9.4 粗粒度同步 142
9.5 细粒度同步 143
9.6 乐观同步 146
9.7 惰性同步 149
9.8 非阻塞同步 153
9.9 讨论 157
9.10 本章注释 157
9.11 习题 158
第10章 并行队列和ABA问题 159
10.1 引言 159
10.2 队列 160
10.3 部分有界队列 160
10.4 完全无界队列 163
10.5 无锁的无界队列 164
10.6 内存回收和ABA问题 166
10.7 双重数据结构 170
10.8 本章注释 172
10.9 习题 172
第11章 并发栈和消除 174
11.1 引言 174
11.2 无锁的无界栈 174
11.3 消除 176
11.4 后退消除栈 176
11.4.1 无锁交换机 177
11.4.2 消除数组 179
11.5 本章注释 181
11.6 习题 181
第12章 计数、排序和分布式协作 184
12.1 引言 184
12.2 共享计数 184
12.3 软件组合 185
12.3.1 概述 185
12.3.2 一个扩展实例 190
12.3.3 性能和健壮性 191
12.4 静态一致池和计数器 192
12.5 计数网 192
12.5.1 可计数网 193
12.5.2 双调计数网 194
12.5.3 性能和流水线 201
12.6 衍射树 201
12.7 并行排序 204
12.8 排序网 204
12.9 样本排序 207
12.10 分布式协作 208
12.11 本章注释 208
12.12 习题 209
第13章 并发哈希和固有并行 212
13.1 引言 212
13.2 封闭地址哈希集 213
13.2.1 粗粒度哈希集 214
13.2.2 空间分带哈希集 215
13.2.3 细粒度哈希集 217
13.3 无锁哈希集 219
13.3.1 递归有序划分 219
13.3.2 BucketList类 222
13.3.3 LockFreeHashSet<T>类 223
13.4 开放地址哈希集 225
13.4.1 Cuckoo哈希 225
13.4.2 并发Cuckoo哈希 226
13.4.3 空间分带的并发Cuckoo哈希 230
13.4.4 细粒度的并发Cuckoo哈希集 231
13.5 本章注释 233
13.6 习题 234
第14章 跳表和平衡查找 235
14.1 引言 235
14.2 顺序跳表 235
14.3 基于锁的并发跳表 236
14.3.1 简介 236
14.3.2 算法 238
14.4 无锁并发跳表 243
14.4.1 简介 243
14.4.2 算法细节 245
14.5 并发跳表 251
14.6 本章注释 251
14.7 习题 251
第15章 优先级队列 253
15.1 引言 253
15.2 基于数组的有界优先级队列 253
15.3 基于树的有界优先级队列 254
15.4 基于堆的无界优先级队列 256
15.4.1 顺序堆 256
15.4.2 并发堆 258
15.5 基于跳表的无界优先级队列 262
15.6 本章注释 264
15.7 习题 265
第16章 异步执行、调度和工作分配 266
16.1 引言 266
16.2 并行分析 271
16.3 多处理器的实际调度 273
16.4 工作分配 274
16.4.1 工作窃取 275
16.4.2 屈从和多道程序设计 275
16.5 工作窃取双端队列 276
16.5.1 有界工作窃取双端队列 276
16.5.2 无界工作窃取双端队列 279
16.5.3 工作平衡 282
16.6 本章注释 283
16.7 习题 284
第17章 障碍 287
17.1 引言 287
17.2 障碍实现 288
17.3 语义换向障碍 288
17.4 组合树障碍 289
17.5 静态树障碍 291
17.6 终止检测障碍 293
17.7 本章注释 295
17.8 习题 296
第18章 事务内存 302
18.1 引言 302
18.1.1 关于锁的问题 302
18.1.2 关于compareAndSet()的问题 303
18.1.3 关于复合性的问题 304
18.1.4 我们能做什么 305
18.2 事务和原子性 305
18.3 软事务内存 306
18.3.1 事务和事务线程 309
18.3.2 僵尸事务和一致性 310
18.3.3 原子对象 311
18.3.4 如何演进 311
18.3.5 争用管理器 312
18.3.6 原子对象的实现 314
18.3.7 无干扰原子对象 315
18.3.8 基于锁的原子对象 318
18.4 硬事务内存 323
18.4.1 缓存一致性 324
18.4.2 事务缓存一致性 324
18.4.3 改进 325
18.5 本章注释 325
18.6 习题 326
第三部分 附 录
附录A 软件基础 328
附录B 硬件基础 340
参考文献 350
索引 359
· · · · · · (收起)

读后感

评分☆☆☆☆☆

可以更加深入理解操作系统调度和并发等问题,无需深刻的计算理论知识即可读懂。我是在研一花了整整十天看完的!建议后来者多结合图示理解文字算法,不懂再去看代码,这样快一些!前六章的计算理论不分不必追究细节,后面阅读时可以慢慢体会!其实学过操作系统和计算机组成完全...

评分☆☆☆☆☆

深入学习一个领域最好的方法就是读这个领域权威人物写的教材,最好是每章后面带有chapter notes的那种,共享内存并发同步领域的The Art of Multiprocessor Programming这本书就是如此,作者M. Herlihy本身就提出了并发同步相关的很多重要理论和方法。全书以一致的风格介绍领域...  

评分☆☆☆☆☆

现在在读这本书, 已经看了ch.1-5, ch.8--10, 有了一点发言权,谈谈自己的看法。 首先,这本书挺对不起书名的,其中的错误挺多的,有些证明挺不严密的。例如, ch.2 中关于mutual exclusion 的证明,其隐含的前提没有指出,读起来很费解; ch.8 中的关于read-write lock 代码...  

评分☆☆☆☆☆

This book is very new. I'm still wondering why the authors titled this book multeprocessors instead of much more eye-attractive multicore. Maybe they tought they are actually the same unsolved problems. Parallelization came from very specific domains like O...  

评分☆☆☆☆☆

TL;DR 在看这书之前,我以为这书会讲多核结构啊缓存一致性啊一类的东西,再不济讲一下各种 concurrency model 啥的,结果看完前几章后我又扫了一下目录,这才发现坑爹了。 这书的关键词是锁(locking),是的,你没看错,就是锁,而且还是用户态的锁。 以锁为核心,这书可以分...  

用户评价

评分☆☆☆☆☆

初读目录时,我曾担心这本书的深度会让我这个有一定经验的开发者感到枯燥,但事实证明我的顾虑是多余的。作者在处理“异构计算”和“内存访问模式优化”时,展现出惊人的洞察力。他似乎能预见到未来几年硬件架构的发展趋势,并提前为我们铺设好了应对复杂性的路径。我尤其欣赏他对“数据局部性”的强调,书中对如何重排数据结构以最大限度利用L1/L2缓存的论述,读来让人茅塞顿开,仿佛打开了一扇通往性能圣殿的大门。这种对底层硬件的敬畏和理解,是编写高效代码的基石。这本书的语言风格非常严谨,但绝不晦涩难懂,它要求读者投入注意力,但每一次投入都会带来丰厚的回报。它更像是一本“武功秘籍”,里面的招式需要勤加练习才能融会贯通,但一旦掌握,就能应对绝大多数复杂的并发挑战。

评分☆☆☆☆☆

坦白说,我对技术书籍的期望值通常不高,很多都是概念的堆砌。然而,这本书给我的感觉完全不同,它有一种罕见的“工程务实主义”精神。它没有沉溺于过于理论化的数学证明,而是将重点放在如何构建**健壮且可维护**的并行系统上。我尤其感兴趣的是其中关于“可观测性”和“调试策略”的部分。在多线程环境中,重现一个罕见的竞态条件简直是一场噩梦,书中的调试技巧和工具链的建议,如果真能提高我定位Bug的效率,那这本书的价值就无可估量了。此外,作者对不同并行编程模型(如Actor模型、CSP模型)的对比分析,展现出一种超越单一范式的广阔视野。它没有强迫读者接受某一种“唯一真理”,而是鼓励我们根据项目的特性,做出最恰当的技术选型。这种开放和包容的态度,非常符合现代软件开发的协作精神。它不是一本教你“做什么”的书,而是一本引导你思考“为什么这么做”的书。

评分☆☆☆☆☆

拿到这本书的时候,我首先被它深邃的封面设计吸引住了,那种抽象的、流动的线条仿佛在暗示着并行计算的复杂与美感。这本书的装帧很有质感,拿在手里沉甸甸的,让人感觉内容一定非常扎实。我以前对多核架构的理解大多停留在理论层面,知道要提升性能需要分解任务,但真正实践起来,那种竞态条件、死锁的噩梦总是挥之不去。我期望这本书能提供一套清晰、可操作的“心法”,不仅仅是罗列API,而是深入讲解背后的设计哲学。比如,如何在高并发场景下优雅地管理共享资源,如何从一个串行思维者,平滑过渡到真正的并行架构师?我尤其关注其中关于现代处理器缓存一致性模型的章节,因为这往往是性能瓶颈的隐藏元凶。如果这本书能用生动的比喻,将那些晦涩的内存屏障概念解释得如同讲述一个日常故事,那它就真的成功了。我迫不及待地想看看,作者是如何将一个公认的“硬骨头”领域,打磨成可以被初学者也能领会精髓的艺术品的。这本书的气质,是那种沉稳中透露着挑战欲的,仿佛在邀请读者一起攀登技术的高峰。

评分☆☆☆☆☆

这本书的排版简直是一场视觉享受,大开本的设计让那些复杂的流程图和代码片段得以充分展现,阅读体验极佳。我最欣赏的是作者对“同步原语的权衡”这一主题的细致入微的探讨。市面上的很多书籍只是简单介绍了互斥锁和信号量,但这本书似乎更进一步,它似乎在探讨:在特定的延迟敏感型应用中,我们应该更倾向于无锁数据结构,还是使用更具确定性的同步机制?这种对工具箱内每件工具的深刻理解和适用场景的精准定位,是区分“工具使用者”和“工程大师”的关键。我发现自己开始反思过去某些“想当然”的优化决策,比如,是否因为过度依赖标准库的默认设置,而错失了针对特定硬件的性能潜力。作者似乎在用一种近乎散文的笔触,勾勒出并行编程中那些不易察觉的陷阱,那些在单核世界里绝不会出现的幽灵般的错误。这本书读下来,感觉像是跟随一位经验老到的工匠,学习如何精雕细琢每一个时钟周期,而不是简单地堆砌代码行数。

评分☆☆☆☆☆

这本书的阅读过程,与其说是学习,不如说是一次对自身编程思维的彻底重塑。它没有给我现成的“复制粘贴”的解决方案,而是系统性地解构了并行编程的内在逻辑。令我印象深刻的是关于“并行代码的测试和验证”的章节,这部分内容在很多同类书籍中常常被一笔带过。作者在这里详细阐述了如何利用模型检测和随机测试等高级技术,来系统地覆盖那些难以人为触发的错误路径。这体现了作者对软件质量的极致追求。全书的逻辑推进层层递进,从基础的线程管理,到高级的分布式同步,结构清晰,脉络分明。读完之后,我感觉自己不再是那个被并发问题追着跑的工程师,而是有能力设计并掌控复杂并行流程的架构师。这本书,无疑是近年来技术领域中少有的,能真正提升从业者底层能力和系统设计思维的杰作。

评分☆☆☆☆☆

不错的书,主要介绍并发锁的设计,常用数据结构的lockfree算法

评分☆☆☆☆☆

深入讲解了Java并发背后的原理,要多读几遍

评分☆☆☆☆☆

读起来真的是非常的费劲, 说明自己的功力还是不够啊. 觉得 附录中关于硬件系统的描述对自己的启发非常的大. 硬件是软件运行的容器,它的架构必然发限制软件的设计. 但是同时,软件设计的需求也会反过来促进硬件的发展(给硬件提出需求). 再有,所有的引言章节都非常的好. 第一部分的原理,算是给自己补脑洞用的,只能看个热闹.

评分☆☆☆☆☆

非常喜欢,注重实际问题,不是仅限于理论,针对性很强,读起来我是觉得挺有趣的

评分☆☆☆☆☆

读起来真的是非常的费劲, 说明自己的功力还是不够啊. 觉得 附录中关于硬件系统的描述对自己的启发非常的大. 硬件是软件运行的容器,它的架构必然发限制软件的设计. 但是同时,软件设计的需求也会反过来促进硬件的发展(给硬件提出需求). 再有,所有的引言章节都非常的好. 第一部分的原理,算是给自己补脑洞用的,只能看个热闹.

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

© 2026 qciss.net All Rights Reserved. 小哈图书下载中心 版权所有