调度相关数据结构

1. task_struct

说到调度,第一个首先相当的应该是task_struct,它用于表示一个进程/线程,它可以看做调度的一个实体单位,该结构体中,几个与调度较为密切的成员如下:

struct task_struct {
    int prio, static_prio, normal_prio;
    unsigned int rt_priority;
    const struct sched_class *sched_class;
    struct sched_entity se;
    struct sched_rt_entity rt;
#ifdef CONFIG_CGROUP_SCHED
    struct task_group *sched_task_group;
#endif
    struct sched_dl_entity dl;
...
    unsigned int policy;
    int nr_cpus_allowed;
    cpumask_t cpus_allowed;
}
  • rt_priority是实时进程的优先级,其值范围为0到99,值越大优先级越高;
  • prio和normal_prio表示动态优先级,static_prio是静态优先级,静态优先级由启动时静态分配,例如使用nice值或sched_setscheduler()系统调用。normal_prio基于静态优先级及调度策略计算,prio用于某些情况下内核需要暂时提高进程的优先级。
  • sched_class是调度器类;

2. sched_class

3. sched_entity

struct sched_entity {
    struct load_weight load;
    struct rb_node run_node;
    unsigned int on_rq;
    u64 exec_start;
    u64 sum_exec_runtime;
    u64 vruntime;
    u64 prev_sum_exec_runtime;
}

  • load用于负载均衡,指定了权重,计算该值是调度器的一项重任;
  • run_node是一颗红黑树节点,使得实体可在红黑树上排序;
  • on_rq指示该实体是否在就绪队列中:struct rq;在就绪队列中表示等待调度;
  • exec_start以及接下来的几个变量用于时间统计,主要是记录CPU消耗时间用于CFS调度器。sum_exec_runtime跟踪进程运行时在CPU上执行的总时间,exec_start指示当前执行的开始,例如新进程加入就绪队列或周期性调度器中,每次调用会计算当前时间与exec_start差值叠加到sum_exec_runtime中,而当前时间则设为exec_start,prev_sum_exec_runtime用于计算上次进程执行的CPU时间,vruntime记录进程在执行期间虚拟时钟上流逝的时间数量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 9,629评论 0 23
  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 9,210评论 0 5
  • 1.内存的页面置换算法 (1)最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的...
    杰伦哎呦哎呦阅读 8,707评论 1 9
  • 进程 创建 创建进程用fork()函数。fork()为子进程创建新的地址空间并且拷贝页表。子进程的虚拟地址空间...
    梅花怒阅读 5,963评论 0 7
  • 一岁花,至一栖木。这里是角城,一个现实中找不到的世界。这里的时间也是狭间之里。我书写下故事,告诉你这里发生的故事。...
    银色金属阅读 3,690评论 0 0