内核调度 之schedule

来源:互联网 发布:数据库内连接和外连接 编辑:程序博客网 时间:2024/06/04 18:17

学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,而是中断返回的时候统一调用。

原创粉丝点击