FreeBSD ULE调度器浅析

FreeBSD 5-CURRENT刚刚引入了一个名为ULE调度器的内核调度单元调度器。这个调度器在SMP系统中的效率要远好于FreeBSD以前版本的调度器(目前,那个调度器被称为4BSD调度器)。

新的ULE调度器的设计更像Solaris和Linux等操作系统的调度器。Solaris的SMP性能非常好这一点是它的卖点之一,其调度器采用的优秀算法就是一个很重要的原因。BSD派生系统,尽管由于系统整体设计的合理,以及操作系统其他部分的卓越性能弥补了它在SMP调度器上的不足,甚至尽管FreeBSD在绝大多数情况下的性能都超过

其他系统,但它使用的4BSD调度器的SMP性能不高仍然为人诟病。

令人高兴的是,全新设计的ULE调度器引入了Solaris、Linux等系统在SMP调度方面的先进算法,并且,它在单处理器系统中的性能也相当不错,与4BSD调度器的性能相当。

为什么新的ULE调度器能够获得更高的性能呢?最主要的原因在于,新的ULE调度器为每一个CPU单独维护运行队列,并且,CPU之间能够相互“窃取”对方就绪队列中的任务,从而达到更好的平衡。基本上,ULE调度器的设计符合下面的原则:尽可能利用更多的执行资源,尽可能使用局部锁,尽可能避免使用浪费执行资源的自旋锁,尽可能采用高效的调度算法(目前ULE调度器采用的算法的复杂度是O(1))。

在笔者撰写这篇文章的时候,ULE调度器仍然处于进一步完善的过程中。一方面,它已经能够提供比4BSD调度器更好的调度性能——内核态调度开销减少大约25%,而用户态的计算也有一定程度的缩减。

本文所说的ULE调度器(src/sys/kern/sched_ule.c)的cvs tag是

$FreeBSD: src/sys/kern/sched_ule.c,v 1.8 2003/02/03 05:30:07 jeff Exp $

未来版本的ULE调度器可能会和这个版本有一些出入,但不会太大。

如果需要,您可以在这里下载所需的源代码[当然,我个人建议您还是checkout一份FreeBSD-CURRENT的源代码]。由于引用

了调度器中的代码,根据源代码的授权许可协议,以下首先重述它的版权声明。这份代码使用的是典型的BSD风格授权。为了不至造成阅读困难,这断代马没有作语法点亮。

