自我提升
类型
可以朗读
语音朗读
539千字
字数
2026-01-01
发行日期
展开全部
主编推荐语
本书介绍了现代计算机系统的主要硬件和软件。
内容简介
计算机系统是计算机专业的常见课程,也是学习编程过程中的重要学习内容。
本书按抽象层次设置各章节,从常用于编写操作系统的C语言基础知识逐步衍生,先介绍现代计算机的组成、结构、操作系统原理、汇编语言,再介绍各种计算机体系结构的代码优化方法、使用共享内存实现并行计算、多核CPU环境下的内存管理等。
目录
- 版权信息
- 版权声明
- 内容提要
- 译者序
- 致 谢
- 正式审稿人
- 早期读者
- 前 言
- 本书讲述什么
- 本书使用方法
- 引 言
- 什么是计算机系统
- 现代计算机系统是什么样子的
- 通过本书你能学到什么
- 本书入门
- Linux系统、C语言以及GNU编译器
- 其他形式的标注
- 资源与支持
- 资源获取
- 提交勘误信息
- 与我们联系
- 关于异步社区和异步图书
- 第1章 靠近C,靠近C,靠近美丽的C
- 1.1 开始使用C编程
- 1.1.1 编译和运行C程序
- 1.1.2 C类型
- 1.2 输入和输出(函数printf和scanf)
- 1.2.1 printf函数
- 1.2.2 scanf函数
- 1.3 条件和循环
- 1.3.1 C中的布尔值
- 1.3.2 C中的循环
- 1.4 函数
- 栈
- 1.5 数组和字符串
- 1.5.1 数组介绍
- 1.5.2 数组访问方法
- 1.5.3 数组和函数
- 1.5.4 C字符串和字符串库介绍
- 1.6 结构体
- 1.6.1 定义结构体类型
- 1.6.2 声明结构体类型的变量
- 1.6.3 访问字段值
- 1.6.4 向函数传递结构体
- 1.7 总结
- 第2章 深入理解C语言
- 2.1 程序内存的组成部分和作用域
- 2.2 C指针变量
- 指针变量
- 2.3 指针与函数
- 2.4 动态内存分配
- 2.4.1 堆内存
- 2.4.2 函数malloc和free
- 2.4.3 动态分配数组和字符串
- 2.4.4 指向堆内存和函数的指针
- 2.5 C中的数组
- 2.5.1 一维数组
- 2.5.2 二维数组
- 2.6 C字符串和字符串库
- 2.6.1 C语言对静态分配字符串(char数组)的支持
- 2.6.2 动态分配字符串
- 2.6.3 用于操作C字符串和字符的库
- 2.7 C结构体
- 2.7.1 复习C结构体类型
- 2.7.2 指针和结构体
- 2.7.3 结构体中的指针字段
- 2.7.4 结构体数组
- 2.7.5 自引用结构体
- 2.8 C中的I/O(标准I/O和文件I/O)
- 2.8.1 标准I/O
- 2.8.2 文件I/O
- 2.8.3 在C程序中使用文本文件
- 2.8.4 stdio.h中的标准I/O函数和文件I/O函数
- 2.9 C语言的一些高级特性
- 2.9.1 switch语句
- 2.9.2 命令行参数
- 2.9.3 void *类型及类型转换
- 2.9.4 指针运算
- 2.9.5 C库的使用、编译和链接
- 2.9.6 编写和使用自己的C库
- 2.9.7 编译C源文件为汇编代码,以及编译并链接汇编代码
- 2.10 总结
- 第3章 C调试工具
- 3.1 使用GDB调试程序
- 3.1.1 GDB入门
- 3.1.2 GDB会话示例
- 3.2 GDB命令详情
- 3.2.1 GDB常用快捷键
- 3.2.2 常用GDB命令
- 3.3 利用Valgrind调试内存
- 3.3.1 堆内存访问错误示例
- 3.3.2 如何使用Memcheck调试工具
- 3.4 GDB高级功能
- 3.4.1 GDB和make命令
- 3.4.2 将GDB附加到正在运行的进程
- 3.4.3 跟踪分叉进程
- 3.4.4 信号控制
- 3.4.5 DDD设置和bug修复
- 3.5 调试汇编代码
- 3.5.1 使用GDB检查二进制代码
- 3.5.2 在汇编代码级别使用DDD进行调试
- 3.5.3 GDB汇编代码调试命令和示例
- 3.5.4 汇编调试常用命令快速摘要
- 3.6 使用GDB调试多线程程序
- 3.6.1 GDB和线程
- 3.6.2 GDB线程特定命令
- 3.6.3 示例
- 3.7 总结
- 第4章 二进制与数据表示法
- 4.1 基数和无符号数
- 4.1.1 十进制数
- 4.1.2 无符号二进制数
- 4.1.3 十六进制
- 4.1.4 存储限制
- 4.2 数制转换
- 4.2.1 二进制和十六进制之间的转换
- 4.2.2 转换为十进制
- 4.2.3 从十进制转换
- 4.3 有符号二进制数
- 4.3.1 原码
- 4.3.2 补码
- 4.4 二进制算术运算
- 4.4.1 加法
- 4.4.2 减法
- 4.4.3 乘法和除法
- 4.5 溢出
- 4.5.1 用里程表作类比
- 4.5.2 二进制溢出
- 4.5.3 溢出总结
- 4.5.4 溢出后果
- 4.6 位运算符
- 4.6.1 按位与(AND)
- 4.6.2 按位或(OR)
- 4.6.3 按位异或(XOR)
- 4.6.4 按位非(NOT)
- 4.6.5 移位
- 4.7 整数字节序
- 4.8 二进制中的实数
- 4.8.1 定点数表示法
- 4.8.2 浮点数表示法
- 4.8.3 舍入结果
- 4.9 总结
- 第5章 冯 • 诺依曼计算机体系结构
- 5.1 现代计算机体系结构的起源
- 5.1.1 图灵机
- 5.1.2 早期电子计算机
- 5.1.3 冯·诺依曼知道些什么
- 5.2 冯 • 诺依曼体系结构
- 5.2.1 CPU
- 5.2.2 运算器
- 5.2.3 控制器
- 5.2.4 存储器
- 5.2.5 输入/输出(I/O)设备
- 5.2.6 冯·诺依曼计算机的运行:执行程序
- 5.3 逻辑门
- 5.3.1 基础逻辑门
- 5.3.2 其他逻辑门
- 5.4 电路
- 5.4.1 算术/逻辑电路
- 5.4.2 控制电路
- 5.4.3 存储电路
- 5.4.4 RS锁存器
- 5.5 构建处理器:将它们放在一起
- 5.5.1 ALU
- 5.5.2 寄存器堆
- 5.5.3 CPU
- 5.6 处理器执行程序指令
- 5.6.1 时钟驱动程序指令的执行
- 5.6.2 将它们放在一起:完整计算机中的CPU
- 5.7 流水线:让CPU更快
- 5.8 高级流水线指令注意事项
- 5.8.1 流水线注意事项:数据冒险
- 5.8.2 流水线冒险:控制冒险
- 5.9 展望未来:现代CPU技术
- 5.9.1 指令级并行
- 5.9.2 多核和硬件多线程
- 5.9.3 一些处理器示例
- 5.10 总结
- 参考资料
- 第6章 C语言底层:深入理解汇编
- 6.1 学习汇编的好处
- 6.2 你将在接下来的章节中学到什么
- 第7章 64位x86(x86-64)汇编
- 7.1 x86-64汇编基础知识
- 7.1.1 寄存器
- 7.1.2 高级寄存器符号
- 7.1.3 指令结构
- 7.1.4 操作数示例
- 7.1.5 指令后缀
- 7.2 常见指令
- 综合应用:一个更具体的示例
- 7.3 算术指令
- 7.3.1 移位指令
- 7.3.2 位指令
- 7.3.3 加载有效地址指令
- 7.4 条件和循环
- 7.4.1 预备知识
- 7.4.2 汇编中的if语句
- 7.4.3 汇编中的循环语句
- 7.5 汇编中的函数
- 7.5.1 函数参数
- 7.5.2 通过示例进行追踪
- 7.5.3 通过main函数进行追踪
- 7.6 递归函数
- 观看动画:观察调用栈的变化
- 7.7 数组
- 7.8 矩阵
- 7.8.1 连续二维数组
- 7.8.2 非连续矩阵
- 7.9 汇编中的结构体
- 数据对齐和结构体
- 7.10 真实世界:缓存区溢出
- 7.10.1 缓存区溢出经典案例
- 7.10.2 初步探索:猜谜游戏
- 7.10.3 进一步了解(在C环境下)
- 7.10.4 缓存区溢出:首次尝试
- 7.10.5 更聪明的缓存区溢出:再次尝试
- 7.10.6 缓存区溢出防御
- 参考资料
- 第8章 32位x86(IA32)汇编
- 8.1 IA32汇编基础知识
- 8.1.1 寄存器
- 8.1.2 高级寄存器符号
- 8.1.3 指令结构
- 8.1.4 操作数示例
- 8.1.5 指令后缀
- 8.2 常见指令
- 综合应用:一个更具体的示例
- 8.3 算术指令
- 8.3.1 移位指令
- 8.3.2 位指令
- 8.3.3 加载有效地址指令
- 8.4 条件和循环
- 8.4.1 预备知识
- 8.4.2 汇编中的if语句
- 8.4.3 汇编中的循环语句
- 8.5 汇编中的函数
- 8.5.1 通过示例进行追踪
- 8.5.2 通过main函数进行追踪
- 8.6 递归函数
- 观看动画:观察调用栈的变化
- 8.7 数组
- 8.8 矩阵
- 8.8.1 连续二维数组
- 8.8.2 非连续矩阵
- 8.9 汇编中的结构体
- 数据对齐和结构体
- 8.10 真实世界:缓存区溢出
- 8.10.1 缓存区溢出经典案例
- 8.10.2 初步探索:猜谜游戏
- 8.10.3 进一步了解(在C环境下)
- 8.10.4 缓存区溢出:首次尝试
- 8.10.5 更聪明的缓存区溢出:再次尝试
- 8.10.6 缓存区溢出防御
- 第9章 ARM汇编
- 9.1 ARM汇编基础知识
- 9.1.1 寄存器
- 9.1.2 高级寄存器符号
- 9.1.3 指令结构
- 9.1.4 操作数示例
- 9.2 常见指令
- 综合应用:一个更具体的示例
- 9.3 算术指令
- 9.3.1 移位指令
- 9.3.2 位指令
- 9.4 条件和循环
- 9.4.1 预备知识
- 9.4.2 汇编中的if语句
- 9.4.3 汇编中的循环语句
- 9.5 汇编中的函数
- 9.5.1 函数参数
- 9.5.2 通过示例进行追踪
- 9.5.3 通过main函数进行追踪
- 9.6 递归函数
- 观看动画:观察调用栈的变化
- 9.7 数组
- 9.8 矩阵
- 9.8.1 连续二维数组
- 9.8.2 非连续矩阵
- 9.9 汇编中的结构体
- 数据对齐和结构体
- 9.10 真实世界:缓存区溢出
- 9.10.1 缓存区溢出经典案例
- 9.10.2 初步探索:猜谜游戏
- 9.10.3 进一步了解(在C环境下)
- 9.10.4 缓存区溢出:首次尝试
- 9.10.5 更聪明的缓存区溢出:再次尝试
- 9.10.6 缓存区溢出防御
- 第10章 汇编要点
- 10.1 共同特点
- 10.2 进一步阅读
- 第11章 存储和内存层次结构
- 11.1 内存层次结构
- 11.2 存储设备
- 11.2.1 主存储设备
- 11.2.2 辅助存储设备
- 11.3 局部性
- 11.3.1 代码中的局部性示例
- 11.3.2 从局部性到缓存
- 11.3.3 时间局部性
- 11.3.4 空间局部性
- 11.4 CPU缓存
- 11.4.1 直接映射缓存
- 11.4.2 缓存未命中和关联设计
- 11.4.3 集合关联缓存
- 11.5 缓存分析和Valgrind
- 11.5.1 理论分析和基准测试
- 11.5.2 现实世界中的缓存分析:Cachegrind
- 11.6 展望未来:多核处理器上的缓存
- 11.6.1 缓存一致性
- 11.6.2 MSI协议
- 11.6.3 实现缓存一致性协议
- 11.6.4 有关多核缓存的更多信息
- 11.7 总结
- 第12章 代码优化
- 12.1 优化之前:了解编译器
- 12.1.1 编译器已经做了什么
- 12.1.2 编译器无法始终完成的任务:学习代码优化的好处
- 12.1.3 与编译器合作:一个示例程序
- 12.2 代码优化第一步:代码分析
- 12.2.1 使用Callgrind进行性能分析
- 12.2.2 循环不变代码移动
- 12.3 其他编译器优化技术:循环展开和函数内联
- 12.3.1 函数内联
- 12.3.2 循环展开
- 12.4 内存注意事项
- 12.4.1 循环交换
- 12.4.2 用于改进局部性的其他一些编译器优化技术:循环裂变和融合
- 12.4.3 使用Massif进行内存分析
- 12.5 总结
- 参考资料
- 第13章 操作系统
- 13.1 操作系统的工作原理及运行方式
- 13.1.1 操作系统的引导过程
- 13.1.2 让操作系统执行任务:中断和陷阱
- 13.2 进程
- 13.2.1 多道程序设计和上下文切换
- 13.2.2 进程状态
- 13.2.3 创建(和销毁)进程
- exec系统调用
- 13.2.4 退出和等待
- 13.3 虚拟内存
- 13.3.1 内存地址
- 13.3.2 虚拟地址到物理地址的转换
- 13.3.3 分页
- 13.3.4 内存效率
- 13.4 进程间通信
- 13.4.1 信号
- 13.4.2 消息传递
- 13.4.3 共享内存
- 13.5 总结
- 第14章 在多核时代利用共享内存
- 14.1 编程多核系统
- 14.1.1 多核系统对进程执行的影响
- 14.1.2 使用线程加速进程执行
- 14.2 编写你的第一个多线程程序
- 14.2.1 创建和加入线程
- 14.2.2 线程函数
- 14.2.3 运行代码
- 14.2.4 重新审视标量乘法
- 14.2.5 改进标量乘法:传递多个参数
- 14.3 线程同步
- 14.3.1 互斥
- 14.3.2 信号量
- 14.3.3 其他同步机制
- 14.4 并行程序的性能测量
- 14.4.1 并行程序性能测量基础
- 14.4.2 并行程序性能测量进阶
- 14.5 缓存一致性和虚假共享
- 14.5.1 多核系统中的缓存
- 14.5.2 虚假共享
- 14.5.3 解决虚假共享
- 14.6 线程安全
- 解决线程安全相关问题
- 14.7 OpenMP中的隐式线程
- 14.7.1 常用编译指示
- 14.7.2 为OpenMP增添趣味
- 14.7.3 一个更复杂的示例:OpenMP中的CountSort算法
- 14.7.4 了解更多关于OpenMP的知识
- 14.8 总结
- 参考资料
- 第15章 展望:其他并行系统和并行编程模型
- 一个全新的世界:Flynn体系结构分类法
- 15.1 异构计算:硬件加速器、GPGPU计算和CUDA
- 15.1.1 硬件加速器
- 15.1.2 GPU体系结构简介
- 15.1.3 GPGPU计算
- 15.1.4 CUDA
- 15.1.5 其他GPGPU编程语言
- 15.2 分布式内存系统、消息传递和MPI
- 15.2.1 并行和分布式处理模型
- 15.2.2 通信协议
- 15.2.3 消息传递接口
- 15.2.4 MPI Hello World
- 15.2.5 MPI标量乘法
- 15.2.6 分布式内存系统面临的挑战
- 15.3 迈向百亿亿次计算:云计算、大数据和计算科学的未来
- 15.3.1 云计算
- 15.3.2 MapReduce
- 15.3.3 展望未来:机遇与挑战
- 参考资料
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。
