(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 执行多久了),就可以作为操作系统调度进程的参考依据

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

相关推荐
蔚一19 分钟前
Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
java·开发语言·数据结构·分类
闲人一枚(学习中)21 分钟前
Maven进阶-二、依赖
java·数据库·maven
shibushi11422 分钟前
前后端分离集成CAS单点登录
java
2401_857297911 小时前
招联金融内推(深圳武汉大量招后端、算法)---2025秋招内推
java·前端·算法·金融·求职招聘
l1o3v1e4ding1 小时前
解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
java·linux·音视频·实时音视频·视频编解码
当归10241 小时前
nginx的反向代理和负载均衡
运维·nginx·负载均衡
罗曼蒂克在消亡2 小时前
缓存的思考与总结
java·缓存·intellij idea
汇匠源2 小时前
小程序服务零工市场
java·大数据·开发语言·小程序·团队开发·零工市场·零工市场小程序
2401_857297912 小时前
招联金融秋招内推喇--18薪
java·前端·算法·金融·求职招聘
Yz98762 小时前
使用sqoop报错
大数据·linux·数据库·hadoop·apache·big data·sqoop