【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 的时间能够去做一些其他的工作, 也需要用到并发编程.

🎈线程和进程的区别

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

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

相关推荐
yang-23071 分钟前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
沉登c2 分钟前
幂等性接口实现
java·rpc
代码之光_198013 分钟前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
科技资讯早知道1 小时前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
小比卡丘2 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
xmh-sxh-13142 小时前
java 数据存储方式
java
liu_chunhai2 小时前
设计模式(3)builder
java·开发语言·设计模式
ya888g3 小时前
GESP C++四级样题卷
java·c++·算法
【D'accumulation】3 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
小叶学C++3 小时前
【C++】类与对象(下)
java·开发语言·c++