首页 > 代码库 > Linux内核开发 — 进程调度

Linux内核开发 — 进程调度

本节简单介绍内核开发中,进程调度的相关知识点。

 

什么是进程调度

       进程调度就是在已经就绪的进程中选择一个最合适的进程执行的过程。

 

进程调度策略

       实时类调度策略

       非实时类调度策略

进程调度时机

  • 主动式抢占

              当前进程因为需要等待资源等原因主动放弃执行权限,主动要求切换到下一个进程执行。

 

              主动放弃CPU的例子:

              current->state = TASK_INTERRUPTIBLE;

              schedule();

  • 被动式抢占

              当前进程因为优先级、进程属性等原因被迫让出CPU执行权限。

1)用户抢占

在完成系统调用返回用户空间时

在完成中断处理后返回用户空间时

 

2)  内核抢占

·在不支持内核抢占的系统中,进程/线程一旦运行于内核空间,是不允许被抢占的,必须要等到内核线程执行完成、主动放弃CPU或者时间片耗尽后才会释放CPU。

·而在支持内核抢占的系统中, 高优先级的进程/线程是可以抢占正在内核空间运行的低优先级的进程/线程。

·但是在支持的内核抢占的系统中,以下四种情况也是不允许内核抢占的:

  •  内核正在进行中断处理
  • 内核正处于中断上下文
  •  内核正在执行调度
  •   进程持有自旋锁或者readlock/writelock等资源时

·Linux 为了保证在以上四种情况不会被抢占,抢占式内核提供了一个变量(preempt_count)用于记录以上状态。当内核进入以上四种状态时preempt_count变量会加1,当退出以上几种状态时preempt_count会减1,preempt_count 变量放置于thread_info结构体中。

 

进程调度步骤

       清理当前运行中的进程

       选择下一个要运行的程序 (pick_next_task)

       设置新进程的运行环境

       进程上下文切换

Linux内核开发 — 进程调度