/*-
 * Copyright (c) 2003, Jeffrey Roberson
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 * notice unmodified, this list of conditions, and the following
 * disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
中文大意如下,供参考;与英文不一致的地方以英文版本为准。
版权所有

2003 Jeffrey Roberson ,保留所有权力。
在满足下列条件的前提下,允许重新分发修改过或未经修改的,以源代码或已编译形式存在的本软件:
1. 以源代码形式的发布必须保留未经修改的上述版权声明、本许可条件,以及其后的不承诺条款。
2. 以已编译形式的发布必须在发布版本的文档和/或其他资料上重述上述版权声明、本许可条件,以及其后的不承诺条款。
此软件由其作者以“即此”方式提供。无论明示的或暗示的,包括但不必限于间接的关于基于某种目的的适销性、实用性,在此皆明示不予保证。在任何情况下,作者皆不对由于使用此软件造成的,直接、间接、连带、特别、惩戒或因此而来造成的损害(包括,但不必限于获得替代品及服务,无法使用,丢失数据,损失盈利或业务中断),无论此类损害是如何造成的,基于何种责任推断,是否属于合同范畴,严格赔偿责任或民事侵权行为(包括疏忽和其他原因)承担任何责任,即使预先被告知此类损害可能发生。

在这个调度器中,仍然有许多部分标注了“XXX”,这些部分目前还没有经过充分的优化,或者需要在未来进行较大规模的修改;此外,其中的注释有一些和源代码不一致的地方,这些部分我会尽量进行最低限度(即,不影响代码原意)的修正或避开。此外,部分调度器的细节我也不打算进行详细的描述——这可能包括一些与调度器本身关系不密切的宏定义,等等。如果您对调度器的这些部分感兴趣,请自行察看代码。

时间: 2025-01-02 15:19:18

FreeBSD ULE调度器浅析的相关文章

Yarn 调度器Scheduler详解

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资源的就是Scheduler.其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景.为此,Yarn提供了多种调度器和可配置的策略供我们选择. 一.调度器的选择 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS ched

kernel学习之调度器发展史

调度器的主要工作是在所有 RUNNING 进程中选择最合适的一个.作为一个通用操作系统,Linux 调度器将进程分为了三类:             交互进程:此类进程有大量的人机交互,因此进程不断地处于睡眠状态,等待用户输入.典型的应用比如编辑器 vi.此类进程对系统响应时间要求比较高,否则用户会感觉系统反应迟缓. 批处理进程:此类进程不需要人机交互,在后台运行,需要占用大量的系统资源.但是能够忍受响应延迟.比如编译器. 实时进程:实时对调度延迟的要求最高,这些进程往往执行非常重要的操作,要求

监听器初始化Job,JobTracker相应TaskTracker心跳,调度器分配task分析

监听器初始化Job,JobTracker相应TaskTracker心跳,调度器分配task的源码级分析 JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信,并获取分配它的任务.用户将作业提交到JobTracker之后,放入相应的数据结构中,静等被分配.mapreduce job提交流程源码级分析(三)这篇文章已经分析了用户提交作业的最后步骤,主要是

使用Informix Dynamic Server调度器和SQL API

新的数据库管理特性简介 IBM IDS 11提供了一组令人期待的新特性,这组新特性形成了RDBMS自管理的基础.这些工具使DBA可以收集服务器信息,并使用SQL作为远程管理工具调整数据库服务器.此外,调度器还可以对 SQL API 命令的执行进行调度,这很像 UNIX cron 任务.IBM IDS 本身已是声誉卓著的免管理数据库,如今又降低了管理与问题诊断的成本,其价值更上一个台阶. IBM IDS 11实现的管理方面的增强有: 一个新的系统数据库(sysadmin) 数据库调度器 管理性SQ

Event Scheduler:MySQL的事件调度器

一.概述 事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能 用操作系统任务调度器才能完成的定时功>能.例如,Linux 中的 crontabe 只能精确到每分钟执行一 次,而 MySQL 的事件调度器则可以实现每秒钟执行一个任务,这在一些对实时性要>求较高的环境下 就非常实用了. 事件调度器是定时触发执行的,在这个角度上也可以称作是"临时的触发器".触发器只是 针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间

在J2EE环境中使用Quartz企业级计划调度器(2)

3 自动启动Servlets 我们希望在应用被部署或容器启动时就提交任务.我们必须在web模块并重启动的时候 初始化QuartzInitializerServlet 和 howto.quartz.servlet.QuartzServlet.为了达到 这个目的,我们需要在Web应用的部署描述符(web.xml)中增加以下内容: <servlet> <servlet-name>QuartzInitializer</servlet-name> <display-name

在J2EE环境中使用Quartz企业级计划调度器(1)

Quartz 是来自OpenSymphony的一个开发源代码的企业级工作计划调度器.要了解详情以及下载Quartz请访问http://www.quartzscheduler.org/quartz/.你可以在你的J2EE应用如EJB中使用Quartz来调度工作计划.本文将会介绍在你的J2EE应用中如何使用Quartz来安排工作计划.文章中将会使用Oracle应用服务器10g J2EE容器(OC4J 9.0.4)作为J2EE容器的例子. Quartz 支持多种类型的工作和触发器,但其中最流行的就是c

Sparrow: 适用于细粒度tasks低延迟调度的去中心化无状态分布式调度器

背景介绍 Sparrow的论文收录在SOSP 2013,在网上还可以找到一份作者的talk ppt,值得一提的是作者是位PPMM.她之前发表过一篇The Case for Tiny Tasks in Compute Clusters,这篇文章我没有仔细看过,但是当时在看mesos粗细粒度模式的时候,组里有讨论过这篇论文.再结合她的github上的项目,发现她和AMP实验室里Mesos,spark等项目,在研究方向和合作上还是有很多渊源的.透过Sparrow,结合对Mesos.YARN的一些了解,

工作流调度器azkaban安装

概述 2.1.1为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行; 例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示: 1. 通过Hadoop先将原始数据同步到HDFS上; 2. 借助MapReduce计算框架对原始数据进行转