软件程序如何运行的-简述

2023-11-05

开门见山,咱不说废话!

你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); 
    }
}
熟悉吧,可能大家都知道,运行输出“Hello World!”,不过嘞,今天我带你从内存和CPU的角度去剖析一下这段代码在计算机中是如何执行的。

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

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

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

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

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

今天的主角,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,也就是5和3已经是二进制的形式在内存中,现在需要把a和b做加法运算,CPU收到这个指令(将a和b相加),就会去内存中将a和b读取,然后存放到自己的寄存器中,然后由CPU中的运算器去做加法运算,得到的结果依然放到寄存器中。

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

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

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

另外你需要知道的是,计算机是只认识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的构造了

CPU的重点组成部分
我们上面也说了,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主要做的四件事情:

1、从内存中读取数据,然后放到寄存器中

2、把寄存器中的数据写入到内存

3、进行数学运算和逻辑运算(加减乘除,AND,OR)

4、依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)

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

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

一句话总结:

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

另外对于内存啊,CPU什么呢还有很多有趣有用的知识,我们下次再讲!
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件程序如何运行的-简述 的相关文章

  • Windodws 常用dos命令

    r目录 1 打开黑窗口 1 1 正常打开黑窗口 2 2 管理员方式打开黑窗口 2 黑窗口常用命令总结 2 1 打开工具 2 2 操作计算机 2 3 查看计算机信息 补充 1 打开黑窗口 1 1 正常打开黑窗口 Win R 输入 cmd 可以
  • 常见的并发模型

    介绍 常见解决并发的策略一般有两种 共享数据和消息传递 基于消息传递的实现有 CSP模型 典型的有Go语言中基于Channel的通讯 Actor模型 典型的有Akka中的Actor模型 CSP模型和Actor模型的简单理解 Don t co
  • 计算机基础汇总

    计算机基础汇总 时间复杂度 https blog csdn net qq 41523096 article details 82142747 数组与链表 https blog csdn net qq 25806863 article det
  • shell I/O重定向

    shell重定向 lt 改变标准输入 program lt file 可将program 的标准输入改为file tr d r lt dos file txt 以 gt 改变标准输出 program gt file 可将program的标准
  • 补码的除法运算

    补码的除法运算是将两个数都使用补码的形式来进行计算 和原码的除法相比 补码的除法运算中被除数 除数以及余数都采用双符号位的形式参与计算 最后得到的余数符号位就代表着最终结果的符号位 加减交替法 题目 假设机器字长为5位 x 0 1000 y
  • 【数据结构】记录

    栈 堆 树 前序遍历 中序遍历 二叉树 搜索二叉树 二叉查找树 二叉查找树 BST Binary Search Tree 是一种特殊的二叉树 它改善了二叉树节点查找的效率 二叉查找树有以下性质 对于任意一个节点 n 其左子树 left su
  • 大学计算机基础 - 第十一章习题

    1 选择题 1 多媒体计算机中的媒体信息是指 D 文字 音频 音频 图形 动画 视频 视频 音频 A B c D 全部 2 多媒体技术的主要特性有 C 多样性 集成性 交互性 实时性 A 仅 B c D 全部 多媒体技术具有以下基本特征 1
  • OS常见面试题

    常见OS面试 常见面试题 进程和线程的区别 死锁的必要条件 怎么处理死锁 Window内存管理方式 段存储 页存储 段页存储 进程的几种状态 IPC几种通信方式 什么是虚拟内存 虚拟地址 逻辑地址 线性地址 物理地址的区别 1 进程和线程
  • LRU 最近最少使用算法

    LRU 最近最少使用算法 设计LRU Cash 数据结构 设计方法 代码实现 总结 百度百科 LRU是Least Recently Used的缩写 即最近最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页
  • 负数为什么要用补码来表示?

    上篇文章讲了 负数在计算机中是怎么存储的 看完之后 应该对原码 反码 补码有了基本的了解了 今天 我们深入探讨一下 为什么计算机中要用补码来表示负数 首先 我们应该清楚 原码是方便给人看的 看到一个数的原码 我们就能根据符号位和后边的二进制
  • 关系代数之连接 (Join)和除(Division)

    关系代数之连接 Join 和除 Division 数据库技术中这两个概念 对初学者而言 理解比较困难 本文对此进行深入浅出的解释 连接 Join 联接 定义 从两个关系的笛卡尔积中选取属性间满足一定条件的元组 记作 其中A和B分别为R和S上
  • 计算机单位及单位转换

    计算机单位及转换 一 位 计算机中表示信息的最小单位 表示一位二进制信息 以b表示 bit 0 1 一个字节8位 字节 计算机中处理信息的最小单位 以八位二进制信息 以B表示 1B 8b 一个整数4个字节 字长 一个字所包含二进制输的位数
  • 计算机组成原理笔记

    文章目录 一 计算机的基本组成 二 总线 2 1 总线控制 三 主存储器 3 1 RAM 3 2 存储器与CPU相连 3 3 存储器校验 3 4 提高存储器访问速度 3 5 cache 四 输入输出系统 4 1 I O接口 4 2 程序中断
  • 【数学公式】Mathpix和MathType等等

    MathML MathML指 数学标记语言 是XML语言的一个子集 用来在web网页 甚至部分软件中显示数学公式 简言之 就是使用特殊的类似HTML的标记在网页中显示数学公式 MathType公式编辑器 MathType是一个强大的数学公式
  • Windows记事本编码反汇编分析

    转载自 liam page 网上有一个流传多年的段子 这个段子大致是说 若你在简体中文版本的 Windows 系统下 用系统自带的记事本程序 以默认的 ANSI 编码保存 联通 两个字 那么重新打开后 联通 二字就消失了 如果我没记错的话
  • 字节和比特简单介绍

    字节 byte 字节为Byte 多数用B表示 字节为计算机中数据处理的基本单位 比特 bit 又称位 表示二进制位 为计算内部数据存储的最小单位 关系 1Byte 8bit 其他单位 1B Byte 字节 8bit 1KB Kilobyte
  • 【数据结构】堆、栈的区别

    heap 是堆 stack 是栈 在编程语言中 内存分配方式主要包括 栈 堆 静态存储分配 栈的内存是由操作系统自动分配 释放的 存放函数的参数值 局部变量等 堆的内存是由程序员手动申请和释放的 对应C语言中的malloc函数和C 中的ne
  • 笔记总结备份

    目录 文章目录 目录 前言 版本控制 常用git 命令 操作系统 系统 机器数 时间管理 早期的 Linux 时间系统 中断 内存管理 内存分区 malloc申请一块内存的背后原理 RTOS 系统栈和协议栈 寄存器 磁盘调度算法 虚拟内存
  • 计算机基础:网络基础

    一 网线制作 1 制作所需要工具 网线 网线制作标准 2 水晶头使用 3 网线钳使用 4 视频教学 网线制作 二 集线器 交换机介绍 1 OSI七层模型 Open System Interconnect 即开放系统互连参考模型 是由 ISO
  • 计算机基础:网络基础

    一 网线制作 1 制作所需要工具 网线 网线制作标准 2 水晶头使用 3 网线钳使用 4 视频教学 网线制作 二 集线器 交换机介绍 1 OSI七层模型 Open System Interconnect 即开放系统互连参考模型 是由 ISO

