Java EE 计算机是如何工作的?

前言

对于软件工程师来说,学习计算机相关的知识不是为了能够学完就能自己手搓一台计算机,而是去理解计算机的核心工作原理,打破计算机的神秘感,以便后续的学习。

一、一台计算机的组成有哪些部分呢?

通常来说,一台计算机的组成通常包括以下几个部分:

  • CPU
  • 主板
  • 内存
  • 硬盘
  • 电源
  • 散热器
  • 机箱
  • 显卡
  • 鼠标键盘
  • 显示器

......

首先是CPU,它又叫中央处理器,它是电脑最核心的部分,可以说是人类科技的巅峰之作了,计算机的各种算术运算,逻辑判断都是靠它完成的,简单来说,电脑上的指令是靠它完成的。

接着是主板,主板没什么好讲的,简单来说它就是一块大插座,它的作用的把计算机的其他硬件连接起来。
绿色的部分是主板

再下来就是内存,内存和硬盘可以放在一起讨论,它们都是计算机中用来存储数据的模块,属于存储器。
电脑内存

硬盘可以分为固态硬盘(SSD)和机械硬盘(HDD)两种。
固态硬盘 机械硬盘

虽然说内存和硬盘都是计算机用于存储数据的模块,但是二者的差别还是挺大的,如下表所示:

内存 硬盘
访问速度 相较于内存来说,慢很多
存储空间 比较小 相较于内存来说,很大
成本 比较高 比较低
数据永久性 数据永久性不是很好,断电了数据就丢失了 数据永久性比较好,即使断电了,数据也能够保存很长一段时间。
[内存与硬盘的区别]

这里在多嘴一下,刚才说硬盘分为固态硬盘和机械硬盘两种,那它们又有什么区别呢?

1.在存储空间上,同等价位下,机械硬盘的存储空间大于固态硬盘。

2.在成本上,同等存储空间下,机械硬盘的成本低于固态硬盘。

3.在访问速度上,固态硬盘的访问速度大于机械硬盘。

4.数据安全性,基于它们二者的结构,机械硬盘的结构机械部件较多,抗震抗摔性较差,固态硬盘的结构无机械部件,因此它的抗震抗摔性较好。

5.在写入寿命上,固态硬盘的存储单元有可擦写数据次数限制,长期频繁写入会影响其寿命,而机械硬盘无写入次数限制,因此它适合长期静态储存。

6.在工作噪音上,固态硬盘工作时无机械运行,完全静音,而机械硬盘工作时由于磁盘旋转、磁头运动,因此会产生噪音。

接下来的电源、散热器、机箱,它们的作用也很明显了,电源为计算机提供稳定的电能来源、散热器为计算机降温、机箱将计算机的机械部件统一封装起来。

接着到显卡(GPU),显卡与CPU类似,它也能进行算术运算和逻辑判断,那么它和CPU有什么区别呢?

CPU就好比一名大学生,它能做很多的运算,1+1它可以做,微积分它也可以做,而显卡可以理解为是一群小学生,它们虽然说也能做运算,1+1它们可以做,但是微积分它们做不了,因此对于简单的运算,显卡算的就比CPU快,胜在人多嘛,但是难的运算它们可没办法,只能交给CPU去算。因此,从这里也能看出,CPU负责的是计算机比较困难的算术运算和逻辑判断,而显卡负责简单运算和逻辑判断,因此在我们玩大型游戏时,游戏画面的渲染主要是靠显卡完成的。

最后是鼠标键盘和显示器,它们的功能可以说是相反是,鼠标键盘用于向计算机输入内容,属于输入设备,而显示器则是用于计算机的内容输出,属于输出设备。

虽然说现代计算机涵盖的设备可能五花八门,但是大多遵循 冯诺依曼体系

冯·诺依曼(JohnvonNeumann,1903年12⽉28⽇-1957年2⽉8⽇),美籍匈⽛利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之⼀。冯·诺依曼是布达佩斯⼤学数学博⼠,在现代计算机、博弈论、核武器和⽣化武器等领域内的科学全才之⼀,被后⼈称为"现代计算机之 ⽗"、"博弈论之⽗"

冯诺依曼体系如下:

二、计算机的核心工作原理

要搞清楚计算机的核心工作原理,就要先搞清楚CPU的工作原理,毕竟CPU就是计算机的核心。首先呢,要搞懂CPU的工作原理,先要知道CPU的指标,CPU最核心的两个指标分别是

1.CPU的频率,指 的是CPU 核心的时钟频率,单位是 GHz,代表 CPU 每秒能完成的时钟周期数(1GHz=10 亿次 / 秒),简单来说,频率越高,CPU每秒就算的越多。

