CSAPP 第一章 计算机系统漫游
第一章 计算机系统漫游
C语言的起源:(系统级编程的首选)
- C语言与Unix操作系统关系密切
- C语言小而简单:其设计由一个人掌控
- C语言是为实践目的设计的:其设计用来实现Unix操作系统
C语言程序编译的四个阶段:

- 预处理阶段:预处理器(cpp),根据字符#开头的命令,修改原始的C程序,hello.c -> hello.i
- 编译阶段:编译器(ccl),将预处理结果翻译为汇编文件,hello.i -> hello.s
- 汇编阶段:汇编器(as),将汇编文件翻译成机器语言指令,hello.s -> hello.o
- 链接阶段:链接器(ld),合并不同的*.o文件,生成可执行目标文件,hello.o + printf.o -> hello
了解编译系统,有助于:
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
系统的硬件组成:

- 总线:携带信息字节并负责在各个部件间传递
- 字:总线上传送的定长字节块
- I/O设备:系统与外部世界的而联系通道
- 控制器:I/O设备本身或者系统的主板上的芯片组
- 适配器:插在主板插槽上的卡
- 主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据
- 处理器:解释(或执行)存储在主存中指令的引擎
- 核心:程序计数器,大小为一个字
- 指令集架构:描述每条机器代码指令的效果
- 微体系结构:描述处理器实际上是如何实现的
- 总线:携带信息字节并负责在各个部件间传递
高速缓存存储器(cache):数据暂时的集结区域,存放处理器近期可能会需要的信息
- L1高速缓存:容量可达数万字节,访问速度几乎和访问寄存器文件一样快
- L2高速缓存:容量为数十万到数百万字节,访问时间比访问L1高速缓存长5倍,但仍比访问主存快5~10倍
存储器层次结构:从上至下,设备的访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜

- 主要思想:上一层的存储器作为低一层存储器的高速缓存
操作系统:应用程序与硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统
- 主要功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
- 基本抽象概念:
- 进程:对处理器、主存和I/O设备的抽象表示
- 虚拟内存:对主存和磁盘I/O设备的抽象表示
- 文件:对I/O设备的抽象表示
- 主要功能:
进程:操作系统对一个正在运行的程序的一种抽象,制造一种假象,即某个程序的代码和数据是系统内存中唯一的对象
- 并发运行:一个进程的指令和另一个进程的指令是交错执行的
- 上下文:跟踪程序运行所需的所有状态信息(PC、寄存器文件的当前值、主存的内容等)
- 上下文切换:一种进程间交错执行的机制,保存当前进程的上下文,恢复新进程的上下文,将控制权传递到新进程
- 操作系统内核:操作系统代码常驻主存的部分,是系统管理全部进程所用代码和数据结构的集合
- 当应用程序需要操作系统的某些操作时,它就执行一条特殊的系统调用指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序
线程:一个进程可由多个执行单元(线程)组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据
虚拟内存:为每个进程提供一种假象,即每个进程都在独占地使用主存
内存地址空间

- 程序代码和数据:在进程一开始运行时就被指定了大小,直接按照可执行文件的内容初始化
- 堆:可以在运行时动态地扩展和收缩(调用free、malloc等函数)
- 共享库:用来存放像C标准库和数学库这样的共享库的代码和数据
- 栈:实现函数调用,在程序执行期间可以动态地扩展和收缩(调用函数、函数返回)
- 内核虚拟内存:为内核保留,不允许应用程序读写和直接调用
文件:字节序列,每个I/O设备都可以看成是文件
- 系统中所有输入输出都是通过使用Unix I/O系统函数调用读写文件来实现的
Amdahl定律:
主要思想:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度
总执行时间:
$T_{new}=(1-\alpha)T_{old}+(\alpha T_{old})/k=T_{old}[(1-\alpha)+\alpha/k]$
- $T_{old}$:(原来)系统执行某应用程序需要的时间
- $T_{new}$:(加速后)系统执行某应用程序需要的时间
- $\alpha$:系统某部分所需执行时间与$T_{old}$的比例
- $k$:该部分性能提升比例
加速比:
$S={T_{old}\over T_{new}}={1\over(1-\alpha)+\alpha/k}$
- $S$:加速比
并发和并行:
并发:指一个同时具有多个活动的系统
并行:指用并发来使一个系统运行得更快
三个层次:
线程级并发:传统意义上这种并发行为只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的

