系统相关
首页 > 系统相关> > tlpi:进程优先级和调度(getpriority...)

tlpi:进程优先级和调度(getpriority...)

作者:互联网

进程优先级和调度

进程优先级(nice值)

进程优先级nice值会影响CPU的调度策略,每个进程都拥有一个nice值,其取值范围为-20~-19,默认值为0

在传统UNIX实现中,只有特权进程才能够赋给自己一个负的优先级,非特权级进程只能够降低自己的优先级,即赋予一个正值

这样做的话他们对于其他进程来说就很"nice"了

通过fork()会继承nice的值,并且该值会在exec()中得以保存

CPU调度模型

SCHED_OTHER

Linux调用CPU使用的默认模型是SCHED_OTHER(循环时间共享),在该模型中,每个进程轮流使用CPU一段时间,这段时间被称为时间片在该模型中,进程的调度并不是严格按照nice值来进行调度的,nice值只是一个权重因素,它导致内核调度器倾向于调度拥有高优先级的进程。给一个进程赋予一个低优先级,不会导致它完全无法使用CPU,只会导致他使用到的CPU时间变少

SCHED_RR

该策略与接下来的SCHED_FIFO均为实时调度策略,使用这两种策略中的任意一种进行调度的优先级会高于SCHED_OTHER在实时调度策略中,拥有高优先级的可运行进程总是优先于低优先级的进程访问CPU,实际上,每个优先级级别都维护着一个可运行的进程队列,下一个运行的进程是从优先级最高的非空队列中选择出来的

在SCHED_RR中,优先级相同的进程以循环时间分享的方式执行,进程每次使用CPU的时间是一个固定长度的时间片,一旦被调度执行,使用SCHED_RR策略的进程会运行直到以下情形

  1. 时间片用完
  2. 自愿放弃CPU。可能是执行了阻塞系统调用或者sched_yield()(??不知道)

当遇到这两种情况时,原有的进程将会被放置到对应优先级别队列的队尾

  1. 终止
  2. 被更高优先级抢占

当更高优先级执行完毕后,原有进程会继续执行(即还在队列头)

SCHED_FIFO
该策略中没有时间片的概念,进程会一直执行直到以下情形

  1. 自动放弃CPU
  2. 终止
  3. 被高优先级抢占

与SCHED__RR基本类似

进程被抢占的原因:

  1. 之前被阻塞的高优先级进程解除阻塞
  2. 另一个进程的优先级被提高
  3. 当前进程优先级被降低

SCHED_BATCH和SCHED_IDLE

这两种策略均与SCHED_OTHER十分相似,并且不属于实时策略

SCHED_BATCH会导致频繁被唤醒的任务被调度的次数较少

SCHED_IDLE提供的功能等同于一个十分低的nice值,在该策略中,进程的nice值将毫无意义

实时进程调用API

防止实时进程锁住系统

由于高优先级实时进程会抢占所有低优先级进程,因此需要注意这些进程锁住CPU,具体有以下四种解决方案

SCHED_RESET_ON_FORK

在调用 sched_setscheduler()时可以将 policy 参数的值设置为该常量,如果设置了这个标志,那么由这个进程使用fork()创建的子进程就不会继承特权调度策略和优先级了。其规则如下:

释放CPU

实时进程可以通过两种方式自愿释放CPU:通过调用一个阻塞进程的系统调用(如从终端中read())或者调用sched_yield()

#include<sched.h>
int sched_yield(void);
											//成功:返回0        失败:返回-1

SCHED_RR时间片

使用sched_rr_et_interval()获取SCHED_RR时间片

#include<sched.h>
int sched_rr_get_interval(pid_t pid, struct timespec *tp);
										//成功:  返回0, 失败:返回-1

CPU亲和力

Linux中CPU亲和性(affinity) - 知乎 (zhihu.com)

标签:...,优先级,getpriority,tlpi,SCHED,进程,sched,CPU,nice
来源: https://blog.csdn.net/qq_52554396/article/details/121422451