CSAPP - Ch 1 - 计算机系统漫游
0 序言及摘要
(1) 序言:
CS:APP —— Computer Systems: A Programmer's Perspective, 中译本名为: 《深入理解计算机系统》.
从书名可以得知:
大部分系统书籍都是从 构建者的角度 来写, 讲述如何实现硬件或系统软件, 包括操作系统、编译器和网络接口;
而 CS:APP 是从 程序员的角度 出发, 讲述应用程序员如何能够利用系统知识来编写出更好的程序, 涉及到系统的硬件架构、操作系统、编译器、网络等基础方面.
(2) 摘要:
计算机系统是由一个硬件和系统软件组成的, 它们共同协作以运行应用程序. 计算机内部的信息被表示为一组组的位, 他们依据上下文有不同的解释方式. 程序被其他程序翻译成不同的形式, 开始时是ASCII文本, 然后被编译器和链接器翻译成二进制可执行文件.
处理器读取并解释存放在主存里的二进制指令. 因为计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据, 所以将系统中的存储设备划分成层次结构 —— CPU寄存器在顶部, 接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器.
更高层的存储设备比低层的存储设备读写更快、单位比特造价也更高.
较高层次的存储设备可以作为较低层次设备的高速缓存.
操作系统内核是应用程序和硬件之间的媒介, 它提供三个基本的抽象:
a. 文件是对I/O设备的抽象;
b. 虚拟内存是对贮存和磁盘的抽象;
c. 进程是处理器、主存和I/O设备的抽象.
网络提供了计算机系统之间通信的手段 —— 可以把网络当作是一种I/O设备.
1 信息就是位+上下文
以下面的C程序hello.c
为例:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
源程序实际上就是一个由0、1组成的位(bit, 比特)序列, 8个位被组成一组, 就是一个字节(Byte). 每个字节表示程序中的某些文本字符.
大部分现代计算机系统都适用ASCII标准来表示文本字符 —— 实际上就是用一个唯一的单字节大小的整数值来表示每个字符, 比如
#由35表示, i由105表示
.
hello.c程序是以 字节序列 的方式储存在文件中的, 每个字节都有一个整数值, 对应某些特定的字符.
注意: 每一行都是以一个看不见的换行符
\n
结束的, 对应的ASCII码是10.
hello.c的表示方法说明一个基本思想:
系统中的所有信息——包括磁盘文件、内存中的程序、内存中存放的用户数据, 以及网络上传输的数据, 都是由一串比特表示的.
区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文.
读书笔记: 上下文: 可以类比文章的前后文, 一个单独的int, 我们并不能明确地知道它的实际作用, 只有给出相邻的比特, 我们才能确定它的具体含义. 比如hello.c中, 由int的上下文可以知道, 这里的int是指明当前函数的返回值类型为int(整型).
2 程序被其他程序翻译成不同的格式
像上面的hello.c是我们开发人员可以看懂的高级语言编写的源代码文件, 要在系统上运行, 就必须通过其他程序将其转化为一系列的低级 机器语言 指令, 然后再将这些指令大包围 可执行目标程序(目标文件), 并以二进制磁盘文件的形式存放起来.
在Unix系统上, 从源文件到目标文件的转化是由 编译器驱动程序 完成的:
gcc hello.c -o hello
这里通过GCC编译器驱动程序读取源程序文件hello.c, 并把它变异成一个可执行目标文件hello, 具体步骤为:
(1) 预处理阶段: 预处理器(cpp)根据以字符#开头的命令, 修改原始的C程序: 这里将读取引入的系统头文件stdio.h, 将它插入到源程序中文本, 得到另一个C程序, 一般为hello.i;
(2) 编译阶段: 编译器(ccl)将文本文件hello.i翻译成文本文件hello.s, 就是一个汇编语言程序;
(3) 汇编阶段: 汇编器(as)将hello.s翻译成机器语言指令, 把这些指令打包成一种叫做 可重定位目标程序 的格式, 并将结果保存在目标文件hello.o中 —— 是一个二进制文件;
(4) 链接阶段: hello.c中调用了printf
打印函数, 这个函数是每个C编译器都提供的 标准C库 中的, 存在于printf.o的预编译好了的目标文件中, 在此阶段由链接器(ld)将printf.o合并到hello.o中, 最后得到hello文件 —— 可执行目标文件, 可以被加载到内存中由系统执行.
3 了解编译系统如何工作是大有益处的
(1) 优化程序性能
比如:
一个switch语句是否总是比if-else语句高效?
一个函数调用的开销有多大? while循环比for循环高效吗?
指针引用比数组索引更有效吗?
为什么将循环求和的结果放到一个本地变量中, 会比将其放到一个通过引用传递过来的参数中, 运行要快很多呢?
(2) 理解链接时出现的错误
一些最令人困扰的、难以定位的程序错误往往都和链接器操作有关. 比如:
链接器报告说无法解析一个引用是什么意思?
静态变量和全局变量的区别是什么?
静态库和动态库的区别是什么?
命令行上排列库的顺序有什么影响?
(3) 避免安全漏洞
缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因 —— 因为很少有程序开发人员能够理解 需要限制从不受信任的源接收数据的数量和格式.
安全编程的第一步就是理解 数据和控制信息存储在程序栈上的方式会引起的后果.
未完待续...
CSAPP - Ch 1 - 计算机系统漫游的更多相关文章
- CSAPP 第一章 计算机系统漫游
第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...
- CSAPP之阅读笔记-计算机系统漫游(1)
最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...
- CSAPP:第一章计算机系统漫游
CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...
- CSAPP =1= 计算机系统漫游
思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...
- [CSAPP笔记][第一章计算机系统漫游]
计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...
- CSAPP学习笔记 第一章 计算机系统漫游
Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...
- 【CSAPP】一、计算机系统漫游
一.位+上下文 文本文件 / 二进制文件: 文本文件是只由ASCII码构成的文件 二.从源代码到可执行文件的顺序 源代码 ——> 可执行文件(机器代码)共有四步: 全过程代码 gcc hello ...
- 六星经典CSAPP笔记(1)计算机系统巡游
CSAPP即<Computer System: A Programmer Perspective>的简称,中文名为<深入理解计算机系统>.相信很多程序员都拜读过,之前买的旧版没 ...
随机推荐
- 第一个C# Winform实例
前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入.VS版本VS2017 1:打开VS建立一个WInform 项目.拉入两个控件,gr ...
- python带有GIL解释器锁
1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能执行一个线程(在 ...
- pyhthon字典练习题
pyhthon字典练习题: 有如下集合: [11,22,33,44,55,66,77,88,99] 将所有大于55的值保存至第一个KEY值中,将所有小于55的值保存至第二个KEY值中.{"k ...
- httpclient信任所有证书解决SSLException:Unrecognized SSL message,plaintext connection
在使用 HttpClient 工具调用第三方 Http 接口时报错 javax.net.ssl.SSLException:Unrecognized SSL message,plaintext conn ...
- 学习vue感触
大学还没毕业,想着先找工作,感觉计算机专业在老家做没有太大的发展,于是就在大学所在城市找了份工作.来到公司的第一天,带我的师傅让我学习vue.之前完全没有接触过框架,而且专业知识比较薄弱,前几天一直处 ...
- .net core 基于 IHostedService 实现定时任务
.net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...
- Java线程池的增长过程
通过ThreadPoolExecutor的方式创建线程池 ThreadPoolExecutor 构造方法: public ThreadPoolExecutor(int corePoolSize, in ...
- php 生成随机字符串,数字,大写字母,小写字母,特殊字符可以随意组合
* 生成随机字符串* @param int $length 要生成的随机字符串长度* @param string $type 随机码类型:0,数字+大小写字母:1,数字:2, ...
- 关于http 500错误的小结分享
一般情况下,http 500内部服务器(HTTP-Internal Server Error)错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题. 如果访问静态页面没问题, ...
- 基于 kubeadm 部署单控制平面的 k8s 集群
单控制平面不符合 HA 要求,但用于开发/测试环境不会有任何问题,如果资源足够的话(10台以上服务器,3台用于APIserver.3台用于 etcd 存储.至少3台用于工作节点.1台作为负载均衡),可 ...