【JavaEE初阶系列】——计算机是如何工作的

目录

🎈冯诺依曼体系

❗外存和内存的概念

❗CPU中央处理器---人类当今科技领域巅峰之作之一

🚩如何衡量cpu

🚩指令(Instruction)

[🎈操作系统(Operating System)](#🎈操作系统(Operating System))

🎈什么是进程/任务(Process/Task)

[❗进程控制块抽象(PCB Process Control Block)](#❗进程控制块抽象(PCB Process Control Block))

🎈虚拟地址空间

🎈线程

❗为啥要有线程

🎈线程和进程的区别


🎈冯诺依曼体系

说到计算机,我们要认识一个计算机的祖师爷,那就是冯诺依曼。

著名的**冯诺依曼体系(Von Neumann Architecture)**构成了计算机工作的原理。
现代的计算机 , 大多遵守 冯诺依曼体系结构

  • CPU 中央处理器: 进行算术运算和逻辑判断.
  • 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
  • 输入设备: 用户给计算机发号施令的设备.
  • 输出设备: 计算机个用户汇报结果的设备.
    我之前的有个文章 冯诺依曼体系结构 具体详细点开链接。

关于冯诺依曼,要强调的几点:
这里的 存储器指的是内存, 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备),外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话, 输入输出设备都只能直接和内存打交道(cpu不能直接访问到外设)
cpu速度>存储器速度> 外设速度(为什么有内存的原因)

  • CPU的运算速度是非常快的,要远大于外设,那么我们进行输入之后,CPU很快就将问题给解决了,然后传递给输出设备,这个时候又有数据从输入设备进行输出,CPU解决之后,上一次的数据输出设备还没有输出完毕。所以就需要一个速度不是特别快,也不是特别慢的中间物质来进行一个存储。就跟木桶原理很相似
  • 这个桶能装多少水,取决于最低的那个木板,因为外设的速度将问题输入之后,由存储器来获取内存,然后CPU从存储器中获取要处理的数据,处理完成之后,将数据返回给存储器,再由外设接收,这样,无论什么时候,CPU只从存储器中获取数据,这样就能大大的提高计算机的效率。

我们可以理解为:内存的引入就是为了解决CPU和外设速度不匹配的问题。

针对存储空间
硬盘 > 内存 >> CPU
针对数据访问速度
CPU >> 内存 > 硬盘

❗外存和内存的概念

其实我们之前所说的内存其实是外存,只是外存和内存被人统一说成内存了,除了特殊情况下,被说成外存。

外存其实就是冯诺依曼体系结构中的 输入和输出设备。而内存则是存储器。

  • 与cpu的关系不同: 在电脑中,CPU负责运算和处理,内存负责数据交换。两者属于协作关系,内存相当于是CPU的数据存取通道。而外存要与CPU或I/O设备进行数据传输,必须通过内存进行。
  • 易失性不同:内存,是具有易失性的。这意味着当系统断电时,数据就会丢失。外部存储是非易失性的,因此即使没有电源,它也能保存数据(磁盘中的所有东西不会因为我关机了就会消失,而是永久存在,除非你删了);
  • 访问权限不同,CPU只能直接访问内存,外存的东西要先到内存CPU才能处理(这就是符合冯诺依曼体系结构,内存解决了cpu和外设速度不匹配的问题)


❗CPU中央处理器---人类当今科技领域巅峰之作之一

中央处理器(Central Processing Unit,简称CPU)作为 计算机系统运算和控制核心,是 信息处理、程序运行的最终 执行单元。CPU自产生以来,在 逻辑结构运行效率以及功能外延上取得了巨大发展。
一个计算机能否工作,很大一部分是由cpu决定的。这样看来,cpu在电脑工作上起了很大的作用。


🚩如何衡量cpu

衡量cpu有很多指标。最最关注的指标有俩个:主频和核心数

就拿我的电脑的中央处理器做比例吧



🚩指令(Instruction)

我们上面谈到了cpu的俩个重要指标,主频,2.5GHZ主频,就相当于cpu能在1s内可以执行25亿指令。

cpu上能够执行的任务的最小单位

一个cpu设计的时候,就会提供一些可以进行的操作(执行哪些指令)比如:加法指令,读取内存指令。写入内存指令,条件判断/跳转指令,函数调用指令,堆栈操作指令.......

这些最小单元,都是由二进制的方式来表示的机器语言。(不同的cpu支持的指令/机器语言是不相同的)

其实cpu就是一个憨憨吧,你给他发布一个任务,就需要你把任务分成非常非常细致的每个部分,才能让他执行。就比如我让张老师给我做西红柿炒鸡蛋,放进计算机中编程思维就是,cpu,你要准备菜西红柿和鸡蛋,然后你要去洗菜,然后洗锅,然后你插电,放油.....等等一步一步的操作进行。


🎈操作系统(Operating System)

操作系统是一组做计算机资源管理的软件 的统称。目前常见的操作系统有: Windows 系列、 Unix 系列、 Linux系列、 OSX 系列、 Android 系列、 iOS 系列、鸿蒙等

本质上就是用来搞管理的软件

  • 操作系统帮助用户,管理好下面的软硬件资源(手段) (对下)
  • 为用户程序(应用程序)提供一个良好(稳定,高效,安全)的执行环境(目的) (对上)

🎈什么是进程/任务(Process/Task)

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程; 同时,在操作系统内部, 进程又是操作系统进行资源分配的基本单位。

一个跑起来的程序就是进程

程序:是应用程序,没有点开运行的就是程序

进程:一个跑起来的程序就是进程

一个电脑一开机就有百八十个进程正在运行,有的是系统自己创建的,有的是自己手动的,每个进程要想执行都需要消耗一定的资源(进程是资源分配的基本单位),就比如疫情封城,小区发菜,以政府为单位发菜,然后发给小区,然后发给家庭。都是资源分配。

那我们有没有想过一个问题,进程是如何管理的呢?

管理有俩个角度:

  • 描述 使用类/结构体,把被管理的一个对象,各个属性都表示除了
  • 组织 使用数据结构,把这些表示出来的对象,串起来(为了后续的增删查改)

系统中专门有一个结构体(操作系统内核是c/c++)描述进程的属性。

这个结构体统称为 PCB(进程控制块)


❗进程控制块抽象(PCB Process Control Block)

  • 人是通过属性认识的,当属性足够多,这一对属性的集合就是目标对象
  • 描述进程------多个属性合起来

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中, 我们可以通过类/ 对象来描述这一特征。

复制代码
// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
    // 进程的唯一标识 ------ pid;
    // 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
   // 分配给该资源使用的各个资源
    // 进度调度信息(留待下面讲解)
}
  • 每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。进程里面有很多属性,一个进程可以有一个PCB或者多个PCB。
  • 操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
  • 创建进程,就是再创建PCB,并且将PCB插入到链表中,销毁进程,就是将PCB从链表中删除并释放,展示进程列表,就相当于遍历链表的每个节点。

