您的位置:首页 > 理论基础

《深入理解计算机系统》第一章 计算机系统漫游

2016-10-09 23:03 369 查看
第一章 计算机系统漫游
0 日志
2016年10月09日

2016年10月10日

2016年10月11

2016年10月19日081427

1 信息就是位 上下文

2 程序被其他程序翻译成不同的格式

3 了解编译系统如何工作是大有益处的

4 处理器读并解释存储在存储器中的指令
41 硬件的组成

42 运行hello程序

5 高速缓存至关重要

6 存储设备形成层次结构

7 操作系统管理硬件
71 进程

72 线程

73 虚拟存储器

74 文件

8 系统之间利用网络通信

9 重要主题
91 并发和并行

92 计算机系统中抽象的重要性

10 小结

第一章 计算机系统漫游

1.0 日志

2016年10月09日

今天早上一觉睡到9点。到公司将近10点了,早上没能看书,都是晚上这一个小时左右看的,记录的笔记。现在2016年10月09日23:06:18了,早点休息,明早继续。

2016年10月10日

昨晚0点多才睡,早上10点到的公司,早上又没学。新华要离开北京,订的今晚到小西天跟鹤总他们一起吃饭。下班就过去了,现在才回来2016年10月10日23:11:10。

今晚又不能学了,待会洗洗睡了。聊天时喝了一瓶啤酒,肚子各种不舒服,估计今晚也休息不好了,随之,明早估计也够呛能早起。

哈哈,刚指定的计划就被各种事情打乱,也是无奈。

得赶紧调整下,进入一个稳定的学习状态,这样下去可完不成这个计划。

洗洗睡,今晚要休息好。

2016年10月11

恩,第三天了,今天的借口是:这几天因为一个新增的难搞的需求,一直在加班弄。明早的时间估计也要搭进去了,明天下午技术评审。。。

恩,理由充分。(ps:(╯°Д°)╯︵ ┻━┻ 脸皮真厚)

2016年10月19日08:14:27

开完头之后,一眨眼过去了一个周,还啥都没干。上周十一放假后的连着上7天班,自己一直都没恢复到早睡早起的状态,现在差不多了。基本11点睡,7点起。如果休息不好,那么第二天早上脑子就不清醒,浑浑噩噩一天就过去了。

继续。

1.1 信息就是位 + 上下文

系统中所有的东西都是由一串位表示的。

8个位是1字节。

在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

文本文件:只由 ASCII 字符构成的文件称为文本文件,能看懂。

二进制文件:乱码文件。

1.2 程序被其他程序翻译成不同的格式

在 Unix 系统上,从源文件到目标文件的转换是由编译器驱动程序完成的:

gcc -o hello hello.c

编译过程可以分为四个阶段:预处理器、编译器、汇编器链接器。这四个阶段构成了编译系统



预处理阶段:预处理器(cpp) 根据以字符#开头的命令,修改原始的C程序,如 hello.c 第一行的
#include <stdio.h>
告诉预处理器读取系统头文件 stdio.h 的内容,并把它直接插入到程序文本中。
hello.c --> hello.i


编译阶段:把 C 翻译成汇编语言。编译器(cc1)把文本文件hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。
hello.i --> hello.s


汇编阶段:汇编器(as)把hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式。hello.o 是二进制文件,它的字节编码是机器语言指令而不是字符,在文本编辑器中打开,将是乱码。
hello.s --> hello.o


链接阶段:hello 程序使用了 printf 函数,该函数存在于 printf.o 的文件中,这个文件必须以某种方式合并到 hello.o 程序中。链接器(ld)负责处理这种合并。最后得到 hello 可执行文件,可以被加载到内存中,由系统执行。
hello.o --> hello 可执行文件。


1.3 了解编译系统如何工作是大有益处的

有一些原因促使程序员必须知道编译系统是如何工作的,原因如下:

优化程序性能:了解一些机器代码以及编译器将不同的 C 语句转行成机器代码的方式,知其原理,方可优化。

第3章 中会介绍两种相关的机器语言 IA32 和 x86-64。

第5章 学习如何通过简单转换 C 语言代码,以帮助编译器更好的完成工作,从而调整 C 程序的性能。

第6章 将会学到存储器系统的层次结构特性,C 语言编译器将数组存放在存储器中的方式,以及 C 程序又是如何能够利用这些知识从而更高效的运行。

理解连接时出现的错误:一些最令人困扰的程序错误往往都与链接器操作有关。例如,链接器报告他无法解析一个引用等等

避免安全漏洞:缓冲区溢出错误。