2.CPU的核心数,指的是 CPU 集成的独立运算核心数量(如 4 核、8 核、16 核),每个核心可独立执行指令。通俗来讲相当于工厂的 "工人数量",核心越多,能同时处理的并行任务越多。

CPU执行指令的过程

所谓的指令,就是指导CPU进行工作的命令,主要由操作码和操作数组成,其中操作码表示要做什么动作,而操作数是本条指令要操作的数据,可以是内存上的数据,也可能上是CPU寄存器 (CPU寄存器也属于存储器,CPU上有若干个寄存器,它与内存相比,存储空间很小,访问速度很快)上的数据。指令本身也是一个数字,以二进制形式保存在内存的某个区域中。
CPU指令集

CPU执行指令的过程通常如下:

  1. 读取指令
  2. 解析指令(根据指令集)
  3. 执行指令

了解了CPU的工作过程之后,再来讨论,我们经常在计算机上使用的程序是个什么东西。

程序(program)

程序是一组指令以及这组指令要处理的数据,狭义上来说,程序通常表现为一组文件。

程序 = 指令 + 指令要处理的数据

**在日常使用计算机的过程中,我们的计算机上可不单单运行一个程序,通常运行好几个,那么当计算机上同时允许多个程序时,CPU该怎么执行这些程序的指令呢?**是一个一个排队执行,还是一起执行呢?要解答这个问题,需要知道两个新的概念------操作系统和进程(任务)

操作系统(OperatingSystem)

操作系统是计算机中重要的软件,是一个搞管理的软件,它的工作:

  1. 管理各类硬件设备,通过硬件设备的驱动软件间接实现。
  2. 为各类应用程序提供一个稳定的运行环境,使它们相互不影响,不至于出现应该程序出bug,其他程序受影响的情况。

当然,操作系统不是某个指定的称呼,而是一个统称,是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系 列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。

进程(process)/任务(Task)

进程或者任务简单来说就是一个正在运行的程序。它是操作系统对于一个正在运行的程序的一种抽象,换而言之,可以把进程看做程序的一次运行过程,程序在运行过程中会消耗计算机的资源,比如说内存资源、io资源、网卡资源等,这些资源的分配需要操作系统去分配,因此进程又是操作系统进行资源分配的基本单位。

三、CPU、操作系统和进程三者之间的联系

当了解操作系统和进程之后,就可以把这两者和CPU联系起来,回答之前提到的问题了。首先要明确三者主要负责的工作,进程描述的是一个正在运行的程序,CPU去执行这个进程涉及到的指令,而操作系统负责进程消耗的计算机资源和CPU的调度,它为每个进程分配它们所需的计算机资源,并且合理安排CPU去执行各个进程的指令,防止出现多个进程同时争抢某一资源导致混乱的情况。这样说可能有点抽象,打个比方:

如果把计算机比作一个工厂,那么CPU就好比工厂里的工人,进程就好比这个工厂接到的任务,操作系统好比这个工厂的管理人员。这个工厂正常运行起来,需要管理人员去给每个工人分配工作和分配任务所需的资源,防止多个任务同时争抢某一资源/工具而导致工厂混乱的情况发生。

虽然说现代计算机通常有几个CPU核心,但是有时候计算机上的进程的数量可以远远超过CPU核心数的,那么面对这么多的任务,CPU才几个人怎么安排呢? 其实这个问题在早些的时间线就遇到了,在很久以前,计算机只有一个CPU,就是它的核心数为1,但在这种情况下,它面临的任务也不少,当时是"单任务"操作系统,即:同一时刻,只能运行一个进程,想要运行下一个进程就需要结束上一个进程。此时操作系统对CPU的调度是串行执行,简单来说就是一个一个任务排队去执行,显然这种方式效率太慢了,而且体验感也差,打个比方就是如果我在电脑上用qq发完消息了,要退出qq,才能打开下一个程序,但是如果我退出了qq那我就收不到qq的消息,要收到qq的消息,我就不能打开其他的程序,这种体验实在是太不妙了。

为了提供计算机的效率,"多任务"操作系统应运而生。"多任务"操作系统:同一时刻,能够运行多个进程,即使它的CPU只有一个核心,它对CPU的调度采用的分时复用的方式。分时复用指的是:将一个时间单位分成很多份来使用,分出来的那一份就称为时间片,那么就可以这样

假设现在有三个进程,分别是a,b,c.

第一个时间片执行a的指令,

第二个时间片执行b的指令,

第三个时间片执行c的指令,

......

当时间片一到,立马把当前进程从CPU上切走,载入下一个进程,当这个进程的时间片结束了,马上再切走......从这里也能看出,时间片指的是每个进程占用CPU的时间。

由于CPU运行的速度在我们人类看来是很快的,因此进程间的切换也会非常快,这就导致计算机上运行的多个进程"看"起来是同时允许的,没错!只是基于我们人类的感官来说,是同时进行的,但实际上并不是。

