深入理解计算机系统
云聪
喜欢简洁的抽象,也着迷神奇的细节,我担心自己因为过于偏向抽象而变得肤浅,也害怕自己因为太过深入细节而迷失,这让我很痛苦,但是我不会放弃挣扎,因为我相信挣扎的过程就是成长。
展开
-
翻译开始
从今天开始,我要开始翻译《Computer System A Programmer‘s Perspective》了,出于这样的目的:1.我一直想成为一名很厉害的程序员,而本书作者声称学习了这本书中的概念的人将会成为很稀有的非常厉害的程序员,所以这本书给了我一条走向目的地的捷径。2.为什么不看中文版呢?因为我想利用学过的英语,不想荒废它。翻译 2015-03-21 11:23:38 · 592 阅读 · 0 评论 -
深入理解计算机系统 第二章 表示和操作信息
现代系统存储和处理信息,这些信息是通过二进制表示的。二进制,或者成为位(bit),形成了数字革命的基础。十进制(以10为基底)已经使用了超过一千年,它形成于印度, 在十二世纪被阿拉伯数学家改进,十三世纪被意大利数学家斐波那契带到西方。对于有十个手指头的人来说,使用十进制是很自然的,但是对于存储和处理信息的机器来说,二进制是更合适的。翻译 2015-12-21 21:36:24 · 1105 阅读 · 0 评论 -
深入理解计算机系统 1.6 存储设备形成层次结构
在处理器和一个更大更慢的存储设备(比如内存)之间插入一个更小更快的存储设备的观点是比较常见。实际上,每一个计算机系统中的存储设备都被组织为像Figure1.9所示的存储层次结构。当我们从层次结构的顶端看下来,存储设备变得更慢,更大,也更便宜了。寄存器占据着层次结构的顶端,被称为level0,或者L0。我们展示了三个层次的缓存,从L1到L3,它们占据着层次中的1到3级。内存占据着层次结构中的第四层,翻译 2015-12-08 22:56:21 · 682 阅读 · 0 评论 -
深入理解计算机系统 2.1.1 字
每一个计算机都有一个字长度,(字长度)indicating the nominal size of integer and pointer data。因为虚拟地址是通过一个字来编码的,字长度决定了虚拟地址空间的最大长度。也就是说,字长度为w位的计算机,虚拟地址的范围是0到2^w − 1,在它之上运行的程序只能访问到2^w个字节。翻译 2016-01-06 21:52:23 · 608 阅读 · 0 评论 -
深入理解计算机系统 2.1.1 十六进制记法
一个字节由8位组成。在二进制记法中,它能表示的范围为从000000002到111111112;在十进制记法中,它能表示的范围为从010 to 25510。这两种记法都不适合描述位模式。二进制太冗长,在位模式和十进制之间来回转换十分麻烦。于是,我们用十六进制整数来写位模式。十六进制用数字0到9和字母和字符A到F来表示16个可能的值。Figure 2.2展示了这16个十六进制数字对应的二进制和十进翻译 2016-01-04 23:22:07 · 1276 阅读 · 0 评论 -
深入理解计算机系统 1.9 重要主题
这一节结束我们旋风般的系统之旅。一个重要的观点是,一个系统不仅仅是硬件。它是硬件和系统软件的集合,它们必须合作才能实现运行应用软件的目的。这本书剩余部分会讨论更多关于软件和硬件的细节,并展示如何通过理解这些概念让你写出更快、更可靠、更安全的程序。为了结束这章,我们强调几个重要概念,这些概念横跨计算机系统的各个方面。我们将在这本书的很多地方讨论这些概念的重要性。翻译 2015-12-19 00:18:23 · 880 阅读 · 0 评论 -
深入理解计算机系统 2.1 信息存储
大多数计算机用字节(8位)作为内存中最小的存储单元,而不是位。机器级的程序把内存看着一个非常巨大的字节数组,这个数组被称为虚拟内存。内存中的每一个字节都被唯一的一个数字标识,这个数字就是这个字节的地址,所有可能的地址的集合被称为虚拟地址空间。顾名思义,虚拟地址空间只是呈现给机器级程序的概念视图。实际的实现(在第九章讨论)使用随机访问存储器(RAM),磁盘存储器,特殊硬件,和创作系统软件的组合来提供给翻译 2016-01-03 17:56:46 · 825 阅读 · 0 评论 -
深入理解计算机系统 1.8 系统通过网络与其它系统交流
在此之前,我们一直把计算机系统视为一个独立的硬件和软件集合。实际上,现代系统总是通过网络与其它系统相连的。从单独系统的角度看,网络只是另一个I/O设备罢了,就如Figure 1.14所示。当系统从内存复制字节序列到网络适配器时,数据通过网络流向另一个机器,而不是流向本地磁盘。相似的,系统能读取从其它机器发送来的数据并把数据拷贝到它的内存里。随着全球网络(比如互联网)的出现,从一个系统向另一翻译 2015-12-14 22:07:25 · 701 阅读 · 0 评论 -
深入理解计算机系统 1.5 缓存很重要
我们从这个简单的例子中看到的很重要的一点是,系统花了大量时间来把信息从一个地方移动到另一个地方。hello程序里的机器指令最初保存在硬盘上。当程序被加载的时候,它们被复制进内存中。当处理器运行程序的时候,指令又从内存复制进处理器中。相似的,数据字符串“hello,world\n”,最开始保存在硬盘上,然后复制进内存中,最后又从内存中复制到显示设备。从程序员的角度来看,这些复制使程序的实际工作变慢了翻译 2015-09-05 15:04:18 · 586 阅读 · 0 评论 -
深入理解计算机系统 1.4 处理器读取和解释存储在内存中的指令
到现在,我们的hello.c源程序已经已经被编译系统翻译为可执行对象文件了,这个可执行对象文件叫做hello,被存储在磁盘上。为了在Unix系统上运行可执行文件,我们在一个叫做shell的应用程序中输入它的名字:unix> ./hellohello, worldunix>shell程序是一个命令行解释器,它打印出一条提示,等着你输入一条命令行,然后执行命令。如果输入的命令行的第一个翻译 2015-08-23 23:52:35 · 3469 阅读 · 0 评论 -
深入理解计算机系统 1.3 理解编译系统如何工作是有回报的
对于像hello.c这样简单的程序,我们能指望编译系统产生正确高效的机器码。然而,有几个重要原因使得程序员需要去理解编译系统是如何工作的:优化程序执行效率。现代编译器都是非常聪明的工具,它们通常都能产生好的机器码。作为程序员,为了写出高效的代码,我们不需要去知道编译器的内部工作机制。然后,为了在我们的C程序中做出好的编码决定,我们确实需要对机器码和编译器如何把不同的C语句翻译成机器码有翻译 2015-03-23 11:20:44 · 668 阅读 · 0 评论 -
深入理解计算机系统 1.2 程序被其它程序翻译成不同形式
hello程序作为高级C程序开始它的生命,之所以被叫做高级的,是因为它能人类阅读和理解。然而,为了能在系统上运行hello.c,单个的C语句必须被其它程序翻译成一系列低级的机器语言指令。这些指令以被叫做可执行对象程序的形式打包,并且被存储为二进制磁盘文件。对象程序与可执行对象文件关联。在Unix系统上,从源文件到对象文件的翻译过程被编译器执行:unix> gcc -o hello hell翻译 2015-03-22 11:20:16 · 791 阅读 · 0 评论 -
深入理解计算机系统 1.1 信息就是位 + 上下文
我们的hello程序作为一个被程序员用编辑器创建并保存在hello.c文件中的源程序开始它的生命。源程序就是一个位序列,每一个位代表0或者1,这些位序列每八位组成一个字节。在程序中,每一个字节代表一个字符。大部分现代系统用ASCII标准呈现文本字符,ASCII标准就是用一个字节大小的整型值代表一个文本字符。例如Figure 1.2显示了hello.c的程序的ASCII表示。hello.c程翻译 2015-03-21 12:53:43 · 1021 阅读 · 0 评论 -
深入理解计算机系统 第一章 计算机系统漫游
计算机系统由硬件和软件构成,他们一起工作来运行应用程序。系统的具体实现将会随着时间而改变,但是底层概念不会变。所有的计算机系统有相似的硬件和软件组件,这些组件做相似的事情。这本书为这些程序员而写,他们想通过理解这些组件如何工作及如何影响他们程序的正确性和执行效率来提高他们的技术。对这次激动人心的旅行,你要保持淡定。如果你致力于学会这本书中的概念,你将会成为一个少见的优秀程序员,因为你被你对底层翻译 2015-03-21 11:46:40 · 731 阅读 · 0 评论 -
深入理解计算机系统 1.7 操作系统管理硬件
回到我们的hello程序。当shell加载并运行hello程序时,当hello程序打印出它的消息时,程序并没有直接访问键盘、显示器、硬盘和内存,而是依赖于操作系统提供的服务。我们可以把操作系统想成放置在应用程序和硬件之间的一个软件层,就像Figure1.10展示的那样。所有应用程序对硬件的操作都必须经过操作系统才能完成。翻译 2015-12-09 22:54:33 · 1374 阅读 · 0 评论