程序在计算机中是如何运行的?搞懂内存和CPU

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序在计算机中是如何运行的?搞懂内存和CPU相关的知识,希望对你有一定的参考价值。

1.程序在计算机中是如何运行的?

  • 运算器
  • 控制器
  • 存储器
  • 输入设备
  • 输出设备

在计算机中,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存,外部存储器主要就是磁盘,磁盘又分为硬盘和软盘,而我们电脑中的大部分是硬盘,这里也分为固态硬盘和传统机械硬盘。

2.CPU和内存

3.内存是什么?
内存条,我们电脑中的内存条,它是属于内部存储器,主要就是用来存放数据的,也可以理解为我们这里说的内存,这是实际存在的,我们可以看得见的内存条,但是关于数据存储,怎么存储,我们抽象点儿来说,这个内存其实就是一个个的小格子,就像这样:

这些小格子就是用来存放数据和指令的,而且每个格子都有自己的编号,这个编号大家也熟悉,就是我们经常说的内存地址。

另外你需要知道的是,计算机是只认识0和1的,所以存放在内存中的数据其实都是二进制文件了。

4.CPU是什么?
其实关于内存,先了解上面那些就足够了,内容比较多的就是CPU了,大家都听说过CPU就相当于人的大脑一样,对电脑来说,至关重要。
对于CPU,你必须了解的两个东西,一是寄存器,另外一个是运算器。

5.CPU的特点
对于CPU来说,必须要把数据读取到寄存器中才能做相应的运算,另外CPU的数据读写的速度是真的快,内存和硬盘根本没法比。

CPU执行一条指令大约需要耗时1ns,但是对于内存呢?它去硬盘读取数据至少8ms,在这段时间内,CPU可以执行大约800万条指令。

就像《码农翻身》一书中说的那样:CPU的运算速度快的丧心病狂,但是它能做的事情简单的令人发指.

别看CPU那么牛,那么复杂,那么快,它做的事情真的挺无聊的,总结起来,CPU主要就干如下四件事情:

  • 从内存中读取数据,然后放到寄存器中
  • 把寄存器中的数据写入到内存
  • 进行数学运算和逻辑运算(加减乘除,AND,OR)
  • 依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)

6.CPU的重点组成部分

  • 寄存器
  • 运算器

首先你得知道他们是CPU中的东西,这个寄存器,说白了就是存放数据的,是个存储部件,还记得之前说内存就是一个个的小格子吗?这个寄存器你就可以简单的想成也是小格子,放数据的。

寄存器
寄存器是存储部件,容量非常有限,能存储的数据的大小,现在来说一般有两种,也就是我们常听说的32位和64位,32位的寄存器就能存储4个字节的数据,64位的寄存器就能存储8个字节的数据,另外CPU也分为32位和64位其实就是由其中的寄存器的位数决定的,可想而知,即使是64位的寄存器也干不了啥大事,所以,现在的CPU一般都内置了很多的寄存器,依此来完成比较复杂的操作。

运算器
另外一个就是运算器了,这个是计算的核心,主要的作用就是用来做加减乘除这些运算的,不过,这里你需要知道的一点就是,运算器是没法直接操作内存中的数据的,很容易想到,运算器操作的数据是寄存器中存放的数据。

CPU和内存的交互
简单的了解了内存和CPU之后,我们就可以来看看程序代码是如何进一步被执行的,上面提到了,程序代码被读取到内存中了,现在要执行这段代码,那就需要CPU出马了,首先,CPU会去读取需要进行操作的数据,对了,继续看这代码:

public class HelloWorld 
    public static void main(String[] args) 
        int a = 5;
        int b = 3;
        sum = a + b;
        System.out.println(sum); 
    

也就是需要读取数据a和b,那么读取到的数据a和b存放在哪了呢?根据我们上面对CPU简单的了解可知,数据a和b是被放到了CPU中的寄存器中了,看这个图:

在CPU中有两个比较重要的组件就是运算器和寄存器,寄存器有很多个,再看内存,是一个个的小格子,每个格子有编号,比如说现在数据a和b分别存放在#1和#2上,然后CPU将他们读取放在寄存器R1和R2上

这个时候就要计算a和b的和了,然后就轮到运算器出马了,它会拿到寄存器R1和R2,也就是拿到数据a和b,然后做加法运算

那么计算之后的结果也就是sum,运算器会再次把它放到寄存器,比如R1中,这个时候之前的数据b就会被覆盖,如此一来,CPU和内存就一起完成一次加法运算操作。
这里其实我们把关注点聚焦到了加法运算操作,实际上,程序代码被装载进内存的时候会产生数据和指令两部分,数据我们都知道是啥,指令呢?

其实也好理解,指令就是说明程序该怎么执行,对于CPU来说就是告诉CPU该做什么,比如告诉CPU,读取数据a和b,然后再将他们相加,说白了,CPU是根据指令干活的,指令让怎么干,咱就怎么干。因此,你必须告诉CPU该干啥,否则,CPU也不清楚。

上面的简单介绍后,我们看看CPU主要做的四件事情:

  • 从内存中读取数据,然后放到寄存器中
  • 把寄存器中的数据写入到内存
  • 进行数学运算和逻辑运算(加减乘除,AND,OR)
  • 依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)

总的来说,就是我们写的程序是放在硬盘中的,在运行的时候才会被加载到内存中,也就是说内存中的数据都是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,然后CPU会根据相应的指令去操作寄存器中的数据,比如四则运算什么的,来完成一个程序在计算机中的运行。

总结:本身程序是在硬盘上,启动程序之后,操作系统会开辟一个进程(一定的内存空间),然后将程序加载进内存,加载进内存的程序都是二进制文件。cpu通过寄存器拿到内存中的数据进行处理,处理完之后再将数据通过寄存器交给内存。

以上是关于程序在计算机中是如何运行的?搞懂内存和CPU的主要内容,如果未能解决你的问题,请参考以下文章

时间片

Linux系列:多进程多线程与CPU的关系

进程的概念

完成一个简单的时间片轮转多道程序内核代码

多线程和多进程效率的对比

python下的线程 进程,以及如何实现并发服务器