(java) 进程调度

目录

进程 

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

那如何管理进程?

PCB中比较重要的属性

进程调度

为什么要进行进程调度?

状态

优先级

上下文

拓展介绍一下寄存器

记账信息


进程 

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

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

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

(java) 进程调度_第1张图片

 

那如何管理进程?

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

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

PCB中比较重要的属性

1.pid 进程标识符
2.内存指针 进程持有的内存资源
3.文件描述符表 进程持有的硬盘资源
4.状态

这些用来完成’‘进程调度”,

和进程持有的CPU资源密切相关

5.优先级

6.上下文
7.记账信息

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

进程调度

为什么要进行进程调度?

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

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

你可能感兴趣的:(Java,linux,运维,服务器,java)