01、目录

目录

  • 01、目录
  • 02、hello,world!
  • 03、CPU与内存
    • 3.1 硬盘,内存,CPU
    • 3.2 内存
    • 3.3 CPU的重点组成部分
    • 3.4 CPU和内存的交互
  • 04、总结

02、hello,world!

开门见山,不多说废话,hello,world!
再座各位,只要学习过一门语言,第一件事情应该就是它了吧!哈哈哈

比如我们写一段C程序代码。

#include <stdio.h>
#include <stdlib.h>int main()
{printf("hello,world!");system("pause");return 0;
}

熟悉吧,可能大家都知道,运行输出“Hello World!”,不过嘞,今天我带你从内存和CPU的角度去剖析一下这段代码在计算机中是如何执行的。

Hello World保存在哪?
首先问你个很简单的问题,当你写下这段代码的时候,你把它保存在哪了,假如说你说是桌面,就像现在这样

是的,一个Hello,World.c文件就保存在了桌面上,这个叫做c源文件,不过说是保存在桌面上这个有点模糊,这个桌面又是个啥呢,我们应该想象它保存在了我们电脑的哪个部分呢?一台计算机包含如下基本五个部分:

  1. 运算器
  2. 控制器
  3. 存储器
  4. 输入设备
  5. 输出设备

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

不管怎么说吧,磁盘也好内存也罢,就是用来存放数据的,那么我们就知道了我们写的这个c源文件应该就是存放在电脑中的磁盘了。

那么代码保存到硬盘中之后呢?

03、CPU与内存

代码被保存到硬盘之后,接下来就要CPU和内存登场了,提起精神了,超级干货来了。

告诉你个秘密,理解CPU和内存是如何在一块工作的,是每个学编程必备的基础中的基础,反正就是很重要!

甲:你们信不信?
乙:我不知道
甲:反正我是信了,这是个大佬!

我们在上面提到了硬盘,这里又说到了CPU和内存,那么我们就来看看这三个家伙

3.1 硬盘,内存,CPU

先看一张图:

这张图大致描述了三者的一个关系,什么关系嘞,数据读取的关系,我们之前不是说我们写的代码保存到了硬盘中了吗,如果要执行这段代码的话,需要把这段代码从硬盘中读取到内存中,此时的代码已经变成了二进制文件存储在内存中,为了更好的去理解,我们把上面的代码再进一步改写下:

#include <stdio.h>
#include <stdlib.h>int main()
{int a = 10;int b = 20;int c = a + b;printf("c=%d\n",c);/*二进制加法:10:  010120:  00101*/ system("pause");return 0;
}

ok,这段代码,意思也是非常的清晰,也就是加入了一个基础的加法运算,此时这段代码已经变成二进制文件放到了内存中,现在要继续执行,也就是要执行代码的加法操作,此时的数据a和b,也就是10和20已经是二进制的形式在内存中,现在需要把a和b做加法运算,CPU收到这个指令(将a和b相加),就会去内存中将a和b读取,然后存放到自己的寄存器中,然后由CPU中的运算器去做加法运算,得到的结果依然放到寄存器中。

是不是有点懵?啥是寄存器?运算器呢?别急,我们继续往下看。

3.2 内存

这个内存是啥呢?内存条知道吧,我们电脑中的内存条,它是属于内部存储器,主要就是用来存放数据的,也可以理解为我们这里说的内存,这是实际存在的,我们可以看得见的内存条,但是关于数据存储,怎么存储,是不是还有点模糊,那么我们抽象点来说,这个内存其实就是一个个的小格子,就像这样:

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

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

  • CPU是重点

其实关于内存,先了解上面那些就足够了,内容比较多的就是CPU了,想必大家都听说过CPU就相当于人的大脑一样,对电脑来说,至关重要,所以啊,CPU的结构是真的复杂,怎么办?

一般碰到这样的,我们就需要有选择的进行掌握和学习,因此对于CPU,你必须了解的两个东西,一是寄存器,另外一个就是运算器,为啥,这又是啥?

想要搞明白这个问题,咱们需要先来看看如下这些知识点。

  • CPU的特点

首先,这家伙是真的复杂,除此之外嘞,你还需要知道对于CPU来说,必须要把数据读取到寄存器中才能做相应的运算,另外CPU的数据读写的速度是真的快,内存和硬盘根本没法比,可能你没啥概念,举个例子吧

CPU这家伙执行一条指令大约需要耗时1ns,但是对于内存呢?它去硬盘读取数据至少8ms,在这段时间内,CPU可以执行大约800万条指令,说这个,主要是为了让你直观的感受到CPU是真的快。

就像《码农翻身》一书中说的那样:

CPU的运算速度快的丧心病狂,但是它能做的事情简单的令人发指

啥?为啥做的事情简单的令人发指呢?

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

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

不知道你发现没,我们似乎一直在提寄存器,这又是什么玩意?这就要看看CPU的构造了

3.3 CPU的重点组成部分

我们上面也说了,CPU的结构真的很复杂,但是我们需要重点关注如下几个重要组成部分:

  • 寄存器
  • 运算器

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

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

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

3.4 CPU和内存的交互

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

#include <stdio.h>
#include <stdlib.h>int main()
{int a = 10;int b = 20;int c = a + b;printf("c=%d\n",c);/*二进制加法:10:  010120:  00101*/ system("pause");return 0;
}

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

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

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

那么计算之后的结果也就是c,运算器会再次把它放到寄存器,比如R1中,这个时候之前的数据b就会被覆盖,如此一来,CPU和内存就一起完成一次加法运算操作。

这里其实我们把关注点聚焦到了加法运算操作,实际上,程序代码被装载近内存的时候会产生数据和指令两部分,数据我们都知道是啥,指令嘞?

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

因此,你必须告诉CPU该干啥,否则,CPU也很懵的呦。

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

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

怎么样,是不是更加清晰明了!

04、总结

这么一看,也没啥难的吗?总的来说啊,就是我们写的程序是放在硬盘中的,在运行的时候才会被调入到内存中,也就是说内存中的数据是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,然后CPU会根据相应的指令去操作寄存器中的数据,比如加减乘除什么的,以此来完成一个程序在计算机中的运行。

一句话总结:

本身程序是在硬盘上,需要把程序加载进内存,然后由CPU去执行

另外对于内存啊,CPU什么呢还有很多有趣有用的知识,我们前面已经讲过一节!

何谓CPU?

非技术文章,欢迎转载。谢谢!

【计算机结构】一个程序在计算机中是如何运行的?相关推荐

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

    一个程序在计算机中是如何运行的 首先看一段代码: public class demo {public static void main(String[] args) {System.out.print ...

  2. 96KB存储器的怎么算地址范围_每天都在敲代码,但是一个程序在计算机中是怎么运行的?...

    强烈声明:本文很干,请自备茶水! 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { ...

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

    1.程序在计算机中是如何运行的? 运算器 控制器 存储器 输入设备 输出设备 在计算机中,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存,外部存储器主要就是磁盘,磁盘又 ...

  4. Linux内核分析(一)通过汇编代码,理解程序在计算机中是如何运行的

    作者:于波 声明:原创作品转载请注明出处    来源:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 首 ...

  5. 程序在计算机中是如何运行起来的

    前言 前言:CPU和内存 文章目录 前言 一.什么是软件 二.CPU 1.简介 2.寄存器 3.运算器 1)算术逻辑单元(ALU) 2)累加寄存器(AC) 3)数据缓冲寄存器(DR) 4)状态条件寄存 ...

  6. 魔兽3无法启动此程序因为计算机中丢失,win10运行war3出错无法启动怎么办_win10系统war3不能启动如何解决...

    war3魔兽世界是一款备受玩家们喜爱的游戏之一,但是近日有win10系统用户要在电脑中运行war3的时候,却出错了,无法启动该游戏,要怎么解决这样的问题呢,针对win10系统war3不能启动这个问题, ...

  7. 无法启动此程序因为计算机中丢失msvcr110,无法启动此程序因为计算机中丢失msvcr110,教您无法运行程序提示计算机中丢失...

    用户在一次运行某程序时,运到"无法启动此程序,因为计算机中丢失msvcr.dll.尝试重新安装该程序以解决此问题."的提示,当时很无语,因为系统是刚刚安装好的,怎么处理呢?下面,小 ...

  8. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法

    可能有的朋友在运行某软件时,会出现了"无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题."的提示,遇到这样的情况该怎么办呢?不用着急,下面 ...

  9. 无法启动此程序因为计算机中丢失d3dx,因计算机中丢失d3dx9-41.dl而无法启动程序的解决办法...

    玩单机的朋友可能会遇到游戏打不开,并提示"无法启动此程序,因为计算机中丢失d3dx9_41.dll-.."的情况,顾名思义也就是缺少了d3dx9_41.dll文件的意思. 这种情况 ...

  10. 无法启动此程序因为计算机中丢失d3dcompiler_47.dll

    无法启动此程序因为计算机中丢失d3dcompiler_47.dll 这个原因应该是windows update在更新的时出现错误导致的 解决方法是安装 KB4019990 更新包. 网址如下: htt ...

最新文章

  1. Linux环境安装phpredis扩展
  2. Ah, It‘s Yesterday Once More 构造,迷宫(2020.12.南京)
  3. 用Python实现每秒处理120万次HTTP请求
  4. JavaScript的gzip静态压缩方法记录
  5. c++利用初始化列表在类内部和类外部定义构造函数的区别
  6. Python中if-else语句的多种写法
  7. Kubernetes详解(二十三)——Deployment控制器更新策略
  8. 6.18-GTest
  9. .net session超时设置 sessionState的相关属性
  10. Linux文件传输与mysql数据库安装
  11. 如何通过C#开发调用Skyline软件中提供的小工具
  12. GitHub 桌面版 v3.0 新特性「GitHub 热点速览 v.22.18」
  13. 或是独体字吗_独体字
  14. mysql 之 FLUSH TABLES
  15. pytorch进行图像识别_pytorch使用4种不同的模型进行面部表情识别
  16. 【NeurIPS 2019】Yoshua Bengio报告:深度学习系统从1代到2代,未来将朝何处发展?
  17. 腾讯前端面试经验(一)
  18. 超全总结:Go 读文件的 10 种方法
  19. NOKIA手机共有的缺陷
  20. HTML加入IP限制代码,利用HTML实现限制ip的投票网站作弊方案

热门文章

  1. 最大子段和问题,拾捡硬币问题, 矩阵连乘问题,最短公共超序列问题,最优二分搜索树,买卖股票的最佳时机,天平秤金条问题,动态规划解最短路径问题
  2. 二级建造师的注册相关问题
  3. HTTP 身份验证框架(Basic 认证)
  4. 后知后觉,那些码了百万行代码后才知道的低级错误!!!
  5. Linux:openssl创建CA及颁发证书
  6. 使用QT绘制一个两侧为半圆中间为矩形的规则形状
  7. 定时任务调度框架Quartz--Misfire处理规则
  8. Apache Whirr 因长时间未更新遭下课
  9. 建档立卡申请补助乐山市计算机学校,中职建档立卡特别生活补助申请的公告
  10. 广东海洋大学全国计算机考试,2018年广东海洋大学全国计算机等级考试报名条件...