程序是如何跑起来的

1.CPU内部结构解析
CPU所负责的就是解析和运行最终转换成机器语言的程序内容。
CPU的内部由寄存器,控制器,运算器和时钟四个部分组成

    寄存器可以用来暂存指令,数据等处理对象,可以将其看作是内存的一种。
    控制器负责把内存中的指令读入寄存器,并根据指令执行结果来控制计算机。
    运算器负责运算内存读到寄存器中的数据。
    时钟负责发出CPU开始计时的时钟信号

寄存器中存储的内容既可以是指令也可以是数据,其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。“用于运算的数值”存放在累加寄存器中,“表示内存地址的数值”则存放在基址寄存器和变址寄存器中。
下面是寄存器的主要功能和种类

种类功能
累加寄存器存储执行运算的数据和运算后的数据
标志寄存器存储运算处理后的CPU的状态
程序计数器存储下一条指令在内存中的地址,决定程序运行的流程
基址寄存器存储数据内存的起始地址
变址寄存器存储基址寄存器的相对位置
通用寄存器存储任意数据
指令寄存器存储指令。CPU内部使用,程序员无法通过程序对该寄存器进行操作
栈寄存器存储栈区域的起始地址

其中,程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器各有一个,其他寄存器一般都有多个。

首先来看一下程序计数器
为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。 在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。有些机器中也称PC为指令指针IP(Instruction Pointer)。

机器指令的主要类型和功能

类型功能
跳转指令实现条件分支,循环,强制跳转的等
call和return指令函数的调用/返回调用前的地址
数据传送指令寄存器和内存,内存和内存,寄存器和外围设备之间的数据读写操作
运算指令用累加器执行算数运算,逻辑运算,比较运算和移位运算

2.内存
这里写图片描述
上面是我画的一个示意图,表示一个存储量为1KB的内存块,内存中每一个字节都有一个地址编号,当我们想要在内存中写入数据时,我们可以控制读写位使其为写使能,然后将数据写到数据端口,当然这个过程还需要时钟的参与,再次我就不叙述详细过程了。
虽然内存是由一个个不连续的IC芯片构成的,但是对于程序员来说这些地址都是连续的,一个字节紧挨着一个字节。但是我们的代码中要是总是操作单个字节那么效率就会很低,因此在变成我们使用变量是总是会定义不同的数据类型,从内存角度来看,不同的数据类型对应着不同的不同的内存大小,简单的说,当我们定义一个int a时,我们定义了一个32位的int类型的变量,占了四个字节,其中a就是指向一块数据区域的地址,int就是为这块区域定义一个四个字节大小空间用来存储数据。
这里写图片描述
我们在学习指针的时候有一个++的运算符,这个意思就是当我们定义了一个字符类型的指针,++一次地址就偏移一位,定义一个int类型指针,++一次就偏移了四个字节,这样对数据和地址的操作就非常的方便,并且在读写数据的时候就可以直接读取指定的内存大小而不需要我们自己计算偏移的位置了。
从存储的角度来看内存和硬盘好像没有什么区别。但是我们的程序必须要在内存中才可以运行在磁盘中保存的原始程序是无法直接运行的。这是因为负责解析和运行的程序内容的CPU,需要通过内部的程序计数器来指定地址,然后才能读取指令,即使真的可以从磁盘运行,但是你想想,磁盘是转的,多么慢啊,当然还是加载到内存中才快,这其中还有一级缓存,二级缓存等。
这里写图片描述
那么磁盘这么慢该怎么才能加快速度呢。那就是设置缓存。磁盘缓存的意思是说把磁盘中的数据读取到RAM中,这样下次如果读同一数据的话就不需要再读取磁盘了,而是从磁盘缓存中读取。web浏览器中其实也应用了缓存技术。由于web浏览器是通过网络来获得远程web服务器的数据的因此在显示大图片等文件时会花费不少时间。于是web浏览器就把获得的数据暂时保存在磁盘中,然后需要时再显示磁盘中的数据。也就是说把低速的网络数据保存到相对高速的磁盘中。
介绍了磁盘缓存再来介绍一下虚拟内存。有没有发现同样是2G的内存为什么PC机运行的程序又多又快,但是平板运行的却那么慢呢。这就要提到虚拟内存了。虚拟内存是把磁盘的一部分作为假象的内存来使用。这是与磁盘缓存的想法是相对的。我们知道程序必须加载到内存在才可以运行,虽说磁盘作为假象的内存,但是实际上磁盘是不可以运行程序的,程序运行的时必须要使用内存。为了实现虚拟内存,我们就需要把实际内存的内容和虚拟内存的内容进行部分置换。在不考虑程序的构造情况下,把运行的程序按照一定大小的页(page)来进行分割,并以页作为单位来进行内存和磁盘的交换。把磁盘中的内容读出到内存中我们称之为page in把内存中的内容写入磁盘我们成为page out 。但是虽然虚拟内存加大了内存空间但是伴随着page in和page out的进行程序运行的速度会变慢。不过这是没办法的毕竟内存实际的大小没有改变想省钱总要有代价的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值