Linux 上下文切换的实现

上下文切换的具体步骤

场景:进程A下CPU,进程B上CPU
1. 保存进程A的上下文环境(程序计数器,程序状态字,其他寄存器…)
2. 用新状态和其他相关信息更新进程A的PCB
3. 把进程A移至合适的队列(就绪,阻塞…)
4. 将进程B的状态设置为运行态
5. 从进程B的PCB中恢复上下文(程序计数器,程序状态字,其他寄存器…)

Ref: 陈奶奶2018.3.29的课件

上下文切换的代码实现

schedule 调度函数

// Ref: linux-2.6.0\kernel\sched.c
/*
 * schedule() is the main scheduler function.
 */
asmlinkage void schedule(void)
{
    task_t *prev, *next;
    runqueue_t *rq;
    prio_array_t *array;
    struct list_head *queue;
    unsigned long long now;
    unsigned long run_time;
    int idx;

    /*
     * Test if we are atomic.  Since do_exit() needs to call into
     * schedule() atomically, we ignore that path for now.
     * Otherwise, whine if we are scheduling when we should not be.
     */
    if (likely(!(current->state & (TASK_DEAD | TASK_ZOMBIE)))) {
        if (unlikely(in_atomic())) {
            printk(KERN_ERR "bad: scheduling while atomic!\n");
            dump_stack();
        }
    }

need_resched:
    preempt_disable();
    prev = current;
    rq = this_rq();

    release_kernel_lock(prev);
    now = sched_clock();
    if (likely(now - prev->timestamp < NS_MAX_SLEEP_AVG))
        run_time = now - prev->timestamp;
    else
        run_time = NS_MAX_SLEEP_AVG;

    /*
     * Tasks with interactive credits get charged less run_time
     * at high sleep_avg to delay them losing their interactive
     * status
     */
    if (HIGH_CREDIT(prev))
        run_time /= (CURRENT_BONUS(prev) ? : 1);

    spin_lock_irq(&rq->lock);

    /*
     * if entering off of a kernel preemption go straight
     * to picking the next task.
     */
    if (unlikely(preempt_count() & PREEMPT_ACTIVE))
        goto pick_next_task;

    switch (prev->state) {
    case TASK_INTERRUPTIBLE:
        if (unlikely(signal_pending(prev))) {
            prev->
上下文切换是指当CPU从一个任务切换到另一个任务时,需要保存当前任务的上下文信息,并加载下一个任务的上下文信息。在Linux系统中,可以使用vmstat命令、pidstat命令、/proc/interrupts文件来查看系统的上下文切换情况。 上下文切换的主要原因有几点: 1. 多任务调度:操作系统需要将CPU资源在多个任务之间进行切换,以实现任务的并发执行。 2. 中断处理:当系统接收到硬件中断信号时,需要暂停当前任务的执行,转而处理中断请求。 3. 用户态与内核态的切换:当用户态进程需要调用内核服务时,会触发上下文切换上下文切换涉及到的资源主要有寄存器、内存、页表等。上下文切换次数过多会导致CPU的资源浪费,降低系统的执行效率。 根据引用的分析,上下文切换共分为三种情况: 1. 自愿上下文切换:当一个任务需要等待某个事件的完成时,会主动释放CPU,从而触发自愿上下文切换。 2. 非自愿上下文切换:当一个任务的时间片用完或发生硬件中断等原因时,会被系统强制调度,触发非自愿上下文切换。 3. 中断上下文切换:当系统接收到硬件中断信号时,会从当前任务切换到中断处理程序,进行中断处理。 至于您提到的Linux上下文切换的实战,可以使用vmstat命令、pidstat命令和/proc/interrupts文件来观察系统的上下文切换情况。具体的使用方法可以参考相关文档或在线资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值