第7章 进程调度

 

1 Linux进程简介

  • Linux中,进程的优先级是动态的
  • Linux 2.6开始,内核是抢占式的
  • 内核线程没有自己的地址空间,整个内核共享内核的虚拟地址
  • Linux采用对称多处理模型,每个CPU地位相同

 

 

2 进程分类

进程可以分为普通进程(包括交互式进程、批处理进程)、实时进程。

交互式进程和实时进程的区别是:

交互式进程是用于用户交互的进程,需要控制响应时间较短而且不能波动—— 不能太短也不能太长;

实时进程需要最高进程优先级和最短的响应时间。

 

 

3 普通进程的调度

3.1 静态优先级

内核用100~139表示普通进程的静态优先级,值越大静态优先级越小

静态优先级和nice成正相关,100~130分别对应nice值的-20~19

静态优先级通过影响进程时间片来影响进程执行的“优先级” —— Linux进程基于时间片调度

父进程生成新进程的时候,会把自己的时间片也分一半给子进程;子进程执行完如果时间片没有用完时间片,会返回给父进程

 

3.2 动态优先级

动态优先级在调度程序选择执行进程的时候使用

静态优先级(正相关) && 平均睡眠时间(负相关,确定交互式进程/批处理进程) => 动态优先级

 

3.3 活动进程和过期进程

活动进程:时间片还没用完,应该是被抢占的进程

过期进程:时间片被用完,因为没有被阻塞,所以肯定还是TASK_RUNNING状态,只不过执行完后放在过期进程链表最后了

用完时间片的活动批处理进程总是变成过期进程,而用完时间片的活动交互式进程,会被重新填时间片并仍旧是活动进程!

(交互式进程占用CPU处理量很小,所以优先级很高也没有问题)

运行进程结构体runqueue里面有包括活动进程和过期进程的两个链表:prio_array_t [2] arrays

因为活动进程和过期进程会进行交换,所以需要有两个链表指针来进行操作:prio_array_t *active; prio_array_t *expired

 

 

4 实时进程的调度 

4.1 实时进程简介

实时进程有一个实时优先级,调度程序总是让实时优先级高的进程执行;

和交互式进程一样,实时进程也总是活动进程;

 

4.2 实时进程被取代的情况

  • 实时进程被另一个更高优先级的实时进程取代
  • 进程本身执行了阻塞操作并休眠,或者执行力sche_yield()主动让出CPU
  • 进程停止或被杀死

普通进程基于时间片执行,实时进程基于优先级调度。

 

 

5 调度程序使用的函数

5.1 实时进程scheduler_tick()

① 每次时钟节拍到来时都会调用 —— 应该指的是Linux的1ms周期的时钟节拍

② 如果当前进程是FIFO,什么都不做;如果是基于时间片的调度策略,往下走

③ 首先递减时间片计数器,并检查是否已经用完时间片 —— 如果用完,就进行进程调度

  • 重填进程的时间片
  • 设置RIF_NEED_RESCHED标志,准备进程调度
  • 把当前进程描述符从当前活动链表头移到当前活动链表的尾部

 

5.2 普通进程scheduler_tick()

和实时进程的调度步骤基本一致,差别在于最后不是把进程从链表头移到链表尾,而是:

把当前进程插入活动进程集合(交互式进程,执行完时间片仍旧是活动进程)或者过期进程(批处理进程,执行完就过期)。

 

 

5.3 try_to_wake_up()

① 禁用本地中断

② 为当前进程寻找合适的CPU及其runqueue

  • 如果系统中某些CPU空闲,就选择空闲CPU的rq作为目标
  • 如果该进程所属的CPU的工作量远小于本地CPU的工作量,就选择该进程所属CPU的rq
  • 如果进程最近被执行过,就选择老的运行队列作为目标

③ 把进程state设置为TASK_RUNNING

④ 打开本地中断并返回

 

5.4 recalc_task_prio()

更新进程的平均睡眠时间和动态优先级

 

5.5 schedule()

当前进程被阻塞时调用schedule();

① 直接调用

  • 把current插入适当的等待队列
  • 把current进程状态改为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE
  • 调用schedule()
  • 多次检查资源是否可用,不可用回到2,可用就从等待队列删除当前进程

② 延迟调用

如果把TIF_NEED_RESCHED置位,就会在每次检查TIF_NEED_RESCHED的时候触发进程调度;

