进程调度1 --- switch_to函数三个参数的理解

本文探讨了进程切换中的关键任务,包括决定进程执行时间和选择下一个进程,以及如何通过context_switch函数确保进程执行环境的一致性。核心在于switch_to函数在上下文切换中的作用。
摘要由CSDN通过智能技术生成

进程切换有两个任务要实现:

  1. 内核必须决定何时进行调度, 由此会有两个问题: 每个进程分配多长时间, 哪一个进程是调度的下一个进程
  2. 内核从进程A切换到进程B时, 必须确保进程B的执行环境与上一次撤销其处理器资源时完全相同

当内核选择要切换到的新进程之后, 下一步进行上下文切换, 这一步的工作主要由context_switch函数完成.

/* kernel/sched.c */
asmlinkage void __sched schedule(void)
{
    // .... 找到被调度进程
    if (likely(prev != next)) {
		next->timestamp = now;
		rq->nr_switches++;
		rq->curr = next;
		++*switch_count;

		prepare_arch_switch(rq, next);
		prev = context_switch(rq, prev, next);
		barrier();

		finish_task_switch(prev);
	} else
		spin_unlock_irq(&rq->lock);
    // ... 
}

static inline
task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next)
{
	struct mm_struct *mm = next->mm;
	struct mm_struct *oldmm = prev->active_mm;

	if (unlikely(!mm)) {
		next->active_mm = oldmm;
		atomic_inc(&oldmm->mm_count);
		enter_lazy_tlb(oldmm, next);
	} else
		switch_mm(oldmm, mm, next);

	if (unlikely(!prev->mm)) {
		prev->active_mm = NULL;
		WARN_ON(rq->prev_mm);
		rq->prev_mm = oldmm;
	}

	/* Here we just switch the register state and the stack. */
	switch_to(prev, next, prev);

	return prev;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值