想要进一步了解进程的明确特征,就要讨论一下PCB里面的属性。

pcb是一个庞大的结构体,包含了很多的属性,

  • 1.pid(进程标识符)

进程身份标识 每个进程都会有一个pid,同一时刻,不同进程的pid是不同的。

  • 2.内存指针:(进程持有的内存资源)

每个进程在运行的时候,都会分配一定的空间

  • 3.文件描述符表(进程持有的硬盘资源)

.....pcb还引入了一些属性,用来支持操作系统实现进程调度的效果。为什么需要进程调度呢?因为
一个电脑进程太多,cpu核心数太少(狼多,肉少),就需要让这些进程轮番在cpu上执行,只要轮转的速度足够快,宏观上(用户眼中),看起来就是这些进程是"同时"执行。------并发。

  • 1.进程的状态

就绪状态:随叫随到,呼之即来,挥之汲去。

就绪状态分俩种情况:第一种情况是进程正在cpu上执行,第二种情况是进程没在cpu上执行,但是时刻准备着去cpu上执行。

阻塞状态: 某个进程,某种执行条件不具备(例如进程等待用户输入),就导致这个进程暂时无法参与cpu的调度执行。(比如命令行让你输入密码,你一直不输入,那么就说明处于 阻塞状态)

  • 2.进程的优先级

操作系统在调度多个进程的时候并非一视同仁的,有些进程会给更高的优先级,优先调度。电脑同时运行dota2(优先级更高)和qq(更低),后收到信息。

  • 3.进程的上下文

进程从cpu离开之前,需要保存现场,把当前cpu中各种寄存器的状态,都记录到内存中。等到下次进程回到cpu上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去,进程就会沿着上次执行的位置,继续往后执行。(我们手机上的计算器,我们将计算器进程从后台清除后,我们下次再打开计算器的时候,我们发现还是会保留原来的值,这就是上下文的运用)------存档,读档。

  • 4.进程的记账信息

通过优先级机制,对不同的进程分配了不同权重的资源,有可能会出现极端的情况,所有资源都给某个进程,其他进程一点都没捞着。记账信息会记录当前进程持有的cpu情况(再cpu执行了多久)就可以作为操作系统调度进程的参考依据

比如我们有三个好朋友,但是一个星期,一周四天都和朋友A玩,俩天都和朋友B玩,1天就呆在家里,那么朋友C怎么办,这样长期下去C对我的热情就会降低,就会和他自己的好朋友玩耍,所以我们要适当的安排点时间给朋友C。