③ 步骤

  • 禁用内核抢占,关闭本地中断,获取自旋锁
  • 从可运行队列中获取next进程
  • 进行进程切换:加载next进程,开始运行next

 

 

6 与调度相关的系统调用

nice():降低当前进程的优先级(对其它进程很nice);已被setpriority()取代

getpriority():返回 20 - 给定中所有进程中最低nice值

setpriority():把给定中所有的进程的基本优先级都设置为一个给定的值

sched_getscheduler():查询由pid参数所表示的当前进程所用的调度策略,包括SCHED_FIFO,SCHED_RR,SCHED_NORMAL;

sched_setscheduler():设置调度策略

sched_yield():进程自愿放弃CPU,但是仍保持TASK_RUNNING状态;

如果是普通进程,调度程序把它放到运行队列的过期进程集合中;

如果是实时进程,调度程序把它放到运行队列链表的末尾

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893188.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目前国内可用Docker镜像源汇总(截至2025年2月)

[目前国内可用Docker镜像源汇总(截至2025年2月) - CoderJia](https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea) 在国内使用 Docker 的朋友们,可能都遇到过配置镜像源来加速镜像拉取的操作。然而,最近几个月发现许多曾经常用的国内镜像站(包括各种…

我的lua使用初体验

本文记录作者第一次使用lua的一次实践,主要借助lua来保证检查锁和释放锁的原子性使用lua实现检查和删除分布式锁的原子性很多时候出现并发问题的根本原因在于检查和操作不是同一个操作,不具有原子性,所以中间会被其他线程插一脚。所以我们需要有一种工具保证这两种操作的原子…

三剑客与正则系列-sed命令

1.概述核心功能:取行,过滤,替换修改文件内容 难点:后向引用(截取). sed stream editor流编辑器.2.格式命令 选项 详细格式 参数sed 选项 条件动作 文件找谁干啥找谁:条件,匹配哪一行,哪些行. 干啥:动作,增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项 说明-n 取消默认输…

加速PyTorch模型训练技巧

Pytorch-Lightning 可以在Pytorch的库Pytorch-lightning中找到我们在这里讨论的每一个优化。Lightning是在Pytorch之上的一个封装,它可以自动训练,同时让研究人员完全控制关键的模型组件。Lightning使用最新的最佳实践,并将你可能出错的地方最小化。 我们为MINST定义为Light…

能力全面提升综合题单-练习

Part1 语言基础题 P1089 [NOIP 2004 提高组] 津津的储蓄计划import java.util.Scanner;// P1089 [NOIP 2004 提高组] 津津的储蓄计划 public class P1089 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int[] budget = new int[12];for (int …

kettle插件-git/svn版本管理插件

场景:大家都知道我们平时使用spoon客户端的时候时无法直接使用git的,给我们团队协作带来了一些小问题,需要我们本机单独安装git客户端进行手动上传trans或者job。 我们团队成员倪老师开发了一款kettle的git插件,帮我们解决了这个大难题,大大方便了我们团队协作,今天一起来…

自我介绍,软工五问

作业相关信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习博客的使用自我介绍 我是软工2班的彭颂华…

HTTPS,TLS原理分析

简单介绍 Tansport Layer Security TLS 已经逐渐取代 SSL 可以简单理解:HTTPS = HTTP + SSL/TLS TLS运行在TCP之上,HTTP之下,传输层协议,负责HTTP内容的安全传输 TLS流程在TCP三次握手建立连接后开始 TLS协议结构wireshark中TLS主要分为两层,底层的是TLS记录协议,主要负责…

训练ai生成代码效果展示

训练ai生成代码效果展示 在本次实验中试图使用命令的形式来训练ai,达到成功获取需要的web开发页码的效果 起初 本来我打算让ai生成一个整体的项目,但是ai不可以直接生成一整块的项目,他也没办法把得到的结果以文件的形式传给你,得到的还是文本,第一实验的结果并不理想 以下是训…

公交线路(迪杰斯特拉)

这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列 #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int N=1000+5; struct node{int id,dis; }; vector<…

HDFS中数据目录的挂载在根目录下至磁盘爆满问题解决

1、查看hdfs-size.xml文件 获取数据目录位置vim /opt/hadoop/etc/hadoop/hdfs-site.xml<property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop-data/data-node-data,/home/hadoop-data/data-node-data-2,/data-3</value> </pro…