调度器的实现
来源:互联网 发布:xp关闭445端口的方法 编辑:程序博客网 时间:2024/06/07 00:40
内存中保存了对每个进程的唯一描述,并通过若干结构与其他进程连接起来。调度器面对的情形就是这样,其任务是在程序之间共享CPU时间创造并行执行的错觉。该任务分为两个不同的部分:一个涉及调度策略,另一个涉及上下文切换。
1.内核必须提供一种方法,在各个进程之间尽可能的公平的共享CPU时间,而同时又要考虑不同的任务优先级。
下面是linux内核采用的解决方案。
Schedule函数是理解=调度操作的起点。它定义在kernel/sched.c中。调度器的实现受若干因素的影响和稍显模糊。
l 在多处理器系统上,必须注意几个细节,以避免调度器自相干扰。
l 不仅实现了优先调度,还实现了Posix标准需要的其他两种软实时策略。
l 使用Goto已生成中最优的汇编语言代码。这些语句在C代码中来回的跳转,与结构化程序设计的所有原理背道而驰。
Linux调度器的一个杰出的特性是,它不需要时间片的概念,至少不需要传统的时间片。经典的调度器对系统的进程分别计算时间片,使进程运行直至时间片用尽。在所有的进程的时间片用尽时,需要重新计算。
相比之下,当前的调度器只考虑进程的等待时间,即进程在就绪队列中等待了多少时间。对CPU时间的需求最严格的进程被调度执行。
调度器最一般的原理是,按所能分配的计算能力,向系统中的每个进程提供最大的公平性。它试图确保没有进程被亏待。但就CPU时间而论,公平与否意味着什么?在CPU时间内没有进程处于不活跃的状态。但这在真是硬件显然无法实现。如果系统只有一个CPU,至多可以同时运行一个进程。至于实现多任务,只能通过在各个进程之间高频率来回切换。如果采用轮流运行各个进程来模拟多任务,那么当前运行的进程,显然优于那些等待调度器选择的进程,即等待的进程受到了不公平的对待。不公平的程度正比于等待时间。
每次调用调度器时,它会挑选具有最高等待时间的进程,把CPU提供个该进程,如果这种情况经常发生,那么进程的不公平待遇不会累积,不公平会均匀分布到系统的所有进程。
可运行的进程必须排队其结构称之为就绪队列。所有的可运行的进程都按时间在一个红黑树中排序,所谓时间即其等待时间。除此之外就绪队列还装备了虚拟时钟。
2.调度器的数据结构和类
Include/linux/sched.h
Kernel/sched.c
Kernel/sched_fair.c
Kernel/sched_rt.c
- 调度器的实现
- 进程管理和调度 --调度器的实现
- 自动消息调度器的实现
- CFS调度器的实现代码
- FreeRTOS 抢占式调度器的实现
- Linux调度的实现
- NACHOS调度算法的实现
- 进程调度的实现 陈莉君
- 处理机调度算法的实现
- 银行业务调度系统的实现
- 基于Spring任务调度器实现可动态启停的任务调度器
- 一种嵌入式微调度器的实现方法
- 内核源码阅读(八)进程调度器的实现
- 按优先数调度算法实现处理器调度的程序
- Hadoop的调度器
- 调度器的介绍
- 调度器的理解
- Hadoop的调度器
- 节省你时间的 12 个有用的 HTML5 滑块
- btcTrade_project
- windows开启wifi批处理命令
- POJ 2112 Optimal Milking (二分+最短路+最大流or二分图多重匹配)
- PHP闭包(Closure)初探
- 调度器的实现
- 简单说说android的线程封装
- 10812 - Beat the Spread!
- C++中的bitset
- Windows Touch 消息入门-中文这个理
- HTML5开发者心声:浏览器兼容性成最大问题
- spring的几个注意问题
- 检测和跟踪多个触控点-中文整理
- Git中文手册-基本用法