(java) 进程调度

目录

进程

首先我们要了解一下什么是进程?

那如何管理进程?

PCB中比较重要的属性

进程调度

为什么要进行进程调度?

状态

优先级

上下文

拓展介绍一下寄存器

记账信息


进程

首先我们要了解一下什么是进程?

简单来说,进程:跑起来的程序

我们打开任务管理器,每一个跑起来的进程都是一个应用程序

那如何管理进程?

1.先描述:使用PCB结构(进程管理块 )表示出进程的各种属性。

2.后组织:使用双向链表,把这些PCB结构串起来。

PCB中比较重要的属性

|--------------|----------------------------------------|
| 1.pid | 进程标识符 |
| 2.内存指针 | 进程持有的内存资源 |
| 3.文件描述符表 | 进程持有的硬盘资源 |
| 4.状态 | 这些用来完成''进程调度", 和进程持有的CPU资源密切相关 |
| 5.优先级 | 这些用来完成''进程调度", 和进程持有的CPU资源密切相关 |
| 6.上下文 | 这些用来完成''进程调度", 和进程持有的CPU资源密切相关 |
| 7.记账信息 | 这些用来完成''进程调度", 和进程持有的CPU资源密切相关 |

接下来我们具体介绍用来完成进程调度的这几个属性

进程调度

为什么要进行进程调度?

因为进程太多,CPU核心数太少(分不过来,狼多肉少)****。

这就需要让这些进程轮番在CPU上执行。只要轮转速度够快,那在用户眼中(宏观上),这些进程看起来就是**"同时"**执行的。

**这个"同时"只是看起来同时,实际上并不是同时的,**这个就叫做 "并发";那如果两个进程同时在两个CPU上执行,在微观上也是同时的,这个叫做 "并行"。

但在程序员的角度来看,是感受不到到底是"并发"执行,还是"并行"执行,我们通常用"并发"这个概念来表示"并行"和"并发"。

状态

1.就绪状态

这个进程随时可以去CPU上执行或者这个进程正在CPU上执行

一个CPU同一时刻只能有一个进程执行,那其他进程就得排队,那一个进程下车,下一个进程就立即补上来。

2.阻塞状态

程序有时候要等待一些其他的条件,其他条件必备,才能执行,比如说等待用户输入,这个用户一直不输入,那就得等待(阻塞了),直到用户输入,我们才能获取到数据。

还有一些其他的状态,不太重要,就不介绍了。

优先级

优先把资源分配给谁谁,

这个好理解,就比如现在同时运行一个游戏,和一个QQ,那此时我们就希望游戏持有更多的运算资源,保证流畅,QQ的话,能收到消息就好,那游戏的优先级就高于QQ

上下文

进程从CPU离开之前,需要保持现场,把当前CPU中各种寄存器的状态记录到内存中

等到下次进程回到CPU上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去,进程就会沿着上次执行到的位置,继续往后执行

就像玩游戏里的****存档,读档。

拓展介绍一下****寄存器

CPU中有一些寄存器,没有特殊含义,就只是用来保存运算的中间结果的,

还有一些寄存器,有特定含义,特定作用

  1. 保存当前执行到哪个指令**(也叫程序计数器(是一个2字节/4字节/8字节 的整数,这个整数保存的是一个内存地址,这个地址就是程序下一条要执行的指令的所在位置)**
  2. 维护栈相关的寄存器 (有了这个 才知道一个方法执行完毕后,要回到哪里执行) 通过这一组(一般是两个)维护当前程序的"调用栈",(栈,也是一块内存,这个内存里就保存当前这个程序方法调用过程中的一系列的关系,也包含局部变量和方法参数......)
  3. 其他的通用寄存器 一般是用来保存计算的中间结果的。

ps(程序计数器): exe里面就包含了指令 和 数据,把exe 运行起来,操作系统就会把指令和数据加载到内存中(就会有一个内存地址),

那此时CPU就会从内存中取指令,然后在执行指令,

初始情况下,程序计数器就指向进程指令的入口,

每次取完一条指令,程序计数器的值都会自动更新,

默认情况下,直接指向下一条(顺序执行)

但是如果遇到 跳转类指令(jmp(无条件跳转),jcmp(有条件跳转),call(函数调用)),就会被设置成跳转到的地址)

这些都是操作系统自动的。

记账信息

通过优先级机制,对不同的进程分配了不同权重的资源,

但这个机制有可能会出现极端的情况,所有的资源都给了某个进程,其他进程一点都没分着

**那就要用到记账信息,**记账信息,会记录当前进程持有 CPU 的情况(在CPU 执行多久了),就可以作为操作系统调度进程的参考依据

╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯

相关推荐
hampeter2 分钟前
【填坑指南】Trae/VS Code 远程连接 Ubuntu,终端总是自动激活特定的 Conda 环境?三招教你彻底解决!
linux·ubuntu·conda·trae
DO_Community3 分钟前
如何选择对象存储?Amazon S3 与 DigitalOcean Spaces 深度解析
运维·服务器·ai·aws·对象存储·云服务·金融科技
女王大人万岁10 分钟前
Go标准库 sync 详解
服务器·开发语言·后端·golang
ZCXZ12385296a13 分钟前
物流自动化环境下的纸箱检测与识别_YOLO13-SEG-REPVGGOREPA模型应用
运维·自动化
静谧空间14 分钟前
java登录验证码CaptchaConfig
java·开发语言
2401_8322981015 分钟前
安卓证书在线生成,一键签名・安全高效
运维
蜡笔小炘16 分钟前
LVS -- 部署DR模式集群案例
运维·服务器·lvs
Imxyk18 分钟前
力扣:632. 最小区间(贪心)
java·数据结构·算法
驱动探索者20 分钟前
linux genpool 学习
java·linux·学习
露天赏雪21 分钟前
JDK8 的入门避坑指南
java·服务器·windows·spring boot·后端·spring·性能优化