第3章 将描述堆栈原理和缓冲区溢出错误。

1.4 处理器读并解释存储在存储器中的指令

本节介绍了hello 程序如何在cpu上执行的。

1.4.1 硬件的组成

简单的介绍了总线、io设备、主存、处理器这些设备。

1.4.2 运行hello程序

shell 上输入”./hello”后,回车,shell逐一读入字符串到寄存器,之后把字符串存入内存中。

shell 加载hello程序从磁盘到内存(利用直接存储器读取DMA 第六章讨论,可以直接从磁盘督导内存,不需要通过CPU)。

hello加载完毕后,CPU执行hello程序的main程序的机器指令。将主存中要打印的”hello, world\n”,从内存加载到寄存器,再从寄存器复制到显示设备,最终显示在屏幕上。

1.5 高速缓存至关重要

hello程序中,系统花费了大量的时间把信息从一地方复制到另一个地方,从程序员角度,这些复制就是开销。减缓了程序的速度。

根据机械原理:较大的存储设备要比较小的存储设备运行慢,而快速设备的造价远高于同类的低速设备。

高速缓存:为了解决处理器与主存之间的差异,更小更快的存储设备。

本书得出的重要结论之一:意识到高速缓存存在的程序员可以利用高速缓存将他们程序的性能提高一个数量级。

[end]2016年10月19日09:56:13

1.6 存储设备形成层次结构

寄存器、一级缓存、二级缓存、三级缓存、主内存、本地磁盘、远程磁盘构成一个层次结构。上面一层是当前层的高速缓存。

1.7 操作系统管理硬件

操作系统是硬件和软件之间的一个中间层。它有两个基本功能:

防止硬件被失控的程序滥用

向应用程序提供简单一致的机制来控制硬件。

操作系统通过几个基本的抽象概念(进程虚拟存储器、和文件)来实现这两个功能。

1.7.1 进程

进程是系统对一个正在运行的程序的一种抽象。

并发执行多个进程是操作系统通过上下文切换这种机制实现的。

第八章详细解释。

1.7.2 线程

每个线程运行在进程的上下文中,共享同样的代码和全局数据。第十二章详细解释。

1.7.3 虚拟存储器

功能:为每个进程提供一个假象,即每个进程都在独占的使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间

它包含:

程序代码和数据:

堆:

共享库:存储C标准库和数学库等这种共享库的代码和数据。

栈:用户栈,编译器用它来实现函数调用。

内核虚拟存储器:内核总是驻留在内存中,是操作系统的一部分。

1.7.4 文件

文件的功能:向应用程序提供了一个统一的视角来操作各种硬件设备。

文件就是字节序列,每个I/O设备,包括磁盘、键盘、显示器、网络,都可以视为文件。

系统中所有输入输出都是通过一小组成为 Unix I/O的系统函数调用读写文件来实现的。

[end]2016年10月19日20:20:27

1.8 系统之间利用网络通信

[start]2016年10月20日08:19:52

网络也是一个I/O设备,系统通过网络进行通信。

1.9 重要主题

系统是硬件与软件的集合体,它们必须共同协作以达到运行应用程序的最终目的。

本书的书名是《深入理解计算机系统》,本书的余下部分会详细讲述硬件与软件的详细内容。了解这些内容可以写出更快、更安全的程序。

在此强调几个重要概念:

1.9.1 并发和并行

并发:指一个同时具有多个活动的系统。

并行:用并发使一个系统跑的更快。

线程级并发

进程这个抽象的出现,使我们能够设计出能同时执行多个程序的系统。

线程可以在一个进程中执行多个控制流。

指令级并行

现代处理器可以处理多条指令

单指令、多数据并行

一条指令可以产生多个可以并行执行的操作。

1.9.2 计算机系统中抽象的重要性

抽象的使用是计算机科学中最为重要的概念之一。



1.10 小结

计算机系统=硬件+系统软件

计算机内部的信息被表示为一组组的位,根据上下文的不同有不同的解释方式。

程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件。

因为计算机把大量的时间用于存储器、I/O设备和 CPU 寄存器之间复制数据,所以出现了存储设备层次模型。CPU 寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM 主存和磁盘存储器。越高越快。

操作系统介于硬件和应用程序之间。它提供了三个抽象:

文件:对I/O设备的抽象。

虚拟存储器:对主存和磁盘的抽象。为每个进程提供一个假象,即每个进程都在独占的使用主存。

进程:是对处理器、主存和 I/O设备的抽象。

最后网络提供了计算机之间通信的手段。

[end] 2016年10月20日08:50:46
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息