【CPU是如何执行程序的?】

news2024/10/9 4:17:20

CPU是如何执行程序的?

  • 1、、硬件结构介绍
    • 1.1、CPU
    • 1.2、内存
    • 1.3、总线
    • 1.4、输入/输出设备
  • 二、程序执行的基本过程
  • 三、a=1+1执行的详细过程


  现代计算机的基本结构为五个部分:CPU、内存、总线、输入/输出设备。或许你了解了这些概念,但是你知道a=1+1在计算机中是如何执行的呢?

1、、硬件结构介绍

在这里插入图片描述

1.1、CPU

  中央处理器也就是我们常说的 CPU,32 位和 64 位 CPU 最主要区别在于⼀次能计算多少字节数据:

32 位 CPU ⼀次可以计算 4 个字节;
64 位 CPU ⼀次可以计算 8 个字节;
这⾥的 32 位和 64 位,通常称为 CPU 的位宽,位宽越⼤,可以计算的数值就越⼤,⽐如说 32 位 CPU 能算的最⼤整数是 4294967295 。

  CPU 内部还有⼀些组件,常⻅的有寄存器控制单元逻辑运算单元等。其中,控制单元负责控制 CPU⼯作,逻辑运算单元负责计算,⽽寄存器可以分为多种类,每种寄存器的功能⼜不尽相同。
  有内存为什么还需要寄存器呢?内存离 CPU 太远了,⽽寄存器就在 CPU ⾥,还紧挨着控制单元和逻辑运算单元,⾃然计算时速度会很快。

常⻅的寄存器种类:

  • 程序计数器,⽤来存储 CPU要执⾏下⼀条指令「所在的内存地址」,注意不是存储了下⼀条要执⾏的指令,此时指令还在内存中,程序计数器只是存储了下⼀条指令的地址。
  • 指令寄存器,⽤来存放程序计数器指向的指令,也就是指令本身,指令被执⾏完成之前,指令都存储在这⾥。
  • 通⽤寄存器,⽤来存放需要进⾏运算的数据,⽐如需要进⾏加和运算的两个数据。

1.2、内存

  我们的程序和数据都是存储在内存,存储的区域是线性的。
  数据存储的单位是⼀个⼆进制位(bit),即 0 或 1。最⼩的存储单位是字节(byte),1 字节等于 8 位。
  内存的地址是从 0 开始编号的,然后⾃增排列,最后⼀个地址为内存总字节数 - 1,这种结构好似我们程序⾥的数组,所以内存的读写任何⼀个数据的速度都是⼀样的。
   32 位 CPU 最⼤只能操作 4GB 内存,就算你装了 8 GB 内存条,也没⽤。⽽ 64 位 CPU 寻址范围则很⼤,理论最⼤的寻址空间为 2^64 。

1.3、总线

  总线是⽤于 CPU 和内存以及其他设备之间的通信,

总线可分为 3 种:

  • 地址总线,⽤于指定 CPU 将要操作的内存地址;
  • 数据总线,⽤于读写内存的数据;
  • 控制总线,⽤于发送和接收信号,⽐如中断、设备复位等信号,CPU 收到信号后⾃然进⾏响应,这时也需要控制总线;

  当 CPU 要读写内存数据的时候,⼀般需要通过两个总线:⾸先要通过「地址总线」来指定内存的地址;再通过「数据总线」来传输数据;

1.4、输入/输出设备

  输⼊设备向计算机输⼊数据,计算机经过计算后,把数据输出给输出设备。期间,如果输⼊设备是键盘,按下按键时是需要和 CPU 进⾏交互的,这时就需要⽤到控制总线了。

二、程序执行的基本过程

在这里插入图片描述
  那 CPU 执⾏程序的过程如下:

  • 第⼀步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过「数据总 线」将指令数据传给 CPU,CPU收到内存传来的数据后,将这个指令数据存⼊到「指令寄存器」。
  • 第⼆步,CPU分析「指令寄存器」中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给「逻辑运算单元」运算;如果是存储类型的指令,则交由「控制单元」执⾏;
  • 第三步,CPU执⾏完指令后,「程序计数器」的值⾃增,表示指向下⼀条指令。这个⾃增的⼤⼩,由 CPU 的位宽决定,⽐如 32 位的 CPU,指令是 4个字节,需要 4 个内存地址存放,因此「程序计数 器」的值会⾃增 4;

  简单总结⼀下就是,⼀个程序执⾏的时候,CPU 会根据程序计数器⾥的内存地址,从内存⾥⾯把需要执⾏的指令读取到指令寄存器⾥⾯执⾏,然后根据指令⻓度⾃增,开始顺序读取下⼀条指令。
  CPU 从程序计数器读取指令、到执⾏、再到下⼀条指令,这个过程会不断循环,直到程序执⾏结束,这个不断循环的过程被称为 CPU 的指令周期

