底层原理:深入理解计算机系统#2 一切从"hello world"说起

Posted tanee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了底层原理:深入理解计算机系统#2 一切从"hello world"说起 相关的知识,希望对你有一定的参考价值。

此时此刻,hw.c源程序已经被翻译成了可执行目标文件hw,并存放在磁盘的某个角落。想要在Unix系统中运行该文件,我们得将它的名字输入到一个称为shell的家伙。shell就相当于之前那个例子中部落的祭祀,它将与神沟通。回到计算机,shell的定义是:一个命令解释器。所谓解释器,便是把某个A解释成某个目标B,shell便是把我们想让系统做事的指令解释给系统听。

shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。所以现在,shell将会加载hw程序,然后等待程序终止。接着hw程序在屏幕上输出它的消息,然后终止。shell随后输出一个提示符,等待下一次输入的命令行(这个模式就是你linux系统中的终端,或者windows中的cmd.exe)

好吧,我们的第一个程序已经完成了它的工作。但,wait,等待。shell加载了这个程序之后系统内部发生了什么??

我们暂时先把hw放着。我们需要先学习一些硬件知识才能往下走了。

 

系统的硬件组成:为了理解运行hello程序时到底发生了什么,我们来看看下面这个系统结构:

技术图片

 

1.总线:贯穿整个系统的一组电子通道,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数,也就是字长,是一个基本的系统参数。各个系统大不相同。现在大多数机器字长要么是4个字节要么是8个字节。(1字节=8位/bit)

 

2.I/O设备:顾名思义,input 和output输入输出,I/O系统是计算机和外界联系的通道。hw程序中就包含了4个IO设备:键盘和鼠标,显示器和硬盘(磁盘)。

每个IO设备都通过一个控制器或者适配器与I/O总线相连。控制器和适配器之间的区别主要是它们的封装方式。控制器就是I/O设备本身或者系统的主电路板(主板)。而适配器是一块插在主板插槽上的卡。它们的功能都是往I/O总线中传递信息。

3.主存:主存是一个临时的储存设备,在处理器执行程序时,用来放程序和程序处理时产生的数据。举一个例子,一个手机修理店,主存就是它的店面,里面放着的手机要么就是刚送来还没拆的。要么就是正在维修的,拆成了好几块的铁块。而磁盘就相当于是它的仓库,它差什么原始部件我就去仓库找。当老板修好手机,一天没活了,关店了。第二天开店又是新的一天。只是老板不会留下任何手机。不管修没修好。第二天都是重新修新的手机。

4.处理器:处理器也叫做CPU 中央处理单元。是执行储存在主存中指令的引擎。处理器的核心是一个大小为一个字的储存设备(寄存器),称为程序计数器。在任何时刻它都指向主存中的某条机器语言指令。在指令下,CPU会执行这些操作:

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

  储存:从寄存器复制一个字节或者一个字到主存的某个位置,覆盖主存原来的内容。

  操作:把两个寄存器的内容复制到ALU(ALU是一个可以进行逻辑运算的单元),ALU对这两个字做算术运算,并将结果放到一个寄存器,覆盖这个寄存器原来的内容。

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

 

 

来的值。

更加详细的内容我们后面再谈。

 

好了讲了这么多,我们继续回到hw上来,初始时,shell程序在我们输入./hw了以后,shell程序会将字符逐一读入寄存器,再把它放到内存中,如图中紫线:

 

技术图片

 

 

注意,此时我们没有加载我们的代码程序! 我们只是把这个命令传到了主存。相当于我们只是告诉老板我要一杯拿铁咖啡,但是实质上只是老板在这个过程只是知道了我的要求(指令),但是还没从兑粉冲出来的一桶咖啡中倒出我们的咖啡(hw源文件)。

下一个阶段:

当在shell程序上敲了回车以后,shell就知道我们结束了命令的输入。shell执行了一些指令,使我们的hw目标文件代码和数据从磁盘复制到主存。这个时候,你也许会问为啥这个时候不走寄存器了,因为这个时候我们使用了DMA(直接存储器读取)技术,数据可以不通过处理器直接从磁盘到主存。步骤如下绿线:

技术图片

 

一旦目标文件的hw代码和数据加载到了主存,cpu就立即开始执行main中的指令,最终这些指令把字符串“hello world!”的字节形式从主存复制到寄存器文件,再从寄存器中复制到显示设备显示在肉眼可见的屏幕上。如图橙线:

技术图片

 

好了,这个实例我们大致地,知道了他运作的过程,现在我们来稍微总结一下:

你注意到没,我们在这个过程中有个大问题,系统花了很多时间把信息从一个地方挪到另一个地方。hw一开始在磁盘上,然后程序加载时,他们被复制到主存,当处理器运行程序时,指令又从主存复制到寄存器(处理器中)。从资源角度来说,这些复制就是开销,是减慢程序工作效率的原因,所以系统设计者的一个主要目标就是减少这些开销,让电脑变得更快。

以上是关于底层原理:深入理解计算机系统#2 一切从"hello world"说起 的主要内容,如果未能解决你的问题,请参考以下文章

如何学习python知乎

深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构

从Go语言的角度深入理解TensorFlow的底层实现

基于JVM原理JMM模型和CPU缓存模型深入理解Java并发编程

全面深入理解MySQL底层原理与性能调优

深入理解spring-AOP注解的底层实现原理