文章目录
- 进程优先级
- Linux下的调度算法
- 进程特性
进程优先级
进程要访问某种软硬件资源,此时进程需要通过一定的方式(排队),来确认享受某种资源的先后顺序。
优先级是确认先后问题,权限是确认能不能的问题。
资源有限。
PRI 优先级。
Linux默认优先级是80.
Linux优先级是可以被修改的,Linux的优先级的范围[60,99]
,一共40个优先等级
优先级的本质是数字,数字越小,优先级越高
调整优先级
不建议用户自己对进程优先级进行修改。
修改nice值
- top - 任务管理器
- r
- 输入想要修改优先级的进程的pid
- 输入想要修改的优先级
Linux系统允许体哦阿正哟溴铵及,但是不能直接让你修改PRI,而是修改nice值。
nice值不是优先级,而是进程优先级的修正数据
PRI = PRI(old) + nice。
PRI(old),老的优先级一直都是进程最初的优先级值。
nice值的取值范围:[-20 , 19]
Linux的优先级的调整是受限制的。
优先级较高的进程,优先得到资源,后续还有很多的进程产生,导致常规的进程很难享受到CPU资源。此时会出现进程饥饿问题。
任何分时操作系统,都要在调度上,保证较为公平的进行调度。
优先级可以调整,但是必须在可控范围内调整。
Linux下的调度算法
Linux2.6内核进程调度
- 一个CPU拥有一个runqueue
- 如果有搓个CPU就要考虑进程个数的负载均衡问题
优先级
- 普通优先级:100~139
- 实时优先级:0~99
活动队列
- 时间片还没有结束的所有进程都按照优先级放在该队列
nr_active
:总共有多少个运行状态的进程queue[140]
:一个元素就是一个进程队列,相同优先级的进程按照FIFO(先入先出)规则进行排队调度,数组下标就是优先级。- 从该结构中,选择一个最合适的进程,过程:
- 从0下标开始遍历
queue[140]
- 找到第一个非空队列,该队列必定为优先级最高的队列
- 拿到选中队列的第一个进程,开始运行,调度完成
- 遍历
queue[140]
的时间复杂度是常数,但是还是太低效了
- 从0下标开始遍历
bitmap[5]
:一共有140个优先级,所以一共有140个进程队列,为了提高查找非空队列的效率,就可以用5*32
个比特位表示队列是否为空,这样大大提高了查找效率
过期队列
- 过期队列和活动队列的结构是与一摸一样的。
- 过期队列上放置的进程,都是时间片耗尽的进程
- 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
active指针 和 expired指针
-
active指针永远指向的是活动队列
-
expired指针永远指向过期队列
-
可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
-
当活动队列上的进程运行完毕之后,只需要交换active指针和expire指针的内容,就相当于具有了一批新的活动进程。
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程的增多而导致时间成本增加,我们称之为进程调度O(1)算法!
进程特性
- 竞争性:系统进程数目众多,而CPU资源只有少量的,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
- 并发:多个进程在一个CPU下采用高频的进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。