Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1879359
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: LINUX

2020-08-17 11:01:27

上文讲了cfs调度,今天来简单说下实时调度,它本身相对于cfs会简单一点
其结构代码如下图:

点击(此处)折叠或打开

  1. const struct sched_class rt_sched_class = {
  2.     .next            = &fair_sched_class,// 看,它下来才是cfs,
  3.     .enqueue_task        = enqueue_task_rt,
  4.     .dequeue_task        = dequeue_task_rt,
  5.     .yield_task        = yield_task_rt,

  6.     .check_preempt_curr    = check_preempt_curr_rt,

  7.     .pick_next_task        = pick_next_task_rt,
  8.     .put_prev_task        = put_prev_task_rt,
  9.     .set_next_task = set_next_task_rt,

  10. ...
  11.     .task_tick        = task_tick_rt,

  12.     .get_rr_interval    = get_rr_interval_rt,

  13.     .prio_changed        = prio_changed_rt,
  14.     .switched_to        = switched_to_rt,

  15.     .update_curr        = update_curr_rt,
  16. ...
  17. };
其操作的队列结构为rt_rq:

点击(此处)折叠或打开

  1. struct rt_rq {
  2.     struct rt_prio_array    active;
  3.     unsigned int        rt_nr_running;
  4.     unsigned int        rr_nr_running;
  5. ..
  6.     int            rt_queued;

  7.     int            rt_throttled;
  8.     u64            rt_time;
  9.     u64            rt_runtime;
  10.     /* Nests inside the rq lock: */
  11.     raw_spinlock_t        rt_runtime_lock;
  12. ...
  13. };
其内部结构就是active这个优先级队列,其定义如下:

点击(此处)折叠或打开

  1. struct rt_prio_array {
  2.     DECLARE_BITMAP(bitmap, MAX_RT_PRIO+1); /* include 1 bit for delimiter */
  3.     struct list_head queue[MAX_RT_PRIO];
  4. };
就是根据实时优先级定义了一个位图,位图当中的每一个,对应一个链表,具有相同优先级的所有实时进程都保存在对应的列表当中。其入队和出队就相对简单了,具体实时调度策略有两类,FIFO和RR,其中FIFO可以一直执行,除非自己主动yield,RR就得需要tick相关的定时器来进行调度了~





阅读(4045) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~