【INT的内核笔记】调度时机与抢占

1. 调度时机

调度时机一般可以分成两类:主动调度和强制调度。

1.1 主动调度

  • 在形式上一般是这样的:

    内核在等待资源的时候,将当前进程移到等待队列,并主动调用schedule()放弃CPU;

  • 主动调度的例子:

    read()系统调用,会调用到wait_on_sync_kiocb(),其中有这么一段

    	while (iocb->ki_users) {
         
    		set_current_state(TASK_UNINTERRUPTIBLE);
    		if (!iocb->ki_users)
    			break;
    		schedule();
    	}
    

    大致就是,资源还未准备的话,就主动调用schedule()放弃CPU;

1.2 强制调度

  • 在形式上一般是这样的:

    • 在系统调用 / 中断处理中设置TIF_NEED_SCHED;

    • 系统调用返回用户态 / 中断返回(可能返回内核态)前,

      检查TIF_NEED_SCHED(中断返回内核态还要检查preempt_count),

      如果进行了设置,则在返回前调用schedule();

  • 强制调度的例子:

    • IO中断的例子,

      阻塞read()的IO资源读取完成,进入中断处理。

      在中断处理中,调用try_to_wake_up()的封装函数,设置TIF_NEED_SCHED;

      中断返回后(假设是返回到用户态),检查到TIF_NEED_SCHED被设置,调用schedule();

    • 时钟中断的例子,

      在时钟中断的中断处理中,调用scheduler_tick(),

      最简单的情况是当普通进程的时间片耗尽后,设置TIF_NEED_SCHED;

      中断返回后(假设是返回到用户态),检查到TIF_NEED_SCHED被设置,调用schedule();

    • 系统调用的例子,

      信号机制中,想发送信号到某个进程时,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的优先级调度算法抢占式代码的示例: ``` struct Process { int pid; int priority; int burst_time; }; // 按照优先级排序的比较函数 bool compare(Process p1, Process p2) { return p1.priority < p2.priority; } // 优先级调度算法的实现 void priorityScheduling(Process processes[], int n) { // 按照优先级从小到大排序 sort(processes, processes + n, compare); // 记录当前时间和已完成的进程数 int current_time = 0, completed = 0; // 循环处理每个进程 while (completed != n) { // 找到优先级最高的进程 int highest_priority = INT_MAX, highest_priority_index = -1; for (int i = 0; i < n; i++) { if (processes[i].burst_time > 0 && processes[i].priority < highest_priority && processes[i].burst_time <= current_time) { highest_priority = processes[i].priority; highest_priority_index = i; } } // 如果找到了一个可执行的进程,就执行它 if (highest_priority_index != -1) { processes[highest_priority_index].burst_time--; current_time++; if (processes[highest_priority_index].burst_time == 0) { completed++; } } // 如果没有找到可执行的进程,就让时间流逝一单位 else { current_time++; } } } ``` 该代码使用了结构体来表示进程,其中包含进程ID、优先级和执行时间。优先级调度算法的核心是按照优先级从小到大排序,并且找到优先级最高的可执行进程。在循环中,如果找到了一个可执行进程,就执行它,并且如果它的执行时间为0,就将已完成的进程数加1。如果没有找到可执行进程,就让时间流逝一单位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值