探秘计算机内部秘密
说起计算机,那么大家几乎都不陌生它,在日常生活中,它可是起着重要作用呢。
那么,今天小编就来献献丑,带着大家深入些了解下吧。
计算机
最初的时候,它不叫作这个名字,是叫做这个名字:ENIAC ,中文名字:电子数字积分和计算器
同时,最初的用途,更多是用于军事,比如计算弹道的轨迹的,
直到第四代超大规模集成电路计算机研制成功,即二十世纪七十年代,才开始广泛应用于民用方面。
那么,这个ENIAC 研发人员有谁呢?
这些呢,是主要的研发人员。
此时我们可以发现一个熟悉的名字,冯诺依曼
这个可是计算机之父,可谓是我们的祖师爷,学习计算机的应该都是知道他的名号
当然别忘记了,还有图灵


这为大佬,最初是一个数学家,然后也还是一个物理学家,还是一个化学家,还是一个“博弈论”之父……
所以在他身上的称呼可谓是很多的
成就也是不言而喻的,他30岁就成为了普林斯顿大学的终身教授,这个是非常厉害的。
说个题外话,除此参与计算机的研发,还参与了曼哈顿计划,同时是奥本海默的技术顾问。
这个曼哈顿计划,就是美国当时进行原子弹研制的而设立,最后研制出的两颗原子弹,绽放在了日本长崎和广岛
当时的计算机内部构造,可谓是大同小异,而整体的规则,是由这位大佬,提出的结构——
冯诺依曼结构
学过计算机导论的,应该是知道这个结构的
这个结构影响可谓是深远,直到现在大多数计算机也是沿用着!
那么这个结构可以用这张图来表示

说明了,
一个计算机有着CPU、输入/输出设备、存储器。
那么这个存储器,一般有着内存和外存之分
内存:存储空间小、成本较高、运算速度较快、断电后数据丢失
外存:存储空间大、成本较低、运算速度较慢、断电后数据仍然保存
还有这个CPU
这个可谓是人类科技巅峰之作之一呢
那么介绍这个CPU呢
这里介绍下其几个核心的特征
1.核心数
在电脑上任务管理器可以直观看出这个

一般认为,有几个方框,就有几个核心
每个核心,都能单独承担计算任务
所以,多核心,其计算效率是非常高的
那么最初的时候,计算机只有一个核心,
后面发展为双核心,其真正意义上双核心电脑,即为2005由Intel发布的
再后来就发布了四核心,
后来更不满足了,由intel引入的超线程技术,即一个人干二个人的活,
即四核心八线程,就像是我刚刚给的内核是6,通过超线程,变成了12线程
大大提高了计算工作效率,多出来的那四个或六个核心是为虚拟核心,是在逻辑上增加了数量
物理上可没有
2.频率
刚刚给的截图中

这里呢,代表的是频率了,所谓的频率是代表着CPU的运算速度
那么这里的2.10GHz,表示每秒中的周期性变化次数,一秒运算21亿次
可以简单理解为一秒执行多少个指令。
当然,这些频率是可变的,随着任务量的提升,频率变高,但是CPU中的温度会升高,
难么此时,这个温度升高不能无节制,所以计算机一般设置一个“温度墙”,当超出这个限制
那么开始降频
所以呢,做好一些散热工作,可以让频率达到一个更好水准的。
那么刚刚讲到一个指令
指令是什么呢?
指令是指我们的汇编语言,就是说可以指定让CPU干活的,
而且这个指令还是CPU完成的任务的基本单位。
值得注意的是,
不同的CPU,支持的指令是不一样的,
比如现在我们常见的有x86、x64、arm类型的CPU,其指令是不兼容。
总结起来,就是衡量一个CPU是否厉害,那么一般看频率是否足够高和其核心足够多
那么这个CPU外部一两点,参数讲到这了。
那么讲讲内部的吧,CPU内部有关键这几个算术逻辑单元、控制单元、寄存器、缓存、总线接口
,当然或许还有一些其他的配置
那么就讲讲这个寄存器吧
CPU寄存器
那么在电脑中,存储数据一般靠内存和硬盘
而在CPU运算中,是从内存把数据读到CPU中,才能进行运算。
而读到CPU中的数据,就是用这个寄存器进行保存的。
那么这个寄存器呢,
内存比内存更小,往往只有几个kb
速度比内存更快、成本也更高、断电之后依然会丢失数据
那么这里说个题外话,刚刚说了,CPU要进行计算,先把数据从内存中读取到CPU,那么频繁进行读取,对效率其实是有一定的影响的
那么此时,现代CPU引入这样的一个新角色——缓存
那么什么又是缓存呢?
在我们之前给的CPU截图中也有展现

