本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
一段小诗送给小伙伴
晨光破晓露微凉,
轻风拂面带花香。
远山如黛映天际,
新日初升照四方。
心怀希望踏征途,
梦想翱翔展翅扬。
岁月悠悠情不老,
开篇诗语寄华章。
前言
计算机在普通人眼中可能就是大家俗称的计算器,但这不完全对的。
实际上我们的计算机不仅有 计算器的算术
功能,而且还有 逻辑运算 功能。
在本专栏中,小编将开始带着小伙伴们学习重要的 计算机基础 的, 内核的 体系结构
,架构
,运行原理
,工作机制
等等...
本篇的内容的大体上掌握基本的计算机的总体的框架。
目录
-
冯诺依曼体系
-
CPU的重点知识
-
CPU执行指令的流程
-
操作系统的核心概念
-
进程的概念
-
进程的调度
一. 冯诺依曼体系
1. 冯诺依曼
冯诺依曼大佬是一名数学家,物理学家,化学家,哲学家。
话说, 冯大佬在一次做火车的过程中,偶然听了几位年轻人正在讨论能够用来算术运算和逻辑运算的的一种机器, 后来得知这几位年轻人是普林斯顿大学的研究员, 冯大佬就对这种机器产生了兴趣, 就答应他们过几日去普林斯顿去研究
于是过几日大佬来到了普林斯顿,和研究员一起研究了好几日,在此期间就提出了冯诺依曼的计算机体系结构
即:== 控制器->计算器->输入设备->存储设备 ->输出设备 ==
而我们当下谈的最多的 CPU
其实就是 控制器和计算器 的集成。
自此冯诺依曼体系成为了当前计算机最主流的计算机体系,并且冯诺依曼成为了计算机创始人之一。
和图灵在理论上创建的计算机模型的贡献,共同称为计算机的开山鼻祖。
2. 冯诺依曼体系
我们知道冯诺依曼体系的核心就是
-
输入设备
-
输出设备
-
存储器
-
CPU
<1>. 输入设备
输入设备一般是外部用户对计算机内部进行 数据的传入
,和 计算机进行交互 。
像我们常见的输入设备一般就是: 键盘,鼠标等...
<2>. 输出设备
输出设备一般是计算机内部 对外进行输出
,把用户需要的信息提供给 用户和计算机 进行交互
<3>. 存储器
存储器一般分为两种,而且特别各不相同
-
内存: 存储空间小, 运行速度快,成本高,掉电时数据丢失
-
外存: 存储空间大,运行速度慢,成本低, 掉电时数据不丢失
常见的外存有: 硬盘,光盘, 软盘,U盘
鱼式疯言
我们常用的32GB大小的 "内存" 等... 其实是我们的 外存
,小伙伴们可千万不要喊错了
我们常见的内存: 5GB
,8GB
等... 很小的空间。
<4>. CPU
CPU称为计算机中央处理器,相当于计算机的 "大脑" ,是一个计算机最核心的部分,用于算术运算和逻辑运算。
可以那么说:CPU和氢弹是人类科技的巅峰之作
能制作氢弹(五常)
能制作CPU(不多于五个国家)
如今市面上CPU做的很精密的厂商
- 英特尔: 桌面端: 酷睿,服务器:志强
- AMD:桌面端:锐龙,服务器: 霄龙
- 高通(手机版的晓龙)
3. CPU 的架构
主要的架构有:
- x86/x64 架构:用于桌面端和服务器使用
像 80286,80386,80486都为x86架构
像 amd64 就是x64架构。
-
arm架构: 用于移动端和嵌入式
-
RISC-V架构: 一套开源的CPU指令集合。
二. CPU的重点知识
1. CPU的核心数
最开始的CPU的只有一个核心,相当于CPU中只有一个人在干活
后来人们想CPU越来越快,单核心上的技术已经很难再提升,
那么横向不行,我们就 纵向发展 ,于是我们就利用了 多核心
,利用超 线程的技术 加快CPU 的速度
为了更好的加快CPU的速度,人们又让 一个核心干两个人 的,比如八核心就是十六线程,三十二核心就是六十四线程,从而开启了 并发编程
。
鱼式疯言
对于我们程序猿来说, CPU的多核心,每个核心的双线程,这些对于多线程编程是至关重要的,也是影响重大的。
程序猿需要把 任务拆解成多个,使用不同的核心分别执行 。
所以小伙伴们一定要对这部分知识有个基本都认知。
2.CPU的频率
CPU的频率决定着CPU的速度
例如: 2.90 HZ
就意味着一秒执行 29亿次~~
所以 CPU的速度 可以用 频率
来判断,CPU会根据 任务量多少 来对 频率
进行 动态调整。
任务量越多 ,CPU
就会自动 加快频率 , 耗电量加快
,产热增加
。
但 CPU
有一个 能耗墙
,当温度达到 105度
时,就会达到一个峰值,CPU就会自动 降低频率 , 降低耗电量
。
鱼式疯言
-
如果小伙伴要加快CPU的频率 ,就需要加强散热效果,可以让CPU的频率达到更高的水平=》超频
-
衡量一个CPU的是否牛逼:主要就看 核心数和频率 。
三. CPU执行指令的流程
1. 指令
指令是什么?
当我们敲下C / java / C++ 的编程语言,就会转化成 CPU的二进制指令
指令就是让 CPU干活
, 给 计算机完成任务 的基本单位。
并且CPU中有两个东西:寄存器和缓存
寄存器是CPU中一种 内存极小
,运行 速度极快
,成本很高
, 掉电后数据丢失
的 存储数据的部分
当CPU中进行运算时,就需要不断和 寄存器读取数据 ,就会 影响速度
。
这时我们就借助 缓存
这种东西
利用缓存就可以让CPU从高效的从缓存中读取数据
当数据量很少时,就用上面的L1缓存
当 数据量很多 时,就用上面的L3缓存
鱼式疯言
缓存的利用
空间更大
,CPU的工作 效率越高 。
当作为普通的Java程序员, 我们就需要 缓存和寄存器 是一个 整体 ,都可以叫做寄存器。
2. 工作原理
计算机指令工作过程中,取指令,解析指令,执行指令 三个步骤
其中解析指令就需要用上面的指令表,具体执行过程小编 一 一分解哦
<1>. 获取指令
取指令: CPU从内存中 读取数据 到CPU的内部(有专门的 寄存器 读取指令,不是说上面的 a,b寄存器
)
<2>. 解析指令
识别出这个指令
是干啥的,以及对应的 功能和操作数 。
下面小编会 一 一 分析
<3>. 执行指令
根据对应的功能和指令
进行执行
3. 实际运用
CPU中存在一种特殊的 寄存器"程序计数器" , 保存着从 哪个内存位置 开始进行读取指令。
我们C/java/C++
写出的程序会生成.exe 可执行程序文件
。
这个可执行程序文件
包含这个程序的所需要 依赖的数据和二进制指令 。
当我们双击. exe
文件,操作系统就会加载到 内存中 。 程序计算器会被 操作系统 的自动设置好初始值为 0
。
随着程序的 不断执行 ,程序计算器就会 不断的更新
, 默认情况下程序计算器
就会 +1 自增, 除非程序中遇到goto
,break
,if
,while
的语句就会有可能进行跳跃自增或自减
, 设置为其他值。
程序计算器 默认从0
开始,所以小编在这里举例
第一步: 读取指令
读取指令 : 00101110
第二步: 解析指令
0010
是操作码, 1110
操作数。
去指令表中查看,看这个操作码是啥意思
这个指令是 LOAD A 指令 ,并且后面的1110 表示了一个 内存地址
这个指令的工作,就是把 1110(14) 这个 地址的数据
,读取到 寄存器 A 中
第三步: 执行指令
把14
的地址的内存数据 读出来,放到 寄存器A
中
第一条指令执行完毕,系统会自动把 程序计数器的值++
从0 -> 1
鱼式疯言
像上面这样读取指令,解析指令,执行指令 进行 循环往复
,最终执行完我们需要执行的 程序的结果 。
四. 操作系统的核心概念
操作系统核心的两个重要的内核就是:
- 管理外部的 硬件设备 :
比如给计算机外部接入 很多设备 例如: 扫码枪,医疗设备, 声波监测枪。- 给软件提供良好的运行环境 :
当 一个应用程序执行时 , 他会独立运行
, 即使一个应用程序出现BUG
,也 不会影响 其他的 应用程序的运行 。
故: 操作系统 = 内核 + 应用程序
那么问题来了, 操作系统该怎么 控制硬件设备
本质上 操作系统 不是直接
控制硬件设备
的,而是通过硬件厂商
提供的 驱动程序 来间接的控制 硬件设备 。
鱼式疯言
小伙伴们可以从学校的角度这样理解
校长(操作系统 )-> 辅导员(驱动程序 ) -> 学生(硬件设备)
一. 常见的操作系统
- linux操作系统
linux官方正确发言: 里那克斯
- window操作系统
桌面端 最主流的操作系统
,生态好 。
- Mac OS (富哥专属)
苹果电脑内置的操作系统系统:
优势:
-
续航时间长
-
装X
-
不能打游戏
- Android
手机移动端 内置的操作系统, 是基于
linux演化
出来的一款操作系统,因为年代久远 , 所以差别很大
了。
- IOS
OS 操作系统
是苹果手机和平板的操作系统,和 Mac OS 是两套不同的操作系统。
五. 进程的概念
1. 进程的认识
进程是什么?
进程 换言之就是 任务
,操作系统的应用程序有两种状态:
- 应用程序 没有运行 时, 就在的硬盘上
躺着
- 运行时,就会加载到 内存中 ,
CPU
就会执行 应用程序上的指令 。
所以进程就是本质上就是: 正在运行的应用程序 。
鱼式疯言
进程的执行同时也是需要利用硬件资源的, 故我们常称为
进程 就是操作系统 分配资源 的
基本单元
。
2. 进程的描述
通过 结构体/ 类 把进程各种属性进行表示, 主流的系统是通过C/ C++ 中的结构体进行表示
像 linux
操作系统, 是通过 "PCB(进程控制块)" 这样的 结构体来描述进程的信息 。
PCB都有啥属性呢?其实本质上 PCB 有 很多复杂的属性,这里小编主要讲解常见重要的属性
1. PID:进程的标识符
同一个进程的 标识符是相同的 ,不同的进程 标识符是不同的
, 所以 PID
是作为 进程命名的唯一的标识 。
2. 内存指针
描述 进程
依赖数据和内存
存放在哪个区域,操作系统 就在执行 .exe 文件 ,就会读取 .exe文件中的指令和数据 , 从而加载到内存中(内存地址)
。
3. 文件描述符表 (数组 / 顺序表)
描述进程打开了 哪个文件
鱼式疯言
从而进一步显示了:
进程中的内存指针是在 内存上执行的 ,需要消耗内存资源。
文件描述符表是在 硬盘中执行的 , 需要消耗硬盘资源。
3. 进程的组织
进程的组织,必然是要用到我们前期学过的数据结构来进行增删改查
。
所以我们可以简单的认为
PCB
是通过 链表 对多个 结构体进行连接 。
所以我们的进行进程的操作
创建新的进程()
-> 在链表中添加该节点
销毁进程
-> 在链表中删除该节点
显示进程信息
-> 在链表中遍历这个进程,显示对应信息。
六. 进程的调度
1. 进程的调度理解
进程的调度和我们日常的开发 是息息相关的
在以前的CPU中,只是
单核心
,不能进行多进程
而现在的CPU中,是多核心
, 能 允许多进程。
但 无论是单核心还是多核心 ,都能进行多个进程的运行
这是为什么呢?
因为 CPU在进行进程时 ,采用的分时调用的的方式,一会执行
这个进程
, 一会执行另外一个进程
,由于 CPU的运行速度非常快 ,所以我们肉眼是无法看出的
,我们称为 并发执行 。
并且不同的核心之间也能只能执行不同的进程
, 并行执行 。
而我们把 并发和并行 执行的方式成为 并发编程 。
2. 进程的状态
在进程中主要分为两种状态
进程中将要 执行任务
的状态, 为 就绪状态 。
进程中 暂停任务
的状态, 为 堵塞状态。
鱼式疯言
栗子理解 :
我们 平常运行的程序 一般都是 就绪状态
而像我们C / Java
中的scanf 或 Scanner
中,需要用户从 控制台输入数据 ,程序就会暂停 ,只有用户输入结束后 ,就会继续执行程序, 这就是堵塞状态
。
3. 进程的优先级
进程的优先级主要考虑的任务的重要程度,就好比现在让小伙伴有两件时 看电影和去面试,必然是先去面试,那么我们的进程的优先级也是同样的结果,会优先考虑重要的任务优先执行。
4. 进程的上下文
由于我们的进程的
分时复用
, 当 一个进程接连这另外一个进程执行 时,当下次再次执行到 同一个进程 ,会继续执行上次没有执行完的任务 ,不会发生 错乱执行的问题 ,实现 进程上下文的联系
5. 进程的记账信息
进程的不同任务所分配的 运行时间不同 ,当一个任务分配的
时间很短
不够执行时, 操作系统就会 手动调整进程的运行时间 ,根据记账执行的信息
来进行 动态调整 。
总结
-
冯诺依曼体系: 介绍了冯大佬创建计算机的偶遇, 和冯诺依曼体系的4种结,
-
CPU的重点知识: 了解了CPU的最要两个参数: 核心数和频率, 这也是衡量CPU质量的重要指标。
-
CPU执行指令的流程: 主要依靠指令表和获取指令, 解析指令和执行指令三个步骤。
-
操作系统的核心概念: 核心的两个作用: 管理外部硬件设备并给应用程序提供稳定的运行环境。
-
进程的概念:熟悉进程本质上用结构体表示和用链表来描述, 以 进程的标识符,内存指针,文件描述符表来引用 。
-
进程的调度: 熟悉进程的分时调用和熟悉进程的优先级,上下文和记账信息的属性。
总结
-
堆的初识: 我们认识到了堆本质上一中有着优先级的, 并且融合了完全二叉树和队列的特性,用顺序存储, 一种特殊的树状结构。
-
堆的调整: 向上调整和向下调整各种细节和调整顺序
-
堆的数据插入和删除: 对于插入的场景我们一般用向上调整,对于删除场景, 我们一般向下调整。
-
堆实现优先级队列 : 从大局中我们用堆实现了优先级队列, 并且从时间复杂度的角度来看,建堆比堆中插入元素更高效。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