内核调度 之schedule

本文详细介绍了Linux内核中的处理机调度概念,包括调度的时机、策略与实现,并解释了不同状态下的进程如何进行调度。此外还介绍了进程调度中考虑的各种因素及任务结构中的关键字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学OS的时候经常讲到处理机(即CPU)的调度也即任务的调度,现如今与linux的内核代码联系起来。

理解处理机调度要回答3个问题:

1> 调度的时机

2> 调度的策略

3> 调度的实现

 

高级调度:  为任务建立PCB,装入内存

中级调度: 为提高吞吐量和利用率,将任务临时换出内存(swap)

低级调度: 进程调度,为进程分配CPU

 

考虑的因素:

公平    资源利用率    响应时间    周转时间   吞吐量

 

调度的策略:

FIFO, 时间片轮转, 优先权调度(可抢占/不可抢占), 多级反馈带优先级的时间片轮转, 实时调度

 

进程的状态

RUNNING  (ready or running on CPU)

BLOCKED  (interruptable or uninterruptable)

STOPPED

 

进程调度的时机

1. 进程退出(正常退出或者因错退出)

2. 进程blocked(等待资源,调用信号量等都是设置为interruptable 或 uninterruptable, 然后主动调用schedule。进程被唤醒时只更新running队列,不进行调度)

3. 时间片到(实质也是中断程序返回时调用schedule)

4. 新创建高优先级进程(本质为系统调用返回)

5. 进程调用sleep睡眠(设置为TASK_UNINTERRUPTIBLE,然后schedule)

从中断、异常以及系统调用返回时调用ret_from_sys_call,会检测调度标识决定是否要调度。因为内核态和用户态之间的切换需要开销,所以返回前把可以做的都做掉。

 

任务结构中对应调度的字段为:
 need_resched:如果schedule()函数需要在下次唤醒,则设置本字段。
 counter:到下次运行调度时间片剩余的时间嘀哒,由定时器递减。当这个字段的值小于或者等于零时,它被重置为零,同时设置p->need_resched。由于这个可以被进程自身修改,有时也称之为“动态优先级”。
 priority:进程的静态优先级,仅能被系统调用如nice函数,POSIX.1b 的sched_setparam函数,4.4BSD/SVR4 的setpriority函数修改。
 rt_priority:实时优先权。
 policy: 调度策略,指定任务所属的调度种类,任务可以通过调用sched_setscheduler函数修改它。有效的值为 SCHED_OTHER (传统UNIX进程),SCHED_FIFO (POSIX.1b的FIFO 实时进程)和SCHED_RR (POSIX循环实时进程)。如果要标识进程绑定到某个CPU,则可以将SCHED_YIELD与其他任何值“或”操作。

 什么时候设置need_resched呢?一个主要地方是在时钟中断中。时钟中断中会调用update_process_times,会设置进程的need_sched标识。时钟中断不会调用schedule,而是中断返回的时候统一调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值