随机推荐

  • vue移动端适配(px转vw)postcss-px-to-viewport配置

    安装postcss px to viewport npm install postcss px to viewport 根目录新建postcss config js文件 postcss config js文件 module exports
  • FPGA自学之路4(按键消抖)

    先看框图 按键消抖意思就是前面和后面会有一系列信号抖动 中间才是我们要的信号 这里预设中间需要的信号 gt 20ms 用计数器计数 key in低电平就开始计数 高电平就清零 等计数器能计数到M 1 20ms 时输出一个高电平 这个按键消抖
  • Windows在线安装Qt5.15.2教程、Qt组件模块选择

    1 Qt5 15 2安装包 https download qt io 从archive qt里选 2 Qt5 15 2在线安装教程 https blog csdn net Qi 1337 article details 121249717
  • 关于:Error:java:java.lang.ExceptionInInitializerError 问题的解决

    本地运行项目的时候报上面错误 原因是jdk版本过高导致 解决方法步骤如下 idea 1 点击 File Project Structrue 2 把这两个圈起来的选项改成如下 3 保存 再次运行问题解决
  • 冒泡排序、插入排序、希尔排序、选择排序、堆排序、快速排序六大排序详解

    1 冒泡排序 思路 左右相邻的两个数互相比较 大的交换到序列后边 每次遍历排出剩余的最大的数 如下图所示 代码如下 void BubbleSort int a int n n为数组元素个数 int i 0 j 0 for i 0 i lt
  • 【已解决】No qualifying bean of type ‘service.Service‘ available

    Exception in thread main org springframework beans factory NoSuchBeanDefinitionException No qualifying bean of type serv
  • MySql优化实战案例

    文章目录 建立测试表 联合索引第一个字段用范围不走索引 覆盖索引优化 in和or在表数据量比较大的情况会走索引 在表记录不多的情况下会选择全表扫描 like KK 一般情况都会走索引 Order by 和 group by优化 Order
  • [LeetCode] Valid Anagram - 字符串排序比较系列

    题目概述 Given two strings s and t write a function to determine if t is an anagram of s For example s anagram t nagaram ret
  • Matplotlib:Adding an axes using the same arguments as a previous axes

    学习 机器学习实战 kNN时 在使用Matplotlib画图时 发现了一个Warining MatplotlibDeprecationWarning Adding an axes using the same arguments as a
  • discuz手机端修改url

    discuz的站需要做伪静态 修改url 本来是直接在最外层用ob函数来替换 pc端的可以 但是这个方法用在手机端的时候 发现失效 后来发现是手机端的php文件使用了函数清空了缓存 ob end clean source class hel
  • python随机性实验

    20210408 0 引言 在另外一篇文章中说明了在使用深度学习库的时候 实验结果的可复现的属性 深度学习实验结果可复现所需设置 随机数等内容设置 文中提到 如果是用GPU加速的话 那么很可能导致实验无法复现 那么就只能使用CPU 好在手里
  • LeetCode:第302场周赛【总结】

    这场比赛用C 写了两个题 在赛后用python补题收获很多 学习了一些python的内置函数 方法学习源于其他优秀的博主 6120 数组能形成多少数对 A题 思路 方法一 我自己写的算法 先对nums排序 之后遍历数组找相邻的位置是否相同
  • 【Docker】Docker安装

    1 添加内核参数 1 通过实训平台进入到操作系统界面 在 后输入vi etc sysctl conf命令 然后按Enter键 进入编辑模式 示例代码如下 root xxx vi etc sysctl conf 2 编辑配置文件 etc sy
  • 行为型模式-命令模式

    package per mjn pattern command import java util HashMap import java util Map 订单类 public class Order 餐桌号码 private int di
  • cv2 python 获取斑马线_opencv 斑马线,条纹检测

    斑马线检测 基于OpenCV 效果不是很好 设置DEBUG变量为True时会输出每一步图像用于逐帧debug和调参 按下任意键或者按住不放下一步 设为False则只画最后结果图 红色方框是判断为斑马线的滑窗 紫色方框是最终输出的斑马线位置
  • 分享 10 个我常逛的国外技术社区,真的受益匪浅

    经常有小伙伴问 小富 有什么国外的技术社区 博客推荐吗 总有人问 索性我就把自己经常访问的 10 个国外技术社区分享出来 想要玩转这些资源的前提 要么自身外语水平不错 要么找个好的翻译工具 不然 不过 也不要一味的崇拜国外的技术 其实你看一
  • 华为设备添加接口描述

    进入视图视图 system view 进入接口 AC6005 int g0 0 1 添加接口描述 AC6005 GigabitEthernet0 0 1 description Con To S1 返回用户视图 AC6005 Gigabit
  • python学习笔记——hashlib模块

    上篇 https blog csdn net qq 42489308 article details 89813895 hashlib Hash 译做 散列 也有直接音译为 哈希 的 把任意长度的输入 通过某种hash算法 变换成固定长度的
  • Springboot项目bootstrap配置未生效、application.yml未读取bootstrap配置文件参数

    场景 Springboot项目 application yml未读取bootstrap配置文件参数 原因 Springboot项目不读取bootstrap yml配置文件 SpringCloud项目才读取bootstrap yml配置文件
  • 软件程序如何运行的-简述

    开门见山 咱不说废话 你有没有想过 你写的程序 是如何在计算机中运行的吗 比如我们搞Java的 肯定写过这段代码 public class HelloWorld public static void main String args Sys