读《CSAPP》2E I
为读《CSAPP》II做准备。
读《CSAPP》2E II笔记。
2015.01.02 – 01.03
1 计算机系统漫游
(1) 信息就是位 + 上下文
计算机内存中的一段二进制码,在不同的“上下文”中其含义不同,它可以表示一个整数、浮点数、字符串或者指令。“上下文” ---- 比如“char ch = ‘a’;”ch地址中所存的’a’的二进制码,其类型char(源程序级)就算一种上下文。
(2) 编译器的作用
对编译器的最初层次的认识:
- 编译器根据特定的计算机系统(硬件,操作系统)来编写(此计算机对有符号、浮点数的编码方式,最多支持多少位的数据类型,有哪些汇编指令等)
- 将源程序编译成机器指令(汇编指令与机器指令一一对应。如C,编译器根据其内的转换方式先将C指令编译成对应的汇编指令,再将汇编指令转换成机器指令)
- 优化高级语言中的写法(如将C程序中的乘法转换为加法来实现),再将这些加法转换成汇编,再由汇编到机器指令。
[汇编语言中的伪指令等由编译器来解释,只有汇编指令会被对应的转换为机器指令,最后被机器执行]
PartI 程序结构和执行
理解程序和硬件之间的交互关系(硬件资源是如何被用来执行指令)。然后再理解编译器和机器代码,达到编写高性能C程序,最大化程序性能的目标。
2014.12.30 – 2015.01.02
2 程序结构和执行
(1) 信息存储
信息存储(二进制):
- 虚拟地址空间(机器程序级)
- 数据(指定的类型)存储,寻址和寻址顺序
- 二进制的运算(位级、逻辑、移位运算)
![](/assets/blank.gif)
Figure 1. 内存级别
(2) 整数、浮点数
计算机中的整数、浮点数(二进制):
- 编码(无/有符号整数、浮点数编码)。在机器程序级下,它们的编码值被分别存在虚拟地址空间中;
- 运算规则(强制/隐式类型转换、四则运算、浮点数的舍入方式)。
- 编码不统一带来的代码可移植性问题。运算所带来的溢出等问题(用“编码值” + “规则”来判断和纠正)。
![](/assets/blank.gif)
![](/assets/blank.gif)
Figure 3. 浮点数
2015.01.03
3 程序的机器级表示
《CSAPP》“程序的机器级表示”一章窥视了C语言的抽象层下面的东西(C经过编译器的机器级程序表示)。通过让编译器产生机器级程序的汇编代码表示,让人了解编译器和它的优化能力,以及机器、数据类型和指令集。个人学习“程序的机器级表示”章节路线:
- 可将读“《汇编语言》—王爽”作为此章前部分即介绍跟汇编指令相关内容的基础,或者花更多的功夫直接读此部分内容。
- 结合《CSAPP》,了解C语言(控制、数组、结构体等数据结构、指针)的抽象层下面的机器级程序最好通过编写对应的C代码,再编译成对应的汇编指令来理解。像过程(栈帧、转移、递归等)中的内容更应多多实践来加深理解。通过亲自多次阅读、并理解经编译器生成的汇编代码(或反汇编),以了解C指令经编译器后在机器级上的指令表示。
2014.01.08
4 处理器体系结构
书中的“Y86指令集”说明了不管是汇编语言还是寄存器都只是“助记符”,它们都对应一个编码。计算机不同的功能需要不同的电平(集合)驱动,这些电平对应了逻辑上的0, 1串,将这些0, 1串间接或者直接地用助记符(汇编指令,寄存器名)来一一对应(对于人来说,助记符更符合人们的习惯[当然,咱得先学几个单词])。如此,在设计了编译器后,我们就可以使用助记符来指定计算机的功能(助记符 --> 机器码[0, 1串] --> 高/低电平 + 时钟指定计算机中组合/时序电路工作)。
“逻辑设计和HCL”指出计算机中的运算等操作都是经过最基本的逻辑门来实现的。根据组合/时序逻辑设计方法,可以设计出具一定功能的电路,如比较器、寄存器、存储器等。我们可以去设计这些属于数字电路的内容(如通过FPGA)。
通过“Y86顺序实现”来说明计算机执行指令的过程。这部分内容跟《计算机组成原理/体系结构》中涉及的内容/思维相同,《CSAPP》还涉及了处理器的设计思想,如流水线(实现);还涉及到处理器不能处理的情况(异常处理)。知己知彼的状态更有利于作战,所以,这部分内容可熟读并理解。毕竟,咱虽没有加工制作过处理器,但还是有少许可能去设计它的。
2015.01.08 –01.09
5 优化程序性能
![](/assets/blank.gif)
2015.01.09
6 存储器层次结构
把存储器系统当作一个线性的字节数组是一个有效的模型,但它没有反映现代系统实际工作的方式。实际上,存储系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。存储器层次结构对应用程序的性能有着巨大的影响,如果程序所需要的数据是保存在CPU寄存器中的,那么在指令的执行期间,在零个周期内就能访问到它们;如果存储在高速缓存中,需要1 ~ 30个周期;如果存在主存中,需要 50 ~ 200个周期;如果存在磁盘上,大约需要几千万个周期。
如果理解系统是如何将数据在存储器层次结构中上上下下移动的,那就可以这样编写应用程序:使其中的数据项存储在层次结构较高的地方,在那里CPU能更快地访问到它们。倾向于一次又一次地访问相同的数据项集合,或是更倾向于访问邻近的数据项集合称为计算机程序的局部性。具有良好局部性的程序比局部性差的程序更多地倾向于从存储层次结构中较高层次处访问数据项,因此运行得更快。
阅读此章从“编写高速缓存友好的代码”(告诉缓存对应用程序性能的影响最大)的实际掌握其中的技巧,并随便学习与存储相关的科普知识。涉及此部分内容的其它书本有《计算机组成原理》。
PartII 在系统上运行程序
掌握程序和操作系统之间的交互关系。
2015.01.09
7 链接
学习链接的作用:
- 有利于解决构造大型程序时所遇到的“模块缺少”、“缺少库、不兼容库”等引起的链接错误
- 帮助避免一些诸如错误地定义多个全局变量的危险编程错误
- 帮助理解语言的作用域规则的实现(static)
- 利用共享库(动态链接)
涉及到链接内容的书本有《Linux C编程一站式学习》、《C专家编程》。
2015.01.09
8 异常控制流
学习异常控制的作用:
- ECF操作系统用来实现I/O、进程和虚拟内存的基本机制,在正确理解这些概念之前得理解ECF。
- 帮助理解应用程序和操作系统的交互(系统调用)
- 操作系统为应用程序提供了创建进程、等待进程终止、通知其它进程系统中的异常事件等提供了强大的ECF机制,理解了这些机制可以编写Unix外壳和Web服务器
- ECF是计算机系统实现并发的基本机制
- 帮助理解软件的异常是如何工作的(如C++的try-catch)
理解跳转、调用和返回等概念(描述的现象)可以看书本《汇编语言》 ---- 王爽。
2015.01.10
9 虚拟存储器
一个系统中的进程是与其它进程共享CPU和主存资源的。为了更加有效地管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟存储器。虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。2)它为每个进进出出提供了一致的地址空间,从而简化了存储器管理。3)它保护了每个进程的地址空间不被其他进程破坏。
虚拟内存不需要应用程序员的任何干涉,但学习虚拟内存有以下作用:
- 理解虚拟内存将帮助程序员更好的理解系统通常是如何工作的,在硬件异常、汇编器、链接器、加载器、共享对象、文件和进程的设计中扮演着重要对象。
- 通过虚拟内存程序员可以创建和销毁存储器片、将存储器片映射到磁盘文件的某个部分,以及与其他进程共享存储器。
- 程序中引用变量、引用指针、动态分配内存都会和虚拟存储器发生交互。如果虚拟内存引用不当,将会发生错误。
学完此章要理解虚拟存储器是如何工作的,应用程序如何使用和管理虚拟存储器。若掌握了这些细节知识,就可以手工模拟一个小系统的虚拟存储机制,通过显式的存储器映射和对像malloc程序这样的动态存储分配器的调用来管理虚拟存储器,还会对虚拟内存的概念更加清晰。
PartIII 程序间的交互和通信
应用程序利用操作系统提供的服务来与I/O设备及其他程序通信。学习这部分内容后,可以学习编写诸如Web服务器这样的可以同时为多个客户端提供服务的并发程序。编写并发应用程序还能使程序在现代多核处理器上执行得更快。
2015.01.11
10 系统级I/O
输入/输出(I/O)是在主存和外部设备(如磁盘驱动、终端和网络)之间拷贝数据的过程。输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝到数据到I/O设备。
所有语言的运行时系统都提供执行I/O的较高级别的工具(如ANSI C提供标准I/O库,包含像prinf和scanf这样执行带缓冲区的I/O函数)。大多时候,高级别I/O函数工作良好,没有必要直接使用Unix I/O。那么学习系统级I/O的作用有:
- 了解I/O帮助理解其它的系统概念(同时理解进程和I/O才能分别明白进程和I/O,可以在理解存储器层次结构、链接和加载、进程以及虚拟存储器后再学系统级I/O,以作为对I/O的深入了解)
- 有时必须使用系统级I/O(读取文件数据的元数据,如文件大小或创建时间;网络编程)
- 此章是学习网络编程和并发的基础
涉及到系统级I/O和标准库I/O的书籍有《Linux C编程一站式学习》。
2015.01.11
11 网络编程
网络应用(浏览Web、发送E-mail、弹X window)基于相同的基本编程模型,有着相似的整体逻辑结构,并且依赖相同的编程接口。网络编程依赖的基础有“进程”、“信号”、“信号”、“字节顺序”、“存储器映射”以及“动态分配”,然后再掌握客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端-服务器程序。结合这些概念能够开发一个小但功能齐全的Web服务器,能够为真实的Web浏览器提供静态和动态的文本和图片内容。
2015.01.11
12 并发编程
逻辑控制流在时间上重叠就是并发(硬件异常处理程序、进程和Unix信号处理程序等),并发可以出现在计算机系统的许多不同层面上。并发不仅是操作系统内核用来运行多个应用程序的机制,它也可以在应用程序中成为重要角色。
应用级并发程序的作用有:
- 访问慢速I/O设备时,内核可以运行其他进程
- 在与人交互的同时执行多个任务
- 应用程序可以通过推迟其他操作和并发的执行它们
- 服务多个服务端(创建并发服务器为每个客户端创建一个单独的逻辑流)
- 在多核机器上进行并行计算
使用应用级并发的应用程序称为并发程序,现代操作系统提供了三种基本的构造并发程序的方法:
- 进程(由内核调度和维护,IPC)
- 应用程序在一个进程的上下文中显示地调度它们自己的逻辑流(I/O多路复用)
- 线程(运行在一个单一进程上下文中的逻辑流,由内核进行调度)
PartIV 读《CSAPP》II安排
看到11章时,不禁想起《鹿鼎记》中澄观师侄跟韦小宝说一段对话 要练易筋经,得先练好般若掌……需得从少林长拳、罗汉拳、伏虎拳、韦陀掌、大慈大悲千手式……到能练成小宝最想学的一指禅功夫,便少说也得三四十年。 法慧禅师,生有宿慧,入寺不过三十六年,就练成了一指禅,进展神速,前无古人,后无来者。南宋建炎年间,有一位灵兴禅师,也不过花了三十九年时光。那都是天纵聪明、百年难遇的奇才,令人好生佩 服。前辈典型,后人也只有神驰想像了。澄观甚是得意,道:“以四十二年而练成一指禅,本派千余年来,老衲名列第三。” |
因为《CSAPP》中各章节几乎都需要有Linux OS的本,因此不涉及有本或无本的优先读书顺序。因此就只剩下个人直觉上的读章顺序(遇到多书讲同一章节的数就同时看多书,用一本)如下:
![](/assets/blank.gif)
读《CSAPP》2E I相关推荐
- 读csapp有感:大端法,小端法
2019独角兽企业重金招聘Python工程师标准>>> 先介绍什么是大端法,小端法. 就是根据字节顺序在内存中的排列顺序的差异的两种标准,小端法指的是机器选择在存储器重按照从低有效字 ...
- 你最近在读什么书,及CSAPP上的一个疑问
你最近在读什么书,及CSAPP上的一个疑问 "你最近在读什么书?"这句话我在两处看到过.一处是鲁迅先生关怀青少年成长,问某个孩子的,然后向他推荐了<表>这样的道德教育类 ...
- CSAPP LAB1 datalab-handout
实验题目: Datalab-handout 实验目的: 只使用有限数量.规定的操作符条件下,填写bits.c文件中尚未完成的各个函数的内容.并利用dlc和btest两个工具来检测所写的函数代码格式及功 ...
- 这可能是东半球最保姆级的后台服务器开发学习路线
作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...
- 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...
- 后台服务器开发都要会些啥?| 内卷么?
前言 大家好,我是石头哥.上周的文章鸽了,因为跑去"北方小桂林"玩了一圈.风景还不错,给大家看看. 这是一张航拍的全景图,我的小飞机时隔一年终于派上用场了. 当然,你识别下面的小程 ...
- HIT-ICS2020大作业
doc排版转换成md太恶心了,图片三四十张!!! 推荐下载我上传的资源查看. https://download.csdn.net/download/ggtged/12469782 计算机系统大作业 题 ...
- 2021年度总结 2022学习规划
文章目录 一.2021博客总结 二.2022学习规划 一.2021博客总结 在2021/4/17 的时候和林老师谈论了一番有关算法的学习心路历程,跟林老师提出自己学完算法就忘,林老师建议我写一下博客, ...
- 后台服务器开发学习指南(建议收藏)
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学 ...
- 多发射动态调度流水线
文章目录 一.提高流水线执行效率 二.多发射数据通路 三.动态调度 3.1 保留站(发射队列) 3.2 寄存器重命名 3.3 重排序缓冲(ROB) 3.4 总结 一.提高流水线执行效率 看懂这一章节的 ...
最新文章
- 将阿拉伯数字转换为其对应的中文数字
- tableau应用实战案例(四十八)-以可视化的形式打开目标跟踪
- javascript--弹出对话框 四种对话框 获得用户输入值 .
- java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
- php数组如何去掉相同的元素,如何去掉php数组中的重复的元素
- BufferedInputStream的read()方法源码解析
- XML/YAML文件的输入输出
- 英伟达美女工程师:AI从业者要不要读博?要不要自己创业?
- 准备创建一个自己的校验提示Extender
- ken沈oracle,甲骨文宣布推出Oracle商务软件
- Ubuntu 20.04 安装多个版本 php 并应用到 nginx
- excel单元格内加空格_Excel基础知识,你懂多少?
- 锂电池保护板测试软件,锂电池保护板的简单检测方法
- win10设置HTML桌面背景,win10系统分屏设置不同壁纸教程
- openLooKeng视图详解
- 三年级计算机活动记录,小学三年级主题班会活动记录
- 技术研发:如何突破自己的技术瓶颈期
- HTML label标签介绍
- li , io域名国外注册教程
- 动态磁盘和基本磁盘的简要介绍
热门文章
- 积分商城运营中,签到任务以及兑换任务的制定要点
- 一二三四五六七八九十
- 基于C语言 — 简易银行活期储蓄账目管理系统
- 微信赛马服务器,首日卡组汇总:服务器炸了多次,标准狂野全员自闭全员赛马!...
- 自然数学-导数运算法则和洛必达法则
- windows 杀掉程序运行的进程
- whmcs系统云服务器购买,whmcs主机服务器
- centos7使用Docker的详细教程
- 今天晚上雨夹雪,爱人狠心把我撇。今夜孤独一个人,只好来把代码写。 欢迎阅读我的第四章笔记 深入类的方法...
- 问题解决:xml.parsers.expat.ExpatError: mismatched tag: line 63, column 4(itchat)