《深入理解计算机》阅读笔记 第一章

第一章  计算机系统漫游

声明:这篇文章(如果可能会是一系列)是本菜阅读《深入理解计算机系统原理》的一个读书笔记 目的是为了加强自己的理解和记忆  文章内容和我个人理解的内容以及额外添加的相关内容会用不同颜色的字体标注  文章中的观点和理解不保证正确 如有错误劳烦指正。

计算机系统是由硬件和软件组成,他们共同工作来运行应用程序。(本人原来理解的系统就是仅仅指的操作系统软件- -!)虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变,所有的计算机系统都有相似的硬件和软件组成他们执行着相似的功能。

我们通过跟踪最简单的HelloWorld的c程序开始对系统的学习。(阴魂不散的HelloWorld 囧~闭嘴


     #include <stdio.h>

     int main()
    {
       printf("hello, world\n");
    }


1.1  信息就是位 + 上下文

 
hello 程序的生命周期是从一个源程序开始的 即程序猿利用编辑器创建并保存了文本文件,hello.c 源程序实际上是 由一个值 0 和 1 组成的位 bit 序列  八个位被组织成一组称为字节,每个字节表示程序中得某个文本字符。

1 字节 = 8 bit (位) = 1个文本字符

大部分的现在系统都是用ASCII标准类表示文本字符  这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。hello.c程序一字节序列的方式存储在文件中,每个字节都有一个整数值 而该整数值对应于某个字符 表示方式如下:





以上的表示方法说明了一个基本的思想:系统中的所有信息 包括磁盘上的文件 存储器中的程序 存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的,区分不同的数据对象的唯一方法是我们读到这些数据对象时的上下文。

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

hello程序受到生命周期是从一个高级C语言程序开始的,因为这种形式能够被人读懂,然而为了都在系统上运行hello.c 每条C语句都必须被其他程序转化为一些列的低级机器语言指令。 然后这些指令按照一种称为 可执行目标程序 的格式打包好,并以二进制磁盘文件的形式存放起来,目标程序也成为可执行目标文件。
在unix系统上 从源文件到目标文件的转化是由编译器驱动程序完成的(应该就是指的编译器)大概分成以下四个过程 如下图:





基本过程就是将高级语言通过 编译器转换为 机器语言 汇编语言为中间的过渡语言  相当于所有的高级语言在转化为机器语言的一个统一的入口

1.3 了解编译系统如何工作好处大大滴

1.可以优化程序性能  编译器都是非常成熟的工具 通常都可以生成有效的机器代码,但是为了在c程序中做出好的编码选择我们确实需要了解一些机器代码以及编译器将不同的c语句转化为机器代码的方式。

这里可以理解为编译器足够编译和优化你的c代码 但是完成同样的功能选择的c代码可以不同  通过了解如何将c代码转换为机器语言可以做出更好的高级语言的代码选择

2.理解链接时出现的错误   这一段无实质性内容- -!都是各种在后续的章节中吧啦吧啦吧啦....

3.避免安全漏洞  介绍了一些缓冲区溢出导致的问题 没有详细内容  会再后续章节介绍 

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

此时 hello.c源程序已经被编译系统 翻译成了可执行目标程序 hello.o 并且存放在磁盘上,在了解程序运行的过程之前首先系统的了解下硬件的组成 (这里多关注下是可以的 毕竟电脑修得好 可以稳固备胎地位 再见

  1.4.1 系统的硬件组成

以Intel Pentium系列系统产品为模型,所有的其他系统也有这相近的外观和特性  如下图



  1.总线  
总线是贯穿整个系统的一组电子管道。主要功能为负责携带信息字节在各个部件间传递。通常总线被设计成传送定长的字节块  也就是 字 (word)  字中得字节数是一个基本的系统参数,在各个系统中的情况都不尽相同大多数机器的字长为4个字节(32位)和 8个字节 (64位)  后续的章节为了方便讨论都假设为字长为4个字节,并且总线每次值传递一个字。

这里我们可以总结下 位(bit) 字节  字的关系
32位 : 1 字  =  4 字节  =  32位 (bit)
64位:  1 字  =  8 字节  =  64位 (bit)

由于本人对DIY电脑很感兴趣 所以在这里 我再添加下一些和硬件相关的知识,来自百度百科,当我们DIY电脑选购主板时就会接触到总线带宽等一些参数:
如果说主板(Mother Board)是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,传输来回不停运作的位(bit)。这些线路在同一时间内都仅能负责传输一个比特。因此,必须同时采用多条线路才能传送更多数据,而总线可同时传输的数据数就称为宽度(width),以比特为单位,总线宽度愈大,传输性能就愈佳。总线的带宽(即单位时间内可以传输的总数据数)为:总线带宽 = 频率 x 宽度(Bytes/sec)

2. I/O 设备

I/O 设备是系统与外部世界的联系通道,每个I/O设备都通过一个控制器或适配器与I/O总线项链。控制器和适配器之前的区别主要在于他们的封装方式不同。控制器是置于I/O设备本身的活着系统的主板上的芯片组,而适配器则是一块插在主板插槽上的卡,无论如何他们的功能都是在I/O总线和I/O设备之前传递信息。

这里我认为可以理解为焊接在主板上的一些控制模块就是控制器 而独立显卡 独立声卡等 都可以认为是适配器

3. 主存 
主存是一个临时存储设备,用于存储处理器执行程序是的程序和程序处理的数据。从物理上来说 主存是一组动态随机存取存储器DRAM芯片组成的。 从逻辑上来说 存储器是一个线性的字节数组,每个字节都有唯一的字节地址(即数组索引)这些地址都是从0开始的。一般来说,组成程序的每条机器指令都有不同数量的字节构成。

主存就是内存条 (PS:装机最少8G起啊  内存是几乎所有的 硬件里面最有保值性的)

4. 处理器
中央处理单元(CPU) 简称处理器, 是解释或者执行存储在内存中指令的引擎。处理器的核心是一个字长在32位和64位的机器上长度不同 实际上我理解的是之所以称之为32位或者64位就是以字长占用的bit数来确定的  )的存储设备。称之为程序计数器(PC  - - 这里应该是program counter 而不是平常理解的personal computer),在任何时刻PC都指向主存重的某条机器语言指令,即含有该条指令的地址。

这里如果按照c语言的理解方式可以认为 PC里面存放的是即将执行的机器语言指令内存区域的指针。

寄存器文件: 是一个小的存储设备,由一些1字长的 寄存器 设备,每个寄存器都有唯一的名字
ALU:算数逻辑单元全称是Arithmetic Logic Unit,是处理器中的一个功能模块,用来执行诸如加减乘除以及寄存器中的值之间的逻辑运算
下面列举一下CPU的简单操作例子 :
加载:把一个字节或者一个字从主存复制到寄存器,以覆盖寄存器原来的内容。
存储:把一个字节或者一个字从寄存器复制到贮存的 某个位置已覆盖这个位置上原来的内容。
操作:吧两个寄存器的内容复制到ALU,ALU对着两个字做算数操作,并将结果存放到一个寄存器中,以覆盖该寄存器的原来的内容
跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器PC,以覆盖PC中原来的值

处理器看上去只是它的指令集结构的简单实现,但是实际上现代处理器使用了非常复杂的机制来加速程序的执行,因此我们可以这样区分处理器的指令集结构和微体系结构:指令集结构描述的时每条机器代码的指令效果;而微体系结构描述的是处理器实际上是如何实现的。

这里最好去百度百科或者其他IT网站看一下每个模块基本的介绍,其复杂性远远超过以上的简单描述。Intel官方曾经出过一个简短的视频来描述如何从沙子中提炼高纯度硅开始 到最终制造出CPU的

1.5 高速缓存至关重要

hello.c的程序运行过程大致如下:当我们在键盘输入字符串后。shell程序将字符逐一读入寄存器,再把他存放到存储器中 当我们在键盘上敲回车键时 shell程序就知道我们已经结束了命令的输入。然后执行一些列指令来加载可执行的hello文件 将目标文件中的代码和数据从磁盘复制到主存,处理器开始执行hello程序的main程序重的机器语言指令 这些指令的将字符串的字节从主存复制到寄存器再从寄存器复制到显示设备最终显示的屏幕上。

大体过程: 字符串→寄存器→存储器(磁盘)→主存→寄存器→显示设备

以上的过程揭示了一个重要的问题,即系统花费了大量的时间把信息从一个地方挪到另外一个地方(PS:挪 - - 翻译果然完全考虑了本土化  哈哈)因此提升效率的方式就是缩短这个过程的时间,由于不同的存储设备的造价容量和读写速度不同:存储设备的容量越小处理器从其读取数据的速度越快 造价越高 (这就是为什么4G的内存一般都在250块以上 而1T的HDD基本也在这个价格左右  单位容量的价格基本是256倍  比HDD速度快的SSD一线品牌128G也在500块以上)因此针对这种处理与主存之间的差异,系统设计者采用了更小更快的存储设备,也就是高速缓存存储器,作为暂时的集结区域,用来存放处理器近期可能会需要的信息,处理器芯片上的L1高速缓存的容量可达数万字节,访问速度几乎和寄存器一样快,还有L2,L3等,L1和L2使用一种叫做静态随机访问存储器SRAM来实现的. 

下面是我自己正在用的i5 3470的部分参数

这里可以看到一级缓存L1 和2级缓存L2 的写法说明i5的四个核心的L1缓存是独立的 至于32+32的意思还没查到 待补充~ 而三级缓存则是四核心共享的。一般来说如果是普通人或者普通游戏玩家 物理四核心的i5不带K的系列已经能满足日常需求了,发烧友还是选择带K或者i7系列吧

1.6 存储设备的层次结构

直接上图 清晰明了

存储器层次结构的主要思想是自金字塔顶向下,每下面一层都作为上一层的存储器的告诉缓存。



1.7操作系统管理硬件

简而言之 我们可以把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统

操作系统有两个基本功能:
1.防止硬件被失控的应用程序滥用 (- -! 这是什么意思 )
2.向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备

操作系统通过几个基本的抽象概念来实现这两个功能 如下图

















评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值