- 超线程:一项允许一个CPU执行多个控制流的技术
- 涉及CPU某些硬件有多个备份:如程序计数器、寄存器文件
- 其他的硬件部分只有一份:如执行浮点算术运算的单元
- 多处理器:
- 减少了在执行多个任务时模拟并发的需要
- 可以使应用程序运行得更快
- 超线程:一项允许一个CPU执行多个控制流的技术
指令级并行:现代处理器可以同时执行多条指令的属性
- 流水线:将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行地操作,用来处理不同指令的不同部分
- 超标量:处理器达到比一个周期一条指令更快的执行速率
单指令、多数据并行:允许一条指令产生多个可以并行执行的操作(SIMD并行)
抽象:

CSAPP 第一章 计算机系统漫游的更多相关文章
- [CSAPP笔记][第一章计算机系统漫游]
计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...
- CSAPP:第一章计算机系统漫游
CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...
- CSAPP学习笔记 第一章 计算机系统漫游
Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...
- CSAPP - Ch 1 - 计算机系统漫游
目录 0 序言及摘要 1 信息就是位+上下文 2 程序被其他程序翻译成不同的格式 3 了解编译系统如何工作是大有益处的 0 序言及摘要 (1) 序言: CS:APP -- Computer Syste ...
- 读CSAPP第一章的收获
这个系列只写了CSAPP第三版对于我的收获. 里面的内容很多,我只写我以前不知道的,然后现在又觉得挺有用的内容. 没有很好的排版,将就看. Amadhl定律:主要观点,想要显著加速整个系统,必须提升全 ...
- CSAPP之阅读笔记-计算机系统漫游(1)
最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...
- CSAPP =1= 计算机系统漫游
思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...
- 深入理解计算机系统 Start && 第一章要点
对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...
随机推荐
- Android studio 在项目里配置签名 + cmd命令安装apk在测试机
一.在项目里配置签名 搜索百度里有很多可视化操作在项目里配置签名,但是对于已经有签名的旧项目来说,用语句是最方便的. 方法: 第一步:把签名文件放到项目中,和build.gradle的同一级目录下.当 ...
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- .NET5.0 Preview 8 开箱教程
.NET5.0 Preview 8 开箱教程 前言 首先,看到 .NET5.0 Preview 8 发布后,作为一枚基层应用开发人员,很想要体验一下新版本的魅力:这可能就是程序员对新技术的一种执着吧. ...
- 力扣Leetcode 572. 另一个树的子树
另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 ...
- C++标准模板库(STL)常用介绍
1. 输入输出 C++既可以用C的scanf和printf,也可以用新增的的cin与cout,后者速度慢 1.1 C程序中输入输出 int a; scanf("%d",&a ...
- Log4Net + Log4Mongo 将日志记录到MongoDb中
实现: 将日志保存在MongoDb中: 自定义日志字段: 日志按照日期拆分集合: 第一部分:将日志保存在MongoDb中 新建控制台程序Log4MongoDemo 通过NuGet安装Log4Net ( ...
- shader效果
Unity Shader - 消融效果原理与变体 https://www.jianshu.com/p/d8b535efa9db
- 避免nullpointer 空指针
来自知乎: 一般在服务器返回的数据上我们会做数据合法性检测,所以在api文档上需要注明字段的取值范围,然后客户端根据这个去做数据检测,缺段就直接走数据错误的流程,这个很大程度上避免了不少nullpoi ...
- SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign
1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...
- [PyTorch 学习笔记] 5.1 TensorBoard 介绍
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson5/tensorboard_methods.py http ...