计算机系统之一计算机系统漫游

ぐ巨炮叔叔 提交于 2020-01-24 14:47:40

 

作为一个程序员,如果深入了解这些组件是如何工作的,以及这些组件是如何影响程序的正确性和性能的,以此来提高自己的技能,可以推荐<深入理解计算机系统>这本书,本系列也是作者在参读了这本书后的一些个人理解和对概念的认识,也可以当做我的个人笔记,希望对你有所帮助

 

代码无国界

 

计算机系统是由硬件和软件组成的,他们共同工作来运行应用程序.虽然系统的具体实现方式随着时间的变化而变化,但是系统内在的概念却没有改变.所有的计算机系统否有类似的硬件和软件组件,而且都执行这相似的功能.

1 #include <stdio.h>
2 int main () {
3   printf("hello world");  
4 }

这是一段c语言的源程序(源文件),在这里命名为hello.c

 

源程序实际上就是由值0和1组成的位(bit)序列,8个位被组织成一组,成为字节.   而每个字节表示程序中某个文本字符

大部分的现代系统都使用ASCII标准来表示文本字符,这中方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符,

作为一个Java程序员每天接触最多的就是UTF-8 ,一开始也会迷糊,为了更好的理解他们之间的关系,推荐几篇博客:

ASCII、Unicode、GBK和UTF-8字符编码的区别联系  

ASCII,Unicode和UTF-8

 hello.c程序以字节的方式存储在文件中.每个字节都有一个整数值,而这个整数值则对应某个字符,

\如,第一个字节整数是35,ASCII标准中他对应的字符是"#",以此类推

像hello.c这样只有ASCII字符构成的文件成为文本文件,而其他文件称为二进制文件

hello.c表达了一个基本思想-->系统中的所有信息(磁盘文件,存储器中的程序和用户的数据,网络下载上传的数据)都是由一串位表示

区分不同的数据对象的唯一方法就是我们读到这些数据对象时的上下文.  在不同上下文中,一个同样的字节序列可能是一个整数,浮点数,机器指令等等..  

关于这个上下文具体是什么样子的,下面系类会继续跟进,先保留点悬念,嘿嘿....

 

接下类将hello.c源程序用编译系统翻译成可执行的目标文件hello,存入磁盘,可以使用shell(外壳)将文件名输入进去执行.

其实这个使用shell执行文件可能大家并不陌生,跟windows系统下的dos差不多,

了解nodejs的朋友可能知道,在windows下打开cmd,输入node回车,然后写入console.log("Holleworld")回车就会执行并打印出"hello world"一样的

那么什么是shell呢,shell是一个命令行解释器,他输出一个提示符,等待输入一个命令行,然后执行这个命令行

比如,在windows下输入tasklist /svc 打印出正在执行的程序列表

 

 

讲了这么多,下面来点硬件知识的干货

系统硬件的组成

 

 1.总线

贯穿整个系统的是一组电子管道,称作总线,他携带信息字节并负责在各个部件间传递

通常总线被设计成传送定长字节块,也就是字(word).

字中的字节数(即字长)是一个基本的系统参数,在各个系统中的情况都不尽相同.现在大多数机器字长有4个字节(32位),有8个字节(64位)

2.I/O设备

输入/输出(I/O)设备是系统与外部世界的联系通道.我的图例系统中的I/O设备:

用户输入设备-->鼠标键盘;

用户输出设备-->显示器;

长期存储数据和程序的磁盘驱动设备;

每个I/O设备都有一个控制器或者适配器I/O总线相连,而控制器和适配器之间的主要区别在于他们的封装方式不同

控制器是置于I/O设备本身的或者系统的主印制电路板(通常成为主板上的芯片组)

适配器则是一块插在主板插槽上的卡

无论如何他们的功能都是在I/O总线和I/O设备之间传递信息

3.主存

主存是一个临时存储设备,又叫主存储器,他由存储体,控制线路,地址寄存器,数据寄存器,地址译码电路5个部分组成;作用是用来存放程序和程序处理的数据;通俗的来讲,你也可以把他理解为内存,有了他,计算机才有了记忆

物理上来讲,主存是由一组 动态随机存取存储器(DRAM)芯片组成;从逻辑上来讲,存储器是一个线性的字节数组,每个字节都有其唯一的地址(即数组索引),这些地址是由零开始的,一般来说,组成程序的每条机器指令都由不同数量的字节构成

 

4.处理器

中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎.

处理器的核心是一个字长的存储设备(或寄存器),成为程序计数器(PC),在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)

从系统通电到断电,处理器一直在不断的执行程序计数器的指令,再更新程序计数器,使其指向下一个指令;处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集结构决定的;在这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列的步骤.处理器从PC指向的存储器处读取指令,解释指令中的位,执行指令指示的简单操作,然后更新PC,使其指向下一个指令,而这个指令并不一定与存储器中刚刚执行的指令相邻

这样的简单操作并不多,而且操作都是围绕主存,寄存器文件和算数/逻辑单元(一下简称ALU)执行的

寄存器文件是一个小的存储设备,由一些1字长的寄存器组成,每个寄存器都有唯一的名字

ALU计算新的数据和地址值,下面举个简单的例子,CPU在指令的要求下可能执行一下操作:

加载:把一个字节或者一个字从主存复制到寄存器,以覆盖寄存器原来的内容

存储:把一个字节或者一个字从寄存器复制到主存的某个位置,以覆盖这个位置上原有的内容

操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算数操作,并将结果存放到一个寄存器中,以以覆盖寄存器原有的内容

跳转:从指令本身抽取一个字,并将这个字复制到程序计数器中(PC),以覆盖PC中原有的值

 

处理器看上去只是他的指令集结构的简单实现,但是实际上现在的处理器使用了非常复杂的机制来加速程序的执行,因此可以这样区分指令集和微体系结构

指令集结构是描述每条机器代码的指令的效果

为体系结构描述的是处理器实际上如何实现的

 

现在跳回开始,在shell中执行hello文件

置于cpu内部运行细节,自己体会吧

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!