96KB存储器的怎么算地址范围_每天都在敲代码,但是一个程序在计算机中是怎么运行的?...
强烈声明:本文很干,请自备茶水!
开门见山,咱不说废话!
你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!"); }
}
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主要就干如下四件事情:
- 从内存中读取数据,然后放到寄存器中
- 把寄存器中的数据写入到内存
- 进行数学运算和逻辑运算(加减乘除,AND,OR)
- 依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)
不知道你发现没,我们似乎一直在提寄存器,这又是什么玩意?这就要看看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主要做的四件事情:
- 从内存中读取数据,然后放到寄存器中
- 把寄存器中的数据写入到内存
- 进行数学运算和逻辑运算(加减乘除,AND,OR)
- 依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)
怎么样,是不是更加清晰明了!
总结一哈
这么一看,也没啥难的吗?总的来说啊,就是我们写的程序是放在硬盘中的,在运行的时候才会被调入到内存中,也就是说内存中的数据是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,然后CPU会根据相应的指令去操作寄存器中的数据,比如加减乘除什么的,以此来完成一个程序在计算机中的运行。
一句话总结:
本身程序是在硬盘上,需要把程序加载进内存,然后由CPU去执行
原创丨ithuangqing
优课达:程序员小白入门Java,JDK怎么安装与配置环境变量?
优课达:程序员面试Java编程知识大全:最新版Java基础知识面试题(一)
优课达:程序员面试Java编程知识大全:最新版Java集合容器面试题(一)
优课达:程序员面试Java编程知识大全:最新版Java虚拟机(JVM)面试题(一)
听说给好内容点赞,知乎就会继续给你推荐相关的优质回答,再也不怕没学习素材了~~
96KB存储器的怎么算地址范围_每天都在敲代码,但是一个程序在计算机中是怎么运行的?...相关推荐
- 96KB存储器的怎么算地址范围_产品条码怎么申请费用
产品条码怎么申请费用 如何申请条形码水晶是不是真的非常的漂亮?移动硬盘是配套装后都会装上的,需要有移动电源(电脑用品.移动存储器等)的配件,并且容易生锈.条形码指的是利用手机不需要,准确使用专门的消费 ...
- 96KB存储器的怎么算地址范围_STM32入门系列-存储器与寄存器介绍
我这有30套嵌入式创客开发板 需要的朋友加13260562029 介绍两部分内容: 什么是存储器映射 什么是寄存器及寄存器映射 为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来 ...
- python怎么输入程序代码_学习用 Thonny 写代码: 一个面向初学者的Python IDE
学习编程很难.即使当你最终怎么正确使用你的冒号和括号,但仍然有很大的可能你的程序不会如果所想的工作. 通常,这意味着你忽略了某些东西或者误解了语言结构,你需要在代码中找到你的期望与现实存在分歧的地方. ...
- vc6开发一个抓包软件_惊奇软件[21]:这是一个程序员开发的背单词网站,可好用了!...
惊奇软件 未经授权禁止转载 正文--------------------------------- 哔哩哔哩小破站的UP主们就是厉害...... 就在前几天,小编我想找一款背单词的软件(某百词用的有点 ...
- thonny和python有什么关系_学习用 Thonny 写代码: 一个面向初学者的Python IDE
学习编程很难.即使当你最终怎么正确使用你的冒号和括号,但仍然有很大的可能你的程序不会如果所想的工作. 通常,这意味着你忽略了某些东西或者误解了语言结构,你需要在代码中找到你的期望与现实存在分歧的地方. ...
- mac地址修改_【电脑知识】在纯DOS下更改BIOS中网卡MAC地址教程
本文来自网络收集~最全的BIOS中MAC地址修改教程方法 1.Mac地址修改工具及教程: 一.主板使用AMI BIOS的只要使用AMI的BIOS刷新工具重写网卡的MAC地址就可以. AFUDOS下载地 ...
- float js 正则 验证_爬虫篇 | 200 行代码实现一个滑动验证码
最近整理一个爬虫系列方面的文章,不管大家的基础如何,我从头开始整一个爬虫系列方面的文章,让大家循序渐进的学习爬虫,小白也没有学习障碍. 爬虫篇 | Python使用正则来爬取豆瓣图书数据 爬虫篇 | ...
- 人看不如机算:手把手叫你用python50行代码做一个ocr核酸检测报告并输出到统计表中
最近公司天天在排查核酸检测报告情况,看的我是眼花缭乱.作为机器视觉的我深知,计算机代替人可是事半功倍.于是准备上手写一个代码. 原图大体类似这种: 我需要每天看大量的这类图.于是.我决定使用paddl ...
- python代码打开可执行文件_将自己的Python代码打包成exe文件(更换设备可运行的)...
1.这里使用到的第三方库是 pyinstaller,先安装该库 pip install pyinstaller 2.将python文件copy到python的安装目录下的Scripts目录下 3.打开 ...
最新文章
- linux shell 数组倒序
- 苹果自带的清理软件_清理苹果Mac系统垃圾用什么软件?
- 利用冒泡排序法实现select option按中文排序组件
- 数字怎么横 竖排_从这些数字更深入了解打包箱房
- windows配置samba客户端_如何搭建与Windows客户机结合使用的Samba文件服务器?
- java 录音_用JAVA实现不限时录音功能
- c语言查看进程模块,计算机二级考试C语言辅导:进程模块查看
- react之使用js创建虚拟DOM
- python导入matplotlib模块_从NumPy导入python子模块有什么区别,matplotlib包
- 【Linux】进程间通信-命名管道FIFO
- python魔法方法(一)
- QT每日一练day26:绘制图片
- androidpn的学习研究(五)androidpn-client 常见BUG解决方法
- GitLab CI/CD实践
- Bailian3252 最大正向匹配【字符串匹配】
- JavaScript 启动性能瓶颈分析与解决方案
- 计算机读不出光盘,win7光盘读不出来怎么办|win7光驱读不出光盘的解决方法
- 【系统】VMware虚拟机安装黑苹果系统macOS 12.5详细步骤
- Arduino提高篇01—点亮OLED显示屏
- Facebook原型网站FaceMash域名拍得3万美元
热门文章
- 完了!Oracle 被虐!MySQL 登顶 Top1!原来这么多人都在用
- “抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!...
- CDN/视频流成“风口”,2 年内实现规模商用,揭晓 2020 年边缘计算发展现状!...
- 微软 HoloLens 2 的幕后故事
- 最后2天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
- CPU 是如何工作的?
- 华为主导 5G 入网之争?
- 李笑来登顶 GitHub TOP 榜!币圈大佬要教程序员如何自学编程
- 小米推新,黄章怒骂!留给魅族们的时间不多了 | 畅言
- 如何设计一个实用的线程池?