网站大量收购独家精品文档,联系QQ:2885784924

进程调度函数schedule分析.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程调度函数schedule分析

进程调度函数schedule()分析主要功能:实现进程的调度,从运行队列的链表中找到一个进程,然后进行分配。可以由几个内核控制路径调用。调用方式:1.当前进程不能获得必要资源而被阻塞,可以直接调用schedule()。将current进程插入适当的等待队列,把状态改为TASK_INTERRUPTABLE或TASK_UNINTERRUPTABLE,然后调用schedule()。一旦资源可用,就从等待队列删除current进程。2.把current进程的TIF_NEED_RESCHED标志设置为1,由于会在恢复前检查这个标志的值,所以schedule()将在之后某个时间被明确调用,以延迟方式调用调度程序。三. 功能分析:asmlinkage void schedule(void){struct schedule_data * sched_data;struct task_struct *prev, *next, *p;struct list_head *tmp;int this_cpu, c;//定义变量,*prev为调度之前进程,*next为调度之后进程 spin_lock_prefetch(runqueue_lock); BUG_ON(!current-active_mm);//current进程的active_mm为空,出错 need_reshced_back; prev=current;//变量初始化this_cpu = prev-processor;(unlikely(in_interrupt())) {printk(Scheduling in interrupt\n);BUG();}//不能再中断程序中执行schedule(),否则会出错release_kernel_lock(prev, this_cpu);sched_data = aligned_data[this_cpu].schedule_data;spin_lock_irq(runqueue_lock);//释放内核锁,开this_cpu中断,并锁住runqueue队列/* move an exhausted RR process to be last.. */if (unlikely(prev-policy == SCHED_RR))//是否为轮转调度if (!prev-counter) {prev-counter = NICE_TO_TICKS(prev-nice);move_last_runqueue(prev);}//prev-counter为逐渐减少的进程时间配额,当为0时就从当前位置到runqueue的末尾。NICE_TO_TICKS将优先级别换算为时间配额,即恢复开始的时间配额switch (prev-state) {case TASK_INTERRUPTIBLE:if (signal_pending(prev)) {prev-state = TASK_RUNNING;break;}//查看当前状态,如果处于TASK_INTERRUPTIBLE且有信号等待处理,内核将状态设置为TASK_RUNNING,让其处理完default:del_from_runqueue(prev);case TASK_RUNNING:;}prev-need_resched = 0;//如果没有信号等待,从等待队列撤出;如果处在TASK_RUNNING继续进行/* * this is the scheduler proper: */repeat_schedule:/* * Default process to select.. */next = idle_task(this_cpu);//指向最佳候选c = -1000;//进程的综合权值list_for_each(tmp, runqueue_head) {p = list_entry(tmp, struct task_struct, run_list);if (can_schedule(p, this_cpu)) {int weight = goodness(p, this_cpu, prev-active_mm);if (weight c)//比较权值c = weight, next = p;}}//调度之前将要调度的进程默认为0号,权值为-1000。0号进程即不会睡眠,也不会死亡。内核遍历可执行队列runqueue的每个进程,用godness计算权值,然后进行比较/* Do we need to re-calculate counters? */if (unlikely(!c)) {struct task_struct *p;spin_unlock_irq(runqueue_lock);

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档