Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构、LeetCode专栏
📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。
目录
- 前言
- 一、计算机发展史
- 1.冯诺依曼体系(Von Neumann Architecture)
- 2.CPU主要的功能(计算机最核心的部分)
- 二、指令(⭐⭐⭐⭐⭐)
- 1.CPU是如何执行指令的
- 2.指令表
- 3.CPU的基本工作流程
- 三、操作系统(Operating System)
- 1.操作系统内核(最核心的部分)
- 2.操作系统的定位
- 3.进程(核心)
- 3.1什么是进程/任务(Process/Task)
- 3.2进程控制块抽象(PCB Process Control Block)
- 4.CPU 分配⸺进程调度(Process Scheduling)
- 4.1状态
- 4.2优先级
- 4.3记账信息
- 4.4上下文
- 总结
前言
计算机不仅仅是指电脑,日常生活中用的 手机、平板、电视、路由器等…都可以叫做计算机
现在的计算机,大体分为几个大类:
1)终端设备:(台式机、笔记本、手机、ipad…)平时用户使用的
2)服务器:日常普通用户见不到的。以后作为开发人员,要经常打交道。
3)嵌入式设备:主题功能不是用来“计算”,而是针对一些特殊的场景,量身定做的“专用计算机”。
以上设备:遵循
“冯诺依曼体系”
(计算机使用二进制表示存储数据
)(大的基调就是冯大佬定下来的)
一、计算机发展史
计算的需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。
人类对计算的需求,驱动我们不断的发明、改善计算机。目前这个时代是“电子计算机”的时代,发展的潮流是:更快速、更稳定、更微型。
1.冯诺依曼体系(Von Neumann Architecture)
现代的计算机, 大多遵守 冯诺依曼体系结构
有的硬件设备,可能既是输入,也是输出(蓝牙,触摸屏)
路由器----> 里面有 CPU、存储器、既有输入也有输出
- CPU 中央处理器: 进行算术运算和逻辑判断.
- 存储器: 分为外存和内存, ⽤于存储数据(使⽤二进制方式存储)
- 输入设备: 用户给计算机发号施令的设备.
- 输出设备: 计算机个用户汇报结果的设备.
针对存储空间
硬盘 > 内存 >> CPU
针对数据访问速度
CPU >> 内存 > 硬盘
2.CPU主要的功能(计算机最核心的部分)
【主要功能】
- 进行各种算数运算
- 进行各种逻辑判断
运行的任何一个程序,本质都是通过CPU来进行执行的
二、指令(⭐⭐⭐⭐⭐)
- 就可以认为是CPU被设计的时候,给程序员提供的一些“接口编程”,(近似理解成cpu提供给程序员的 API )
- cpu其实有很多不同的架构,不同架构的cpu,支持的指令也不一样。
- 虽然各不相同,但是也有几套标准,最主流的一套标准,x86架构的cpu,arm架构,这一套也非常流行。
- CPU其实有很多种不同的架构,不同架构的CPU,支持的指令是不同的~~~
- 同一个程序,在这个 cpu 机器能运行,但是到另外一台机器上,就可能运行不了
1.CPU是如何执行指令的
(大前提)所谓的指令,都是要先加载到内存中,然后才能被 CPU读取,并执行.
【比如】
一个Java程序,写出来的是一个 .java 源代码文件,编译得到 .class 二进制文件(但是仍然在硬盘上),运行程序的时候,jvm就会把这个 .class 加载到内存当中,再进一步的翻译成 cpu 能识别的二进制指令。
冯诺依曼体系结构规定:
一个程序,指令和依赖的数据都是要在储存器中保存的,CPU如果需要执行,都是要自动的从存储器中读取到对应的指令
【CPU执行程序,大概就是经历这三个阶段】
- 读指令(把内存中的指令数据,读取到cpu寄存器中)
- 解析指令,(理解当前指令要做什么)
- 执行指令
这是一个简化版的模型,实际 cpu 会更复杂,包含一些流水线,预测机制…
2.指令表
所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。
其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。
指令本身也是⼀个数字,用二进制形式保存在内存的某个区域中。
3.CPU的基本工作流程
cpu 中有一个专门的寄存器,保存接下来要从哪个内存地址来取指令
不同的cpu叫法都不一样,有些操作系统书上称为 “程序计数器” 简称 pc (在RPG里头,相当于领任务~~~)
第⼀条指令的运行,其实没有⽤到我们之前制作的ALU部件,但这只是其中一些指令而已,尝试把剩余的3条指令自行运行一次,观察并理解这个过程。
三、操作系统(Operating System)
操作系统是⼀组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
虽然这些操作系统,是不同厂商,给不同领域提供的,核心的功能,都是大同小异。
都是为了“搞管理”,能够把一个计算机上的所有硬件资源和软件资源都管理好
cpu,内存,硬盘…(都是硬件)
操作系统就是(非常复杂,代码量千万级别)软件,可以让计算机按照一定的规则进行执行
软件:(一组指令的集合)
1.操作系统内核(最核心的部分)
操作系统 = 内核 + 配套的应用程序
- 内核 : 前面谈到的 “ 管理 ”,都是在内核里面完成的
- 配套的应用程序: 往往要靠内核提供一些功能作为支撑
2.操作系统的定位
操作系统内核通过驱动程序,来操作硬件
操作系统由两个基本功能:
1) 防⽌硬件被时空的应⽤程序滥⽤;
2) 向应⽤程序提供简单⼀致的机制来控制复杂⽽⼜通常⼤相径庭的低级硬件设备。
3.进程(核心)
3.1什么是进程/任务(Process/Task)
- 一个程序,运行起来/跑起来,在操作系统中,就会出现一个对应的进程
- 换而言之,进程就是一个跑起来的应用程序
除了上述自己运行的程序是进程以外
还有一些系统自带的/安装某些程序,给你添加的
这些对于系统能够稳定运行有很重要的意义
每个应用程序运行于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了⼀个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之⼀。
进程是操作系统对⼀个正在运行的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运行过程;
同时,在操作系统内部,进程⼜是操作系统进行资源分配的基本单位。
3.2进程控制块抽象(PCB Process Control Block)
操作系统,上面包含很多的进程,一旦东西多了,就需要考虑“管理”
计算机内部要管理任何现实事物,都需要将其抽象成⼀组有关联的、互为⼀体的数据。在 Java 语⾔
中,我们可以通过类/对象来描述这⼀特征。
// 以下代码是 Java 代码的伪码形式,重在说明,⽆法直接运⾏
class PCB {
// 进程的唯⼀标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使⽤的各个资源
// 进度调度信息(留待下⾯讲解)
}
这样,每⼀个 PCB 对象,就代表着⼀个实实在在运⾏着的程序,也就是进程。
操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进⾏增删查改的操作。
【pid】进程的id / 标识符
(类似于身份证号码)
同一个机器,同一时刻,进程id一定是不同的
【内存指针】
【文件描述符表】
程序运行过程中,经常要和文件打交道,进程每次打开一个文件,就会在文件描述符表上多增加一项(这个文件描述符表可以视为一个数组,里面的每个元素又是一个结构体,就对应一个文件的相关信息)一个进程只要一启动,不管你代码中是否打开/操作文件的代码都会默认的打开三个文件~~(系统自动打开的):标准输入(System.in)标准输出(System.out)标准错误(System.err)
这个文件描述符表的下标,就称为文件描述符~
4.CPU 分配⸺进程调度(Process Scheduling)
进程调度的基本过程是怎样的?
进程的调度,其实就是,操作系统在考虑CPU资源如何给各个进程分配~
上面的属性是一些基础的属性,下面的一组属性,主要是为了能够实现进程的调度~
4.1状态
这个状态就描述了当前这个进程接下来应该怎么调度~~
就绪状态
:随时可以去CPU上执行。
阻塞状态/睡眠状态
:暂时不可以去CPU上执行。
4.2优先级
先给谁分配时间,后给谁分配时间,以及谁分的多,给谁分的少。(这里的优先级只是建议,系统不一定采取)
4.3记账信息
统计了每个进程,都分别被执行了多久,分别都执行了哪些指令。分别都排队等了多久,目的是给进程调度提供指导依据的。
4.4上下文
表示上次进程被调度出CPU的时候,当时程序的执行状态~~,下次进程上CPU的时候,就可以恢复之前的状态,然后继续往下执行。
进程被调度出CPU之前,要把CPU中的所有的寄存器中的数据都给保存到内存中(PCB的上下文字段中)
相当于玩单机游戏的时候的存档~~
下次进程再被调度上CPU的时候,就可以从刚才的内存中恢复这些数据到寄存器中
相当于读档继续玩游戏~
存档+读档~存档存储的游戏信息,就称为“上下文”
总结
所谓的调度就是进行时间管理
进程的调度,其实就是操作系统在考虑CPU资源如何给各个进程分配–
由于操作系统上,同时运行多个进程,此时如果某个进程出现BUG,进程崩溃了,是不会影响其他进程的,因为进程之间通过虚拟地址空间,已经各自隔离开了,但实际工作中进程之间还是需要相互交互的。