目录
一.CPU基础知识
1.CPU的基本情况
x86 架构: intel amd 家用 pc,服务器
arm 架构: 苹果, 高通苹果电脑,智能手机
2.CPU是如何构成的
门电路 =>半加器 =>全加器 =>加法器 =>ALU 运算器 =>差不多构成 CPU
3.CPU计算数据相关结论
1.CPU 要执行的指令,是在内存中的(冯诺依曼体系结构,基本设定,让执行单元和存储单元解耦合)
2.CPU 要想执行指令, 就需要先 取指令, 再解析指令,然后才能执行指令
3.取指令雲要从内存中读取指令到 cpu 的寄存器中 (这里没有体现出 存储指令的寄存器,就只体现了 AB 用来计算数据的寄存器取指令的操作,其实是非常耗时的 (读取内存操作相对于 cpu 执行计算, 要开销大很多)因此 cpu 中通过缓存,流水线等技术,来优化这里的效率
4. cpu 解析指令的时候,需要用到"指令表",不同架构的 cpu 支持的指令表不同 (x86 和 arm 等都是不同的指令表细节,已经写死到 cpu 中了,cpu 是可以很容易识别的
5.指令在执行过程中,可能会带有一些操作数,不同的指令,操作数的个数含义都有所不同
6.CPU 重要的参数,主频.主频表示的含义,近似看成是一秒钟之内,cpu 能够执行的指令个数
二.操作系统
1.操作系统是什么
操作系统是一个软件
2.操作系统的主要职责
1.管理各种硬件设备
2.给其他软件提供稳定的运行环境(抽象封装)
(类似JVM,JVM 又是对系统的抽象封装,于是最终的结果,咱们 Java 程序猿就只需要使用 JM 提供的api 就可以起到控制各种不同的系统,完成编程效果了,操作系统给程序猿提供了许多管理硬件软件的api)
三.进程(任务)
1.什么是进程/任务(Process/Task)
进程就是操作系统提供的一种软件资源,进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运⾏过程; 同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。每个任务在执行的过程中都需要消耗一定的硬件资源.
目前使用的的系统都是"多任务操作系统",同一时刻可以运行多个程序,与之对应的就是"单任务操作系统",同一时刻只能运行一个程序.
2.操作系统的进程管理
1.先描述 (使用类/结构体这样的方式,把实体属性给列出来)
操作系统,一般是用 C/C++ 实现的.(没有 Java 写的操作系统)因此,就可以使用结构体
表示进程信息的结构体,起了个名字,PCB(进程控制块,Process Control Block)具体在 Linux 上,PCB 是一个 叫做 struct task struct {..}这样的结构体.在 Linux 中,使用链表这样的数据结构来把若干个 task struct 给串起来.
2.再组织(使用一定的数据结构,把这些结构体/对象, 串到一起)
当我们看到任务管理器中的这些进程的时候,意味着系统内部就在遍历链表,并且打印每个节点的相关信息;
如果运行一个新的程序,于是系统中就会多一个进程,多的这个进程就需要构造出-个新的 pcb, 并且添加到链表上.
如果某个运行中的程序,退出了,就需要把对应进程的 pcb 从链表中删除掉, 并且销毁对应的 pcb 资源
3.PCB(进程控制块)中的核心属性
1.pid是什么
pid是进程的身份标识,系统会保证,同一个机器,同一时刻,每个进程的pid都是唯一的
2.内存指针是什么
内存指针描述了进程使用内存资源的详细情况,进程运行过程中,需要消耗一些系统资源的,其中内存就是一种重要的资源,可以把内存想象成一个小旅馆,申请内存就是跟老板开一间房,只有申请到了才能使用,每个进程都必须使用自己申请到的内存,内存指针,就是用来描述说你这个进程,都能使用哪些内存,一个进程跑起来的时候,需要有"指令"也需要有"数据"(指令和数据,都是要加载到内存中的),进程也需要知道,哪里是存的指令,哪里是存的数据.
3.文件描述符表
描述了这个进程,所涉及的硬盘相关的资源,我们的进程经常要访问硬盘操作系统, 对于硬盘这样的硬件设备, 进行了封装=>文件,操作系统不管你是哪种盘, 都是统一进行的抽象,都是按照"文件"的方式来操作的.(Java 标准库封装的 api本质上都是调用系统 api )
四.进程是系统分配资源的基本单位
1.CPU的分配
如何理解进程消耗CPU资源?我们可以把CPU想象成一个舞台,要执行的指令就是演员,进程要执行指令就相当于演员登台表演,同一时刻,一个舞台上只能有一个演员,多核cpu相当于有多个"舞台",但是僧多肉少,cpu的数量小于进程数量,这是关键在于"让多个演员轮流登台",这就涉及到一个重要的概念:"分时复用"(并发性)
2.分时复用(并发性)
cpu 核心只有一个,先执行进程1 的代码(进程1,登台演出),执行一会之后,让进程1 下来,进程2 上;进程2上了执行一段时间之后,进程3 上 ,以此类推,只要切换速度足够快,人是感知不到这个切换的过程的在人眼看起来,多个任务/进程,就是"同时执行"的
后来,随着多核cpu 诞生,同时执行进程, 变的更复杂了,同时就可以有四个不同的进程,在各自的舞台上进行执行,此时此刻,微观上,这几个进程也是"同时执行的”,而不是靠快速切换模拟的“同时执行”称为“并行执行”,与之对应的,前面的并发执行,仍然存在,每个核心仍然要分时复用,仍然要快速切换,当前现代的计算机 执行过程,往往是并行+并发同时存在的.两个进程是并行执行还是并发执行都是看系统的调度的.因此,往往就把“并行”和“并发”统称为“并发”,对应的编程方式就统称为"并发编程".进程的调度,分时复用,并发执行,PCB中就需要提供一些属性来支持系统完成对这些进程的调度
3.PCB中支持系统调度的属性
1.状态
状态是描述某个进程是否能够去CPU执行的
1.就绪状态:随时准备好去CPU上执行,操作系统一打招呼就可以上cpu,拥有除了cpu以外所有的必备资源;
2.阻塞状态:这个进程当前不方便去cpu上执行,此时不应该去调度他,比如进程在等待io,来自控制台的输入输出,硬盘的输入输出,网卡的输入输出等等.
void main(){
Scanner scanner=new Scanner(System.in);
int num=scanner.next();
}
根据上面的代码我们可以看出,若用户一直不输入时,程序无法继续执行,此时进程处于阻塞状态,这就是因为等待IO引起的阻塞.
2.优先级
多个进程等待系统调度,多个进程之间的调度先后关系并不是平均的,先调度谁,后调度谁,调度实际谁长谁短等都是可以进行调配的.
3.记账信息
针对每个进程,占据了多少 cpu 时间,进行一个统计,会根据这个统计结果来进一步的调整调度的策略,因此就需要在下一个轮次进行调整,确保每个进程都不至于出现完全捞不着 CPU 的情况的.
4.上下文
总结
操作系统的主要职责是:管理各种硬件设备,给其他软件提供稳定的运行环境
进程就是操作系统提供的一种软件资源,进程又是操作系统进行资源分配的基本单位。
进程的调度,分时复用,并发执行
PCB中的核心属性:pid,内存指针,文件描述符表
PCB中支持系统调度的属性:状态,优先级,记账信息,上下文