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章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...
随机推荐
- getAnnotation的一个坑
// TableField annotation = f.getAnnotation(TableField.class); // 不建议使用这个,建议使用下面这个方法获取 TableField ann ...
- 如何选择一台适合Java开发的电脑
前言 最近在群里有同学求推荐Java开发用的电脑,所以胖哥就出个简单的专题,用我贫瘠的电脑知识来帮助大家选择适合开发的电脑配置.因为家里的主机已经带不动两个 IDEA 了,更别提开个 Docker 啥 ...
- linux 查找删除
find -name "*.php" -exec rm -f '{}' \;
- Java异步CompletableFuture的使用
所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法.Java中的CompletableFuture 提供了四个静态方法来创建一个异步操作. public static Co ...
- 国际象棋棋盘输出-PHP代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flink创建视图的几种方式
import org.apache.flink.api.common.typeinfo.BasicTypeInfo; import org.apache.flink.api.java.typeutil ...
- VSCode 快速生成.vue基本模板、发送http请求模板
安装vscode 官网:https://code.visualstudio.com/ 安装 Vetur 插件,识别 vue 文件 插件库中搜索Vetur,点击安装,安装完成之后点击重新加载 新建代码片 ...
- WebApis中DOM操作的基本案例
1.1. 排他操作 1.1.1 排他思想 如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法: 所有元素全部清除样式(干掉其他人) 给当前元素设置样式 (留下我自己) 注意 ...
- Linux下如何知道是否有人在使坏?
在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...
- (Android图片内存优化)Picasso加载图片 教程。。详细版
Picasso 是 Android 上一个强大的图片下载和缓存库. 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Picasso.with( ...