🎈虚拟地址空间

比如说进程A和进程B分别分配了固定的内存大小,但是B进程越界访问了A进行的内存,把A内存写坏了(写成错误的值了),A进程就可能崩溃了。
操作系统的作用就来了,操作系统要给进程提供稳定的运行环境。
所以操作系统就引入了"虚拟地址空间"概念,不是直接分配物理内存了,而是分配虚拟的内存空间。

A操作某个内存中的数据,就需要把操作的虚拟地址给操作系统,操作系统再把虚拟地址翻译程物理地址(有一个类似于hash表这样的映射结构)在操作物理地址。
操作系统其实就是用来检查/检验了,就需要看看当前的虚拟地址是否能顺利完成翻译,如果给定的虚拟地址是非法的,是一个越界访问,系统就能及时发现,并且对当前进程进行处理,就不会波及其他的进程。
通过上述方式,我们把进程之间隔离开了,如果某个需求中,确实就需要让多个进程相互配合,此时就不好搞了,此时就需要引入新的机制,来实现进程之间的通信。具体的实现方式有很多,但是每个方式的核心思想都是一样的。 都是需要借助一个公共的空间,完成数据的交互。
就比如给菜谱老板,发个微信,写上要买啥,老板直接把菜送到小区门口,可以放到保安厅里,我也就可以从保安停拿到菜。


🎈线程

一个进程包含一个或多个线程。前面谈到进程调度,前面的讨论都是基于"一个进程里只有一个线程"的情况,实际上,一个进程中是可以有多个线程的,每个线程都是 可以独立进行调度的。
每个线程也有状态,优先级,上下文,记账信息....
一个进程使用pcb来表示,一个进程可能使用一个pcb表示,也可能使用多个pcb表示。每个pcb对应到一个线程上,每个线程都有这些信息用来辅助调度 。除此之外,前面谈到了pid,是相同的,内存指针,文件描述符表也是共用同一份的。

所以衍生的 线程的特点:

  • 1.每个进程都可以独立的去cpu上调度执行
  • 2.同一个进程的多个线程之间,共用同一份内存空间和文件资源。(创建线程的时候,不需要重新申请资源了,直接复用之前已经分配好的进程资源,省去了资源分配的开销,于是创建的效率更高了)

    所以 线程是调度执行的基本单位

因为量多,所以一个生产线是不够的,我们的方案一就是再建个院子,然后再院子里创建一个生产线,但是把,再建个院子成本比较高,物流线也是需要成本的。

所以我们就可以再同一个院子里再建立一个生产线,这俩个生产线是独立的,各自都能进行生产, 这俩个生产线公用的是一个院子,共用的是一组工人,共用的是一套物流体系,此时我们就可以提高生产力。所以引申到进程中,当我们刚创建一个线程的时候,相当于是和进程一起创建的,还是需要有一定的开销去申请资源的(这个帐是记在进程头上的)后面再创建进程,开销就省下了,因为每个线程是独立的,但是共用同一份资源。


❗为啥要有线程

  • 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
  • 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程.

🎈线程和进程的区别

  • 进程包含一个线程,也可以包含多个线程。
  • 进程和线程,都是用来实现并发编程场景的,但是线程比进程更轻量,更高效。
  • 同一个进程的线程之间,共用同一份的资源(内存+硬盘),省去了申请资源的开销
  • 进程和进程之间,是具有独立性,一个进程挂了,不会影响别人。
  • 线程和线程之间(前提是同一个进程内),是可能会相互影响的。(线程安全问题+线程出现异常)
  • 进程是资源分配的基本单位,线程是调度执行的基本单位。

今天发烧了。也得完成任务。

相关推荐
ForgeAI码匠12 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端
tongluowan00712 小时前
Redisson的参数及工作原理
java·redis·lua·分布式锁
仙俊红13 小时前
Integer\int对比,equals()\hashcode面试
java·面试·职场和发展
WiChP13 小时前
【V0.1B10】从零开始的2D游戏引擎开发之路
java·数据库·游戏引擎
云烟成雨TD13 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
ForgeAI码匠13 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
z落落13 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#
Access开发易登软件14 小时前
Access 和 SQLite,根本不在一个赛道上
java·jvm·数据库·sqlite·excel·vba·access开发
小马爱打代码14 小时前
Spring源码 第十篇:Spring 5 源码深度拆解 - Spring 类型转换与校验体系
java·spring
长谷深风11114 小时前
Java 面试高频:反射机制与异常体系全面解析
java·开发语言·面试·exception·java 反射·java 异常·class 对象