展开全部

主编推荐语

本书介绍了现代计算机系统的主要硬件和软件。

内容简介

计算机系统是计算机专业的常见课程,也是学习编程过程中的重要学习内容。

本书按抽象层次设置各章节,从常用于编写操作系统的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日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。