LINUX内核的进程调度策略

一:调度时机:

内核中:进程自己通过系统调用schedule()或者schedule_timeout()自愿放弃CPU,让CPU调度其他的进程。(schedule_timeout() 可以指定放弃CPU的时间)

1:自愿调度:

用户空间:进程通过系统调用pause()或者nanosleep()而自愿放弃CPU。(nanosleep()也可以指定放弃CPU的时间,此外,Sleep()、Sleep_on()是库函数,不是系统调用,最终也是通过系统调用实现放弃CPU)

2:非自愿调度:

主要发生在系统从内核态返回到用户态时(即从系统空间返回到用户空间),

主要发生在以下几种情况:用户进程进行系统调用返回时(系统调用在系统空间中完成);中断处理完成时(中断处理也是在系统空间);异常处理完成时(异常处理也在系统空间)。

CPU每次从系统空间返回到用户空间时,都会进行一次进程调度。此外,每次时钟中断产生时,发现当前运行进程的时间片超时,也会进行一次进程调度(这也是LINUX系统中各个进程都能够得到执行的原因,否则,如果某个进程不进行系统调用,自身运行有没有异常,又不自愿放弃CPU,系统中又没有中断,则该进程会一直等到时间片用完为止)。也就是说,强制进程调度只发生在用户空间,绝对不会发生在系统空间中。

二:调度方式:“有条件可剥夺”方式。 通过以上调度时机的分析,可见,LINUX内核使用的是“有条件可剥夺”方式的进程调度,当系统运行在系统空间时,是不可已被剥夺的,但是,一旦系统从系统空间返回返回到用户空间时,当前进程就有可能被剥夺CPU的占用权。

三:调度策略:(重点)----“以进程各自的优先级和调度策略“为基础的调度策略。 1:总的调度策略:系统会根据每个进程的优先级和它所采用的调度策略,通过某种算法计算出各个进程的一个运行“权值”,系统每次调度时,就根据这个权值进行调度,权值最高的,最先被调度。但是,这个权值并不是一成不变的,而是随着被执行进程执行的时间而递减,这样,原来权值较低的进程也可以有机会得到执行(保证进程调度的“公正”性)。当所有进程的权值都减小到0时(注意:如果有线程采用下面将要提到的SCHED_FIFO或者,SCHED_RR调度策略,则不可能所有进程的权值都变成0,至少采用这两种调度策略的进程的权值最少会保持1000),系统就会重新计算一次所有进程的权值,再次重复上述调度过程。 ****注:正是因为计算权值的时候,考虑了各个进程的优先级和它所采用的调度策略,所以说,LINUX内核的调度策略是“以进程各自的优先级和调度策略“为基础的调度策略。

2:进程自己的调度策略: 为适应不同的需要,LINUX内核设计了三种不同的进程调度政策:

SCHED_FIFO--------适用于对时间性要求比较强,而且每次运行时所用的时间比较短,实时应用程序适合这种策略。

SCHED_RR-----------“RR”是 Round Robin(轮流)的意思,适合程序比较大,每次运行都需要花费很长时间的进程。

SCHED_OTHER------传统的调度策略,适用于交互式的分时应用 。此外,各个进程可以通过系统调用sched_setscheduler()设置自己的调度策略。

四:通过以上对LINUX进程调度策略的分析,可以得出这种调度策略不能保证实时性要求,所以需要打个所谓的实时补丁包。 但是,在目前不能改变调度策略的情况下,要想提高实时性,可以采取以下措施:

1:将CPU时间片划分的小一些。这样做的弊端是进程调度会很频繁,增加因为进程调度而花费的开销。

2:实时进程采用高的优先级(1—99)。

3:实时进程采用SCHED_FIFO的调度策略,但其中要又sleep()等类似的操作。

LINUX内核的进程调度策略相关推荐

  1. 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )

    文章目录 一.task_struct 结构体字段分析 1.comm 字段 2.进程优先级字段 3.cpus_ptr 字段 4.mm.active_mm 字段 5. fs 字段 在 Linux 内核 中 ...

  2. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

    文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...

  3. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  4. 【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )

    文章目录 一.task_struct 结构体字段分析 1.files 字段 2.nsproxy 字段 3.信号处理相关字段 4.信号量和共享内存相关字段 在 Linux 内核 中 , " 进 ...

  5. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )

    文章目录 一.task_struct 结构体字段分析 1.real_parent 字段 2.parent 字段 3.group_leader 字段 4.real_cred 字段 5.cred 字段 在 ...

  6. 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )

    文章目录 一.task_struct 结构体字段分析 1.state 字段 2.stack 字段 3.pid字段 4.tgid 字段 5.pid_links 字段 在 Linux 内核 中 , &qu ...

  7. 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )

    文章目录 一.task_struct 结构体 二.task_struct 结构体代码示例 一.task_struct 结构体 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象 ...

  8. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

  9. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  10. 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )

    文章目录 一.进程与操作系统 二.进程与程序 三.进程与线程 四.虚拟地址空间 一.进程与操作系统 操作系统与硬件的关系 : 操作系统 使用 硬件 提供的资源 , 如 CPU , 内存 , 磁盘 , ...

最新文章

  1. Oracle的口令文件(passwordfile)的讲解(摘录)
  2. Mxnet TensorRT
  3. 《深入理解NGINX 模块开发与架构解析》之摘抄学习
  4. 被替换的项目不是替换值长度的倍数_如果要在Excel中计算单元格内指定的字符长度,我推荐这两个公式.........
  5. #pragma code_seg(INIT)/code_seg(PAGE)
  6. 理想回应800倍高阶收EPB驻车芯片:不属实
  7. ssh 登录时,有的服务器很容易频繁断开连接,有的却几乎不会断开。
  8. python是一种面向过程的编程语言_python协成与面向过程编程
  9. logstash filter 处理json数据按原始数据字段数据存储
  10. FtpWebRequest(转)---关于C/S中文件的上传,下载,获得文件列表
  11. BME280嵌入式设计-基于STM32F103的温湿度气压控制板-支持蓝牙串口输出数据!!!
  12. 74CMS 3.0任意文件写入漏洞
  13. 机器学习考试 ppt
  14. 重启Usb蓝牙设备(PD虚拟机模拟插拔)
  15. RINEX3广播星历中的toc,toe,IODE 及时间规化
  16. 实用防火与防爆技术培训---第十一讲 可燃固体燃爆特性
  17. 云服务器需要芯片吗,什么时候手机不再需要芯片——计算云端化是不可逆转的未来...
  18. 关于阿里巴巴开发手册不得使用外键与级联,一切外键概念必须在应用层解决的疑惑
  19. 计算机电缆对绞外径怎样算,计算机电缆国家标准是什么
  20. 部门换届推文文字_这是一篇迟迟不想到来的推文

热门文章

  1. 利用VS2010进行SQL Server服务器和本地的数据融合
  2. [导入]如何在标题栏上增加按钮
  3. Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
  4. linux下批量查找UTF-8的BOM文件,并去除BOM
  5. 用canvas画一个刮刮卡
  6. 机器学习重塑供应链管理的10个途径
  7. 【软硬链接总结】描述linux下软链接和硬链接的区别(面试题)
  8. java实现远程唤醒一台计算机
  9. 洛谷P3642 [APIO2016]烟火表演
  10. 原来 GitHub 网红是这么混出来的 如何以正确的姿势参与开源项目