可以看到这里有三个等级,L1、L2、L3
那么它们的速度从上往下降低,容量从下往下增高
那么这个寄存器就讲到这里咯
接下来详细讲讲刚刚CPU涉及到的指令
指令
之前说到,这个指令是CPU完成任务的基本单位
而这个CPU指令,不是我们写程序随随便便能够修改的
而是在设计这个CPU的时候,就已经给写死了
那么接下来看看这个表格
这个表格是通用CPU的一些基本指令

图中的RAM指的是随机访问存储器,即RAM内存
这里 有些点是值得注意的
LOAD_A中的A存取器,这里是个代称,真实表述的名称,可能会有一些:eax、ebx、esp……
ADD中的2位寄存器ID
这里约定一下A的寄存器是00
B的寄存器为01
下面就开始举个例子来说明下
但是此前要说明下,真实的CPU指令表,复杂很多
以下作为一个简写版指令
其中,假设指令为8bit
那么前四位就代表着操作码,即告诉这个指令是干啥的
后四位是操作数,就像是一个参数
可以理解为,一个函数,函数中带着一个参数

这里是给定一个例子
这里要值得说明的是,CPU中存在这个特殊的寄存器——程序计数器
起初设置为0,意思就是说,从内存地址为0的地方开始执行这个指令
随着指令执行完成,那么就开始自动+1,这是默认情况下的
当然如若遇到跳转语句(if、while、for、函数调用……)
那么就会被设置为其他的值
那么指令执行流程是什么呢?
分为重要的三步:
1.获取指令:从CPU内存中读取指令内容到CPU内部(注意,这里有指令寄存器(IR)来存储这个指令
2.解析指令:识别出这个指令是干什么的,以及对应的功能和操作数
3.执行指令
以下面这图片进行讲解



看起来是挺费劲的,但是由于CPU执行太快,所以人是感觉不到有什么的!
ok,一些细分的东西讲到这,那么往大的方向讲讲吧
操作系统 (Operating System)
简称OS,这是一种系统软件,它是管理计算机硬件和软件资源,为应用程序提供基础服务。
其负责协调和管理计算机的所有活动,包括进程管理、文件系统、内存管理、设备控制等等。
那么常见一些操作系统有Linux、Windows、MacOs
那么作为以后程序员多打交道的,进程管理少不了它。所以来讲讲这个吧
进程管理
在我们电脑上很容易看出这里的进程,就在任务管理器中

这里的进程呢,就是正在执行的应用程序,
那么应用程序一般处于两种状态:
1.不运行的时候,是一个exe文件,在硬盘上
2.运行的时候,那么exe加载到内存,然后CPU执行这里面的指令
值得注意的是

即使我们不开任何软件,那么系统中也会存在很多进程,这些进程是为保证系统正常运行的。
那么可以看到上面这里

这里呢,当执行这些exe程序,那么就会消耗掉硬件资源,那么这些硬件资源分配给了进程,
由此可以说是,进程是操作系统分配资源基本单位
那么这些进程这么多,是需要管理的,那么怎么来管理呢?
1.描述 通过一个结构体/类,把进程的各种属性描述出来
值得注意的是,macOS中也是通过这样的方式来描述的
但是呢,Linux有点不同,是通过一个PCB(进程控制块)来描述的
这个PCB是一种数据结构,用来存储与进程管理有关的各种信息。
2.组织 通过数据结构来,把上面的结构体串起来,再进行增删改查
那么这里的数据结构,可以理解为学习过的链表,这里是个简单理解
实际上,比如windows中通过这些来描述的EPROCESS数据结构、ETHREAD数据结构和KTHREAD数据结构……较为复杂
那么刚刚讲到这个PCB,是一个非常复杂的东西来的,里面包含了很多属性。
那么这里小编挑一些关键的东西来分享
1.PID 进程的标识符
这个标识符是唯一的!
那么在任务管理器中,也可以看到的

2.内存指针
描述进程依赖的指令和数据在内存的哪个区域
比如操作系统运行exe程序,那么就会读取exe中的指令和数据,加载到内存中
3.文件描述表
这里通常是一个数组,细致一点就是一个指针数组
它是用来描述进程打开了哪些文件
如若我们运行哪个文件,这里顺序表就会添加一项
当然这里数组长度是有限制的,但是在日常使用中一般不会超出这个数组长度
4.进程状态
讲这个之前,来穿插一些另外的知识
在我们电脑中,有很多进程,那么这些进程很多都要执行,
但是这台电脑是6核12线程,(即6个物理核心、12个逻辑核心)
即使是12个核心全部开始干活了,那么其他进程咋办呢?
这时候,我们就要用到了进程调度中的“分时复用”
这个分时复用指的是操作系统中一种重要的资源管理策略,它允许多个进程共享CPU时间,使得每个进程都能在一段时间内得到执行。
这种机制是快速切换进程来实现的,让用户感觉到是,一起运行多个程序那样子。
比如,有进程1、进程2、进程3
CPU一会运行进程1、一会运行进程2、一会运行进程3
此时CPU内部运行很快,人感觉不到
所以站在宏观角度来说,这个呢,就称为“并发执行”
并发执行:它指的是在同一时间段内处理多个任务或进程
当然,要是出现了多个核心,然后几个核心一起干活
那么此时站在微观角度来说,这个就称为“并行执行”
并行执行:它指的是在同一时刻同时执行多个任务或进程
那么回到这个进程状态
进程状态:是操作系统中描述进程生命周期
那么由分为很多状态:
1.创建状态
当一个进程正在被创建,处于创建状态。此时,进程正在被分配必要的资源,如内存空间、打开文件……。资源分配完毕后,进入就绪状态。
2.就绪状态
当进程已经分配了所有必要的资源,并且已经准备好执行的时候,处于就绪状态
3.运行状态
当进程获得CPU时间片并开始执行指令的时候,处于运行状态
4.阻塞状态
当进程需要等待某些事件(I/O操作完成)、信号到达等等才能继续执行,那么处于阻塞状态
5.终止状态
当进程完成其任务,或者被某种原因强行终止时,就会进入终止状态。此阶段,进程会被系统释放资源,并从系统中移除
5.进程的优先级
进程优先级:是操作系统用来确定进程调度顺序一个关键因素。
简单来说,就是谁先来、谁后来、谁资源多、谁资源少
6.进程的上下文
进程上下文:是操作系统用来确定进程执行状态的关键信息
上面讲到的分时复用中
一个进程执行一会后,就要从CPU调度走,那么过一会后,CPU又调度回来,按照上次的结果继续执行,此时就是需要这个进程的上下文
那么当中呢,CPU寄存器,比如通用寄存器、指令寄存器、程序计数器、状态寄存器、栈指针
这些主要的寄存器会保存好调度前的信息。
7.进程中的记账信息
进程中的记账信息:是操作系统用来跟踪和管理进程执行状态、资源使用情况以及性能评估的重要数据
在优先级的加持下,使得进程之间获得系统资源差异逐渐变大,
此时呢,系统会根据这个CPU中进程的运行时间,适当调整当前的调度策略
比如,进程A资源变多,进程B的资源变得很少了
此时下次调度,就可能会把进程B资源调度回来,使其获得更多的系统资源
那么讲到这里,进程就大概分享到这
接下来还有这这个内存分配、和进程间通信
内存分配:
操作系统对其分配采用了一种空间模式
即不同进程使用内存中的不同区域,互相之间不会干扰
这个内存分配过程是一个复杂且精细的
比如采用了,以下操作(以Windows为例)
1.虚拟内存管理
2.内存分配策略
3.内存保护与安全
4.缓存管理
5.内存分配API
…………
进程间的通信
那么上诉讲到进程是系统分配资源的基本单位,这意味着,各个进程不会感受到彼此的存在
这样使得进程间具有一定的“隔离性”
那么当代应用中,要完成一个复杂的需求,单靠一个进程往往是不可以完成的,总是需要各个进程间进行相互配合,
此时进程间就要进行“信息交换”,此时进程间的通信就应运而生了
那么目前来说,进程间通信有以下这几种机制:
1.管道
2.共享内存
3.文件
4.网络
5.信号量
6.信号
而其中,网络往往是java程序中打交道较多的一个地方,同时这个网络还是一种特殊的IPC机制
它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机的进程间通信。
这里IPC机制是进程间通信(Inter-Process Communication)的缩写,它是指多个进程之间进行数据交换和信息传递的方式。
讲到这里,那么小编就分享完毕了!