Welcome 微信登录

首页 / 操作系统 / Linux / Linux内核schedule函数分析

asmlinkage void schedule(void)
{
 task_t *prev, *next;
 runqueue_t *rq;
 prio_array_t *array;
 struct list_head *queue;
 int idx; #判断是否调度发生在中断上下文,如果是就出错;在LINUX的中断中是不允许发生调度的 if (unlikely(in_interrupt()))   
  BUG();need_resched:
 preempt_disable();
 prev = current;
 rq = this_rq(); release_kernel_lock(prev, smp_processor_id());
 prepare_arch_schedule(prev);
 prev->sleep_timestamp = jiffies;
 spin_lock_irq(&rq->lock); 
 if (unlikely(preempt_get_count() & PREEMPT_ACTIVE))
  goto pick_next_task; switch (prev->state) {
 case TASK_INTERRUPTIBLE:
  if (unlikely(signal_pending(prev))) {
   prev->state = TASK_RUNNING;
   break;
  }
 default:
  deactivate_task(prev, rq);
 case TASK_RUNNING:
  ;
 }
pick_next_task:
 if (unlikely(!rq->nr_running)) {
#if CONFIG_SMP
  load_balance(rq, 1);
  if (rq->nr_running)
   goto pick_next_task;
#endif
  next = rq->idle;
  rq->expired_timestamp = 0;
  goto switch_tasks;
 } array = rq->active;
 if (unlikely(!array->nr_active)) {
 
  rq->active = rq->expired;
  rq->expired = array;
  array = rq->active;
  rq->expired_timestamp = 0;
 } idx = sched_find_first_bit(array->bitmap);
 queue = array->queue + idx;
 next = list_entry(queue->next, task_t, run_list);switch_tasks:
 prefetch(next);
 clear_tsk_need_resched(prev); if (likely(prev != next)) {
  rq->nr_switches++;
  rq->curr = next;
 
  prepare_arch_switch(rq);  TRACE_SCHEDCHANGE(prev, next);  prev = context_switch(prev, next);
  barrier();
  rq = this_rq();
  finish_arch_switch(rq);
 } else
  spin_unlock_irq(&rq->lock);
 finish_arch_schedule(prev); reacquire_kernel_lock(current);
 preempt_enable_no_resched();
 if (need_resched())
  goto need_resched;
}Linux下查看16进制文件的方法Linux grub 命令引导过程及Iptables设置相关资讯      Linux内核 
  • IT人员必须了解的六项Linux内核变  (今 12:05)
  • Linux 内核更新:3.10.98、3.14.62  (02月26日)
  • Linux:让手机运行主线内核  (11/26/2015 22:16:17)
  • Linux内核自防护项目  (05月24日)
  • Linux 内核架构的理解  (12/09/2015 09:01:01)
  • Linux内核被指缺乏安全性  (11/07/2015 08:28:47)
本文评论 查看全部评论 (1)
表情: 姓名: 字数


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款