《linux内核设计与实现》Chapter4进程调度(笔记)

来源:互联网 发布:逆光源网络剧全集优酷 编辑:程序博客网 时间:2024/05/20 14:16

4章进程调度



4.0概述

内核以进程调度的方式决定进程哪个进程先运行,何时运行,运行顺序。哎呀,这不是要很复杂的算法?别傻了,别人都写好了,我们需要做的就是去理解一下而已啦。

多任务系统:

1.非抢占式多任务cooperativemultitasking

2.抢占式多任务preemptivemultitaskingLinux属于此,并使用动态方法计算时间片。



4.1
策略决定何时让什么进程运行)

1.进程分为I/O消耗型&处理器消耗型进程

I/O消耗型:大部分时间耗费在等待&提交IO请求(优先处理)

处理器消耗型:大部分时间在执行代码

2.进程优先

优先级越高,时间片越大,提高交互式程序的优先级

Linux优先级范围

1.nice值(-20+19

2.实时优先级(099

3.时间片

4.进程抢占

理解好sleepevoke的关系就好了



4.2Linux调度算法
目标:

1.充分实现O(l)调度:算法在恒定时间完成

2.实现SMP扩展性:每个处理器有自己锁和可执行队列

3.强化SMP亲和力:相关任务同一CPU执行

4.加强交互式性能:高负载下调用交互式响应

5.保证公平:避免饥饿

1.可执行队列

runqueue<kernel/sched.h>

对可执行队列操作前,执行task_rq_lock()/ task_rq_unlock()

2.优先级数组

prio_array<kernel/sched.h>

1.活跃array

2.过期array

3.从新计算时间片

进程时间片耗尽,转到过期array

4.schedule()

作用:选定下一个进程并到此进程执行(会判定优先级,利用优先级数组的优先位图)

使用范围:内核代码休眠时调用;进程抢占时调用;

schedule()独立于处理器运行

5.计算优先级&时间片

动态优先级通过静态优先级&进程交互性的函数计出

1.effective_prio()返回动态优先级

推断进程的消耗性:执行时间/休眠时间,sleep_avg记录

2.task_timeslice()返回新时间片

3.一个进程交互性强,使用完时间片后会放置活跃array

6.睡眠&唤醒

休眠通过等待队列处理(备注:文中有加入等待队列详细过程)


7.负载平衡程序

linux调度程序为对称多处理器系统的每个处理器准备了单独的可执行队列和锁,因此由负载平衡程序解决可执行队列间出现负载不均衡情况

load_balance()负载平衡程序,在出现空队列时被调用,并定时调用

load_balance()算法:

1.load_balance()->find_busiest_queue(),找到最繁忙队列

2从最繁忙队列选择一个优先级数组以便抽取进程

3寻找含有进程并且优先级最高的链表

4选择满足条件进程调用pull_task()

5重复直到消除平衡



4.3抢占和上下文切换

context_switch()上下文切换:一个可执行进程切换到另一个可执行进程

context_switch()的工作:

1调用switch_mm()<sam/mmu_context.h>,把虚拟内存从上一个进程映射切换到新进程。

2调用switch_to()<asm/system.h>,从上一进程处理器状态切换到新进程处理器状态。

(说实话,这个switch_mm()我也不怎么看得懂啊,纠结)

1用户抢占

发生条件:

1从系统调返回用户空间

2从中断程序调返回用户空间

2内核抢占

抢占条件:进程没锁即可(嗯嗯,kernel果然是头猛兽)

发生条件:

1中断处理程序正在执行,且返回内核空间之前

2内核代码具有可抢占性时,也就是没锁时

3内核中任务显式调用schedule()

4如果内核中任务阻塞,系统调用schedule()



4.4实时

实时调度策略:SCHED_FIFO| SCHED_RR

SCHED_FIFO| SCHED_RR都为静态,保证实时优先级高抢占实时优先级低

普通非实时调度策略:SCHED_NORMAL



4.5
与调度相关的系统调用

系统调用:管理与调度程序相关的参数

系统调用种类:

1与调度策略和优先级有关的系统调用

2与处理器绑定有关的系统调用

3放弃处理器时间



Chapter4
进程调度小结:
本章好多知识面,进程调度是比较复杂,好好整理思绪

1.本章讲述了:

进程调度的基本原理、具体实现、调度算法、以及目前Linux内核所使用的接口

2.按照上面个小节的内容可划分为:

进程调度的策略

调度算法

在用户和内核区如何抢占和上下文切换(也就是具体进程调度的实现方法)

最后讲了与调度相关的系统调用


==========================iam a happy dividing line==========================


原创粉丝点击