针对这种在一个CPU核心上,常用分时复用的方式,执行多个进程的方式称为"并发执行",它与上述所说的"串行执行"是相对的概念。

当然,现代计算机的核心数变多了,这就延伸出了另一个概念:在多个CPU核心上,执行多个进程的方式称为"并行执行",但是在计算机执行进程的过程中,我们并不知道它具体是并发执行还是并行执行的,因此可以笼统地叫"并发执行"。这样就能解释清楚计算机如何同时允许多个程序了。

上述讨论了操作系统如何调度CPU,接下来来讨论一下操作系统如何去管理众多的进程。

谈到管理,首先要知道我们要管理的东西到底是什么,该怎么描述它,其次去把这些描述的对象通过数据结构组织起来。操作系统使用结构体(跟java的类类似)来描述进程的,这个结构体中包含了进程的核心属性,这个结构体称为**进程控制块抽象(ProcessControlBlock),**简称PCB。那么PCB有哪些比较重要的属性呢?

1.pid(进程id),它是进程的身份识别符。

2.内存指针(它是一组指针),一个进程要在CPU上执行,就需要知道它执行的指令在哪里以及它运行所需要的资源在哪里,这些由内存指针告知。

3.文件描述表,进程在运行过程中,很多时候需要和硬盘这个硬件设备交互,而硬盘上的数据是以"文件"的形式来管理的(其实不止硬盘,操作系统也会把很多计算机资源抽象为文件管理),因此进程在读写硬盘上的数据是就需要"打开文件",而文件描述表的作用就是进程每打开一个文件,就会把这个文件的信息记录下来,表中的每一个项就代表一个打开的文件。

这三个属性是PCB中比较基础的,接下来的属性与**进程调度(操作系统在CPU上进行进程的快速切换)**息息相关。

4.进程状态,首先声明,进程有很多的状态,而现在讨论两个最典型的状态:

(1)就绪状态:指当前进程随时可以到CPU上执行。

(2)阻塞状态:指因为某些原因,当前进程不能到CPU上执行。

5.进程的优先级,指的是进程分到CPU资源的优先级,简单来说就是优先级高的进程比优先级低的进程更容易到CPU上执行。

**6.进程的上下文,我们已经知道,用于操作系统对进程的调度,当一个进程发生调度时,就意味着这个进程会暂时失去CPU资源而暂停,等到一段时间后获得CPU资源继续执行,那么当这个进程再次获得CPU资源后,它怎么知道自己上次执行到哪里了,这就需要一个角色来帮忙记录了,而这个角色就是进程的上下文。**可以简单说一下它的过程:

首先,在CPU上有很多的寄存器,当一个进程在CPU上执行时,某些寄存器会记录这个进程的"中间状态",也就类似于我们玩游戏时的存档,当这个进程失去CPU资源时,CPU会把寄存器储存的"中间状态"保存到内存中这个进程对应的进程的上下文中去,当这个进程再次获得CPU资源时,会将内存中的数据读会寄存器中,CPU在读取寄存器中的数据,就知道这个进程上一次走到哪了。

7.进程的记账信息,这个是用来统计当前进程在CPU上运行了多久,操作系统能根据这个这个属性知道哪些进程吃了较多的CPU资源,哪些很久没吃到CPU资源了,从而去合理的分配CPU资源。

到此,关于计算机是如何工作的基本原理就理清楚了,虽然说东西不深,但是对于后序学习与计算机的进程相关的知识算是一个不错的铺垫了。感谢您能阅读到这里,如果有不对的地方,还请指出!

谢谢!🌹🌹🌹

相关推荐
考虑考虑15 天前
图片居中
java·后端·java ee
云恒要逆袭22 天前
Java SE、EE、ME到底啥区别?我被这个问题困扰了一整年
java·java ee
寻见9031 个月前
Java为什么能“一次编写,到处运行”?JVM到底解决了什么核心痛点?
java·jvm·java ee
技术小白菜2 个月前
海康平台通过代理播放视频流
java·java ee
寻见9032 个月前
救命!Spring Boot 凭什么火?从道法术器讲透,新手也能一键上手
java·spring boot·java ee
狂奔小菜鸡2 个月前
Day41 | Java中的锁分类
java·后端·java ee
狂奔小菜鸡2 个月前
Day40 | Java中的ReadWriteLock读写锁
java·后端·java ee
狂奔小菜鸡2 个月前
Day39 | Java中更灵活的锁ReentrantLock
java·后端·java ee
考虑考虑2 个月前
JDK25模块导入声明
java·后端·java ee
虚拟世界3 个月前
Spring Boot 中 static 到底怎么用?一文讲清,避开90%的坑
spring boot·java ee