进程调度之入队列

 

wake_up_new_task
	=>int cpu __maybe_unused = get_cpu();
		=>#define get_cpu()		({ preempt_disable(); smp_processor_id(); })
	=>cpu = select_task_rq(p, SD_BALANCE_FORK, 0);//根据负载选择一个合适的CPU
	=>set_task_cpu(p, cpu);//讲p进程绑定到该cpu
	=>rq = cpu_rq(cpu);//取该CPU的运行队列
	=>raw_spin_lock_irqsave(&rq->lock, flags);
	=>p->state = TASK_RUNNING;//进程进入运行态
	=>update_rq_clock(rq);
	=>activate_task(rq, p, 0);//新进程入队列
		=>enqueue_task(rq, p, wakeup, false);
			=>p->sched_class->enqueue_task(rq, p, wakeup, head);//Sched_fair.c (kernel):	.enqueue_task		= enqueue_task_fair,
				=>for_each_sched_entity(se) {
					if (se->on_rq)
						break;
					cfs_rq = cfs_rq_of(se);
					enqueue_entity(cfs_rq, se, flags);
						=>if (!(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATE))
								se->vruntime += cfs_rq->min_vruntime;
						=>update_curr(cfs_rq);
						account_entity_enqueue(cfs_rq, se);
						=>if (flags & ENQUEUE_WAKEUP) {
							place_entity(cfs_rq, se, 0);
							enqueue_sleeper(cfs_rq, se);
						=>update_stats_enqueue(cfs_rq, se);
						=>check_spread(cfs_rq, se);
						=>if (se != cfs_rq->curr)
							__enqueue_entity(cfs_rq, se);//进红黑树
						}
					flags = ENQUEUE_WAKEUP;
				}
			=>p->se.on_rq = 1;
		=>inc_nr_running(rq);
	=>check_preempt_curr(rq, p, WF_FORK);
	=>p->sched_class->task_woken(rq, p);
	=>task_rq_unlock(rq, &flags);
	=>put_cpu();
		=>#define put_cpu()		preempt_enable()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值