【手把手带你学 Java EE】计算机是如何工作的
好久没有写博客了,最近新开始了JavaEE的学习,借着这个机会,赶紧把博客捡起来,跟大家一起分享、学习新知识。
如果你觉得这篇文章有用的话,记得给我点赞噢!
如果你也想跟我一起学习,那就千万别忘记一键三连关注我哟~
在Java EE的初阶中,我们主要学习一些比较基础的内容,涵盖操作系统,网页前端和网站的后端搭建。虽然我们的目标是成为一个后端工作人员,但是一个程序员需要了解最基本的计算机的构成、网页的基本原理,对于整个计算机的如何工作的有个大致的了解,这样才能帮助我们更好地写出更优的代码~
计算机发展史(极简版)
为什么会有计算机呢?
从计算机的名字我们就可以知道,计算机的诞生是为了计算了,随着人类的计算需求越来越大,人工的计算已经不能满足我们的需求了,于是就有了计算机。
第一台电子通用计算机是1945年在“宾夕法尼亚大学”完成建造的。
冯诺依曼体系
现代的计算机,大多遵循冯诺依曼体系结构:
- CUP 中央处理器:进行算数运算和逻辑判断
- 存储器:分为内存和外存,以二进制的形式对数据进行存储
- 输入设备:用户用于向计算机发送指令的设备
- 输出设备:计算机呈现结果的设备
区别内存和外存:
外存其实就是外存储器,比如硬盘、光盘、U盘等等,而内存则是相对外存而言的。
访问速度:内存>外存
存储空间:内存<外存
成本:内存>外存
外存可持久化存储,而内存则不能(关电脑之后数据就没啦~)
CUP工作流程
简单地介绍了冯诺依曼体系后,下面再简单地介绍一下CPU的工作流程~
那么CPU是怎样从无到有工作的呢?
逻辑门
电子开关
在CPU中,最基本的单位就是电磁继电器,是一个电子开关,我们通过通电来控制磁场,进而控制开关的闭合,这样就使电路实现了有电流和无电流两种状态,称为1和0.
后来随着技术的发展,人们进一步使用了真空管、逻辑管来实现一个逻辑门,其物理原理更加复杂, 但是本就就是产生0和1两种状态。
门电路
有了电子开关,我们就可以通过电子开关的组合来够成一些基本的们电路了。
门电路其实就是用来进行一些基本的逻辑运算的部件。
分为非门、与门、或门,异或门,分别可以针对0或1完成按位与、按位或、非、异或的逻辑操作,当然其中的实现这里就不赘述了。
算术逻辑单元 ALU
算术逻辑单元ALU就是计算机中进行计算、逻辑运算的核心部件啦!可称其为计算机的数学大脑。其实它就是用上面介绍的逻辑门构成的。
乘法可以由加法完成,除法又可以由减法完成,而计算机中的数是以补码的形式存储的,所以减法也可以由加法实现,所以我们只需要通过一个加法器就可以实现数的运算啦~
半加器
在计算机的世界里,其实就是针对0和1进行运算。
比如:1+1=10
这里因为有进位,所以我们有两个输出A和B,也有两个输出,一个是得到的这一位的结果0,一个是是否产生了进位,是则为1,否则为0.
全加器
全加器其实就是进行三个1位的相加,即把半加器输出结果中的进位作为第三个输入,这样就可以处理进位的情况啦~
然后我们就可以通过一个半加器(第一位)和(n-1)个全加器的组合来实现(n位)数的加法啦~
而上述的加法器,其实就是通过电子开关的组合来实现。
寄存器
CPU要对数据进行运算,必然需要对数据进行存储,而这个存储数据的器件就是寄存器。
寄存器的本质也是电子开关的集合,通过逻辑运算来控制是否存储数据,这个存储集合的基本单位就是锁存器,通过输入是否为1来决定是否写入(即存储)数据。
在CPU中,这些数据的读取速度很快,但是只要一断电,数据就全部消失了。
而内存(PAM:Random Access Memory)其实就是一系列锁存器的组合,其构建又复杂啦,在此只需要知道原理即可,细节可参考计算机系统/计算机组成原理等课程。
控制单元
CPU其实就像是人类的大脑,负责进行数据的处理、存储,那么CPU要怎么完成指令呢?这时候就需要有一个专门负责只会的部门,这个部门就是控制单元。
关于控制单元的基本组成原理,这里就不展开了。
指令
了解了控制单元的存在之后,我们可以用它来组成指令了。
指令其实也是一组数字,通过数字的含义来表达CPU的工作命令。
早期计算机刚诞生的时候,人们需要一个字一个字地把0和1的信息(机器语言)告诉给计算机,但是这样实在是太麻烦了,于是就有了汇编语言,即将一些基本的指令用简单的单词来表示,再有计算机自动转换成对应的指令进行执行,这样就不用再一直010101地控制开关了。
而不同厂商制造的CPU支持的机器语言可能有所差别,一个CPU具体支持哪些指令,则需要根据厂商提供的“芯片手册”来获得。
~通常学校中学习的汇编语言针对的是Intel 8086 CPU~
那么指令是如何执行的呢?
下面我们构造出一个简单的指令表:
一条指令由操作码和被操作数组成:
操作—>对应指令
- 把0001加载到A寄存器中—> 0010 0001
- 把0010加载到B寄存器中—> 0001 0010
- 把A寄存器中的数据写入内存中的存储器—> 0100 0001
- 把存储器中的数据和B寄存器中的数据相加,结果放到存储器中—> 1000 0100
这样就通过四个指令完成了1和2两个数的相加。
简而言之,CPU的工作流程就是:
- 从内存中读取指令
- 解析指令
- 执行指令
而上面三步,都是通过控制单元来说实现的。
编程语言
我们平时编写的C、C++、Java等计算机高级语言,最终都是转换成CPU所能识别的机器指令,从而得到执行的。
上述例子只是展现了最简单的加法运算,其实只要再叠加上条件的判断等等操作,就可以实现更多的功能了(条件语句和循环语句)。
从指令的获取,到解析,再到执行,就是一个完整的周期。
我们可以在计算机控制面板的系统中查看CPU的主频。
其可以大致理解机器每秒钟执行的指令数,这里数字3.30GHz大致可以近似看做每秒钟可以执行33亿次指令,可见其执行效率是非常高的。而数字越大,表示CPU一秒钟内可以执行的指令数越多。
操作系统
计算机中还有一个重要的东西:操作系统
它又是干嘛的呢?
其实,操作系统是计算机上重要且复杂的“软件”~
这个软件主要负责一些管理事务:
- 对下,它要管理好底下各个部门的伙伴(底层硬件设备)
- 对上,它要给各个大老板提供良好的服务(给其他应用软件构建一个稳定的运行环境)
进程
每个应用程序在操作系统中的一次运行,都被抽象为一个进程,而操作系统会为每一个进程提供运行的资源。
电脑中的这些.exe文件(里面存储了与这个程序对应的二进制指令),都是我们安装在电脑中应用程序,当我们打开程序时,操作系统就会把这个程序加载到内存中,开始让CPU执行其中的指令。而这些在电脑上跑起来的程序,就成了前面提到的进程。
当我们打开电脑上的任务管理器,就可以看到当前计算机上运行的进程~
所以,在操作系统内部,进程是操作系统进行资源分配的基本单位。
进程控制块抽象
我们的电脑需要同时运行许多程序,这时候就涉及到了进程的管理,于是就有了“进程控制块抽象”(PCB Process Control Block)的概念,PCB其实就是描述每个进程的信息的。
PCB包含:
-
pid (进程id) - 进程的身份证号。在任务管理器中可以看到每个进程的pid
-
内存指针 - 指向这个进程所要执行的指令的存储位置,以及相关数据的存储位置,以便操作系统将将运行程序所需的数据都加载到内存中。
-
文件描述表 - 程序在运行的时候,经常需要对文件进行操作。
进程每打开一个文件,文件描述表上就会多一项信息。我们可以将文件描述表视为一个数组,数组中的每个元素是一个结构体,用于描述对应的文件的相关信息。
而一个程序只要运行起来,系统就是默认打开三个文件:标准输入(System.in)、标准输出(System.out)、标准错误(System.err)
以上三条描述的是进程最基础的属性,它是进程运行的基础,接下来还有一组属性,其功能主要是为了能够实现进程的调度。
-
状态
一个线程的状态觉得了下一步CPU是否分配资源给它。
例如:就绪状态(随时可以执行任务)、阻塞状态(暂时不能执行任务)等等 -
优先级
根据每个进程的优先级不同,系统会给优先级高的程序分配更多的时间等等、 -
记账信息 - 统计每个进程的执行时间、等待实现、执行的指令等等,这些信息可以为进程调度提供依据。
比如A进程已经等了很久,那么CPU就会根据这个信息,考虑到A已经等好久了,就要给A分配一些CPU的资源,以此来确保每个进程都能分配到资源。
- 上下文 - 用于记录进程上一次调出CPU的时候,程序执行的状态。
每个进程并不是进入CPU之后就要一次性把任务执行完毕,而是只能在某个时间段内使用CPU的资源,时间到了之后就得等待下一次系统的分配,这时候就需要记录该进程已经被执行到哪个部分了,相当于文明完游戏的时候并不是每一次进入游戏都重新开始,而是退出之前将记录存档,下一次开始游戏的时候再读档,然后继续游戏。而进程里存档的信息,就是这里的“上下文”。
进程的调度
进程的调度,其实就是操作系统在考虑CPU如何给各个进程分配资源。
系统对CPU资源的分配,采用的是时间模式,即在不同的时间段给不同的进程分配CPU资源。
内存分配
操作系统对内存资源的分配,使用了一个虚拟地址空间。
由于在操作系统上,同时运行着很多的进程,如果所有进程都用同一个地址,那么如果其中的某个进程出现了BUG,就很可能影响其他进程。
所以为了避免出现这种情况,操作系统就把进程之间通过虚拟地址空间来隔离开,即每个进程使用各自不同的虚拟地址空间,这样两个进程使用的是不同的空间,也不能直接交互。
但是也有一些进程是需要相互交互交流的,于是操作系统除了提供隔离开的空间,也会提供一些公共的空间,这样的空间类似于一个外卖柜,A把外卖放到柜子上,等B进程执行的时候再到外卖柜这里把外卖取走。
进程间通信
刚才说到有些进程之间是需要相互交流的,这就涉及到了进程间的通信。
在操作系统中,提供的“公共空间”有很多种,并且各有特点,有的存储空间大,速度快,有的则比较小,速度较慢。
操作系统中提供的进程通信机制如下:
- 管道
- 共享内存
- 文件
- 网络
- 信号量
- 信号
其中,网络除了支持同主机两个进程间通信,还支持同一个网络下不同主机上的进程间通信。
总结
本文主要讲了计算机是如何工作的:
- 计算机中最基本的单元是电子开关,电子开关的不同组合构成了各种元器件。
电子开关—>基本单门电路—>半加器—>全加器—>加法器—>加减乘除
其中CPU是计算机中最重要的核心构成。
-
操作系统是一个搞管理的软件,负责协调好各硬件设备,为上层软件提供稳定的运行环境。
-
进程是跑起来的应用程序,通过PCB来描述。进程的调度是由系统按照时间和空间两种模式进行分配。为了保证进程的独立性,系统为每个进程分配了独立的虚拟地址空间,但同时也提供了进程间通信的通道。
如果你觉得文章对你有用,动动小手指给我点个赞吧~~
也欢迎大家和我交流噢!~
关注我!一起精进吧!~