三、a=1+1执行的详细过程

  CPU 是不认识 a = 1 + 2 这个字符串,这些字符串只是⽅便我们程序员认识,要想这段程序能跑起来,还需要把整个程序翻译成汇编语⾔的程序,这个过程称为编译成汇编代码
  针对汇编代码,我们还需要⽤汇编器翻译成机器码,这些机器码由 0 和 1 组成的机器语⾔,这⼀条条机器码,就是⼀条条的计算机指令,这个才是 CPU 能够真正认识的东⻄。
  下⾯来看看 a = 1 + 2 在 32 位 CPU 的执⾏过程。程序编译过程中,编译器通过分析代码,发现 1 和 2 是数据,于是程序运⾏时,内存会有个专⻔的区域来存放这些数据,这个区域就是「数据段」。如下图,数据 1 和 2 的区域位置:

数据 1 被存放到 0x100 位置;
数据 2 被存放到 0x104 位置;

注意,数据和指令是分开区域存放的,存放指令区域的地⽅称为「正⽂段」。
在这里插入图片描述
  编译器会把 a = 1 + 2 翻译成 4 条指令,存放到正⽂段中。如图,这 4 条指令被存放到了 0x200 ~ 0x20c的区域中:

0x200 的内容是 load 指令将 0x100 地址中的数据 1 装⼊到寄存器 R0 ;
0x204 的内容是 load 指令将0x104 地址中的数据 2 装⼊到寄存器 R1 ;
0x208 的内容是 add 指令将寄存器 R0 和 R1的数据相加,并把结果存放到寄存器 R2 ;
0x20c 的内容是 store 指令将寄存器 R2 中的数据存回数据段中的 0x108地址中,这个地址也就 是变量 a 内存中的地址;

  编译完成后,具体执⾏程序的时候,程序计数器会被设置为 0x200 地址,然后依次执⾏这 4 条指令。
  上⾯的例⼦中,由于是在 32 位 CPU 执⾏的,因此⼀条指令是占 32 位⼤⼩,所以你会发现每条指令间隔4个字节。如果是 64 位 CPU 执⾏的,⼀条指令是占 64 位⼤⼩,你会发现每条指令间隔8个字节。
  ⽽数据的⼤⼩是根据你在程序中指定的变量类型,⽐如 int 类型的数据则占 4 个字节, char 类型的数据则占 1 个字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode每日一题(python)2023-1.2 1801. 积压订单中的订单总数 (middle)

leetcode每日一题 🚩 学如逆水行舟,不进则退。 —— 《增广贤文》 题目描述: 给你一个二维整数数组 orders ,其中每个 orders[i] [price(i), amount(i), orderType(i)] 表示有 amount(i)( )笔类型为 orderType(i) 、价格为 pric…

没错,这是2023年开篇!!

不知不觉小G和Gopher们一起相伴着又走过了一个年头,迎来了2023年。回望这一年我们有遗憾:因疫情的原因没能和大家在线下2022 GopherChina大会相聚一堂我们也有快乐与成就:在经过一番调查、统计、分析后发布了《2022 Q2 GO开发者问卷调查结果》…

阿里、京东、百度“激战”互联网医疗

与衣食住行一样,医疗需求同样对人们的生存具有重要意义。医疗行业经过多年的发展,也已经发生了翻天覆地的变化。除了线下医疗日益完善之外,互联网医疗也随着互联网的飞速发展而实现了快速起飞。现如今,互联网医疗已经逐步成为了线…

