zoukankan      html  css  js  c++  java
  • ucore lab6 调度管理机制 学习笔记

    这节虽叫调度管理机制,整篇下来主要就讲了几个调度算法.兴许是考虑到LAB5难,LAB6就仁慈了一把,难度大跳水.平常讲两节原理做一个实验,这次就上了一节原理.权当大战后的小憩吧.

    schedule函数调用点:

    1. proc.c::do_exit 用户线程执行结束,主动放弃CPU控制权。
    2. proc.c::do_wait 用户线程等待子进程结束,主动放弃CPU控制权。
    3. proc.c::init_main initproc内核线程等待所有用户进程结束,如果没有结束,就
      主动放弃CPU控制权;initproc内核线程在所有用户进程结束后,让kswapd内核线程执行10次,用于回收空闲内存资源
    4. proc.c::cpu_idle idleproc内核线程的工作就是等待有处于就绪态的进程或线程,
      如果有就调用schedule函数
    5. sync.h::lock 在获取锁的过程中,如果无法得到锁,则主动放弃CPU控制权
    6. trap.c::trap 如果在当前进程在用户态被打断去,且当前进程控制块的成员变量need_resched设置为1,则当前线程会放弃CPU控制权

    sched.c&.h

    增加了调度器抽象类sched_class和就绪队列run_queue等

    struct sched_class {
        const char *name;
        void (*init)(struct run_queue *rq);
        void (*enqueue)(struct run_queue *rq, struct proc_struct *proc);
        void (*dequeue)(struct run_queue *rq, struct proc_struct *proc);
        struct proc_struct *(*pick_next)(struct run_queue *rq);
        void (*proc_tick)(struct run_queue *rq, struct proc_struct *proc);
    }
    struct run_queue {
        list_entry_t run_list;
        unsigned int proc_num;
        int max_time_slice;
        // For LAB6 ONLY
        skew_heap_entry_t *lab6_run_pool;
    };
    

    sched_init: 初始化计时器链表,就绪队列,最大时间片.绑定default_sched_class并初始化

    default_sched.c&.h

    基于RR调度算法的调度器
    就一队列,队头元素时间片用完了就扔出去,新来的元素都往队尾放

    default_sched_stride_c

    基于stride schedule调度算法的调度器
    就一优先队列,按stride值降序排序.出队的时候根据线程优先级的反比增加stride值

  • 相关阅读:
    [HAOI2012]高速公路(BZOJ2752)
    [SHOI2008]堵塞的交通traffic(BZOJ1018)
    AHOI2009 行星序列Seq (BZOJ1798)
    java注解问题
    回调方法举例
    log4j将日志文件保存到项目中
    ehCache+springMVC的简单实用
    MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
    mybatis配置log4j
    mybatis ---- 分页 (拦截器)
  • 原文地址:https://www.cnblogs.com/kangyupl/p/12845925.html
Copyright © 2011-2022 走看看