🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:Linux
🌹往期回顾🌹:【Linux】进程状态
🔖流水不争,争的是滔滔不
一、进程优先级是什么
进程优先级是操作系统用来确定进程获取 CPU 资源顺序的属性。它体现进程在资源分配中的重要性,优先级高的进程更易先获得 CPU 处理时间。
优先级分为静态和动态两种。静态优先级在进程创建时确定,基本不变,如系统进程的优先级通常较高。动态优先级在进程运行中可根据进程行为和系统状态改变,像长时间占用 CPU 的进程优先级可能会被降低,等待后重新就绪的进程优先级可能会提高。它有助于合理分配资源、优化系统性能。
简而言之是进程得到CPU资源的先后顺序。
进程优先级的值越低优先级越高,反之优先级优先级越低。
二、查看系统进程
cpp
ps-l //输入此指令查看进程
对图中的值进程解释:
UID:代表执行者的身份。系统想知道访问文件的是拥有者或所属组或者other就需要通过UID来获取,在Linux系统中,访问任何资源,都是进程访问,进程就代表了用户。
PID和PPID:是进程代号和父进程代号,前面文章聊过。
PRI:是进程的优先级,默认值是80。
NI:是进程优先级的修正数据,Nice值
PRI and NI
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此
值越小进程的优先级别越高。
nice值表示进程可被执行的优先级的修正数值。
进程的真实优先级 =PRI+NI。
调整进程的优先级,在Linux下就是调整进程的nice值。
nice其取值范围是-20至19,⼀共40个级别。所以Linux进程的优先级范围是60到99。
cpp
renice -n nice值 -p pid //通过这一指令修改nice值
当我们nice值是-100,按照进程的真实优先级 =PRI+NI应该是-20啊,但是如图优先级为60。所以Linux的优先级是有范围的,最低的60。
当我们的nice值为100,优先级为99。Linux的优先级最高是99。
优先级设立不合理,会导致优先级最低的进程,长时间得不到CPU资源进而导致,进程饥饿。
三、竞争、独立、并行、并发
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
四、进程切换
死循环进程,不会一直占有CPU。
寄存器是CPU内部的临时空间。寄存器!=寄存器里面的数据。寄存器就是一块空间,和往寄存器里面写的数据不要混淆。
PU 上下文切换,其实际含义为任务切换,或者说是 CPU 寄存器切换。当多任务内核决定运行另外的任务时,它会保存正在运行任务的当前状态,即 CPU 寄存器中的全部内容。这些内容被保存在任务自身的堆栈中,入栈工作完成后,便将下一个将要运行的任务的当前状况从该任务的栈中重新装入 CPU 寄存器,然后开始下一个任务的运行 ,这一过程即为 context switch。
进程切换最核心的,就是保存和恢复当前进程的硬件上下文的数据,即CPU寄存器里面的内容
Linux真实调度算法
一个CPU一个运行队列
下图为进程队列的数据结构
queue
时间片还没有结束的所有进程都按照优先级放在该队列
queue中存放task_struct*,优先级分为实时优先级和分时优先级。queue[140]: ⼀个元素就是⼀个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
普通优先级:100〜139 所以这里就和我们上面讲的PRI和nice值就对上了
实时优先级:0〜99 我们这里不关心
实时优先级:通常采用抢占式调度策略,高优先级的实时任务可以抢占低优先级任务的 CPU 资源,确保关键的实时任务能够及时获得执行机会。如在实时操作系统中,对于硬实时任务,必须在规定的时间内完成操作,一旦高优先级的实时任务就绪,就会立即抢占正在运行的低优先级任务的 CPU。
分时优先级:一般采用时间片轮转调度算法,系统将时间划分为固定大小的时间片,每个任务轮流在各自的时间片内执行,任务不会被其他任务抢占,直到其时间片用完。如在常见的分时操作系统中,多个用户进程或任务按照时间片轮流使用CPU 资源,每个任务都能在一定时间内得到执行机会。
bitmap
bitmap[5]:⼀共140个优先级,⼀共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!
过期队列
过期队列和活动队列结构⼀模⼀样
过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
active指针和expired指针
在进程调度管理机制中,存在两个关键指针:active指针与expired指针 。active指针始终指向活动队列,而expired指针则一直指向过期队列。
随着进程的运行,会出现这样一种情况:活动队列上的进程数量逐渐减少,而过期队列上的进程数量却不断增多。这是因为进程的时间片到期后,这些进程会持续被转移到过期队列中。不过,这种情况并不会影响系统的正常调度。在恰当的时机,通过交换active指针和expired指针所指向的内容,就如同产生了一批新的活动进程。如此一来,系统便能够继续高效地进行进程调度,确保各个进程都能得到合理的执行机会。