沿全尺寸模型水平轴 MHK 涡轮机(DOE RM1)叶片性能表征计算(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 该存储库包括 MATLAB 脚本和输入文件示例,用于沿全尺寸模型水平轴 MHK 涡轮机叶片计算 3D AOA、CL 和 CD。该脚本是…

idea插件代码生成工具EasyCode

idea插件代码生成工具EasyCode1. EasyCode下载安装2. EasyCode配置模板2.1 配置路径2.2 配置文件2.2.1. controller.java2.2.2. entity.java2.2.3. mapper.java2.2.4. service.java2.2.5. serviceImpl.java2.2.6. mapper.xml3. 构建SpringBoot项目3.1 初始化数据库3.2 创建项目…

git push -u origin master报错(vscode)

Missing or invalid credentials. Error: connect ECONNREFUSED /run/user/1000/vscode-git-e10c66c0ac.sock at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) { errno: -111, code: ‘ECONNREFUSED’, syscall: ‘connect’, address: ‘/run/user/1000/…

Docker 镜像仓库的构建与镜像管理

目录 Docker 私有仓库 1. 简介 2. 构建 Docker 私有仓库 (1)部署环境 (2)服务端部署 (3)客户端配置 (4)私有镜像仓库测试 Dockerfile 1. 概述 2. Dockerfile 的组成 3. D…

对序表记录固定排序

【问题】 PRODUCT_ID, PRODUCT_NAME 100 Nokia 200 IPhone 300 Samsung 400 LG I want to display the records like below: PRODUCT_ID, PRODUCT_NAME 300 Samsung 200 IPhone 100 Nokia 400 LG【回答】 固定排序有时排序依据会经常变动,并且…

JavaScript课堂笔记

前置任务: 配套视频:https://www.bilibili.com/video/BV15v411K7qe/ 第一章:基本语法 第一节:JavaScript的来源 1.网景公司(Netscape): 当时就职于Netscape公司的布兰登[外链图片转存失败,源站可能有防…

前端使用jquery传递对象数组给后端说明及总结

1.代码 前端 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tr…

苹果,Inter,AMD

1.指令集 & 架构区别 目前世界上主要有两种CPU架构&#xff0c;分别是&#xff1a;x86架构和ARM架构。 目前主流的电脑都是采用x86架构处理器&#xff0c;比如 Intel/AMD处理器。--复杂指令集 手机平板电脑等设备都采用了ARM架构处理器&#xff0c;比如高通&#xff0c;…

Elasticsearch集群许可证过期问题处理

当你执行索引相关操作有如下报错&#xff1a; HTTP/1.1 403 Forbidden content-type: application/json; charsetUTF-8 content-length: 384{"error" : {"root_cause" : [{"type" : "security_exception","reason" : "…

大学STEM教育的技能水平和收获

2021年一篇文章&#xff0c;有很多断章取义的解读&#xff0c;本身这篇文章也有很多主观性强的输出。 文章数据都是2020年之前。 Received: 6 June 2020; Accepted: 27 January 2021; 长达17页的论文&#xff0c;看了一遍&#xff0c;觉得构思很巧妙。 类似一篇精心设计的实验…

同样是断言,为何 Hamcrest 如此优秀?

根据项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;Maven 可以管理一个项目的依赖关系、构建、报表以及信息中心的部分文档。 hamcrest 断言 maven依赖&#xff1a; 1080160 26.3 KB hamcrest支持多种语言&#xff0c;这里以 Java 为例&#xff1a; 进入到 hamcre…

新兴新能源设施[2]--盐穴压缩空气储能预警模块开发

新兴新能源设施[2]--盐穴压缩空气储能预警模块开发1. 总体方案设计2 脉冲发生装置的部件设计2.1 脉冲发生装置基础选型2.2 相关技术指标1. 总体方案设计 盐穴储能注气排卤预警短节远程传输系统硬件的总体设计框架如图1&#xff08;a&#xff09;所示&#xff0c;其前端监测模块…

削波导致的振动值偏小

今天接到计量院的反馈&#xff0c;说振动表在250Hz时&#xff0c;振动台开100um时&#xff0c;测下来只有89um。我在公司试了下&#xff0c;发现250Hz、100um时&#xff0c;振动的大小是78.5mm/s&#xff0c;有效值是78.5*0.70755.5mm/s&#xff0c;这时传感器的输出电压是2320…

怎样识别图片中的文字?手机电脑都可以的

普通人过普通的生活就好&#xff0c;简单而平淡。而平淡的生活常常可以看到各种图片文字&#xff0c;毕竟遇到要记录重要的信息拍一拍就可以解决问题了&#xff0c;很简单的。通常情况下&#xff0c;我们都会再次检查相册中的关键信息&#xff0c;甚至有时我们还要整理出里面的…

10_1、Java基本语法之枚举类的使用

一、枚举类的引入 当在项目中使用一个或多个变量或常量表示某种状态时&#xff0c;比如&#xff0c;星期&#xff1a;星期一...星期天、就职状态&#xff1a;在职、离职...复岗等时&#xff0c;这些情况类的对象只有有限个&#xff0c;是确定的。这时就可以使用枚举类来定义这些…

信息安全技术 代码安全审计规范

声明 本文是学习GB-T 39412-2020 信息安全技术 代码安全审计规范. 下载地址 http://github5.com/view/789而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 代码安全审计规范 范围 本标准规定了代码安全的审计过程及方法&#xff0c;描述了软件代码安全…

Ubuntu 20.04 交叉编译opencv4.6.0

一、环境 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjas…