关于嵌入式Linux系统进程调度的分析 摘 要:本文结合源代码着重分析了Linux进程调度的依据、策略和调度程序schedule()。 关键词: 嵌入式Linux;进程调度;实时进程;调度策略。 1 前言 处理机(CPU)是整个计算机系统的核心资源,在多进程的操作系统中,进程数往往多于处理机数,这把导致各进程互相争夺处理机。进程调度对系统功能的实现及各方面的性能都有着决定性的影响,其实质就是把处理机公平、合理、高效地分配给各个进程。调度是实现多任务并发执行的必要手段,不同的操作系统有着不同的调度目标。在传统的Unix类分时系统中,保证多个进程公平地使用系统资源,提供较好的响应时间是调度的主要目标;而在强实时操作系统中,总是优先级高的任务优先获得处理机的使用权。 Linux具有内核稳定、功能强大、可裁减、低成本等特点,非常适合嵌入式应用。但是Linux内核本身并不具备强实时特性,且内核体积较大,因此,想要把Linux用于嵌入式系统,必须对Linux进行实时化、嵌入式化。Linux结合实时进程和非实时进程(普通进程)自身的特点,综合了上述几种调度策略,实现了高效、灵活的进程调度。 2 Linux进程调度分析 2.1 Linux进程状态的描述 Linux把进程状态描述为如下五种: TASK_RUNNING:可运行状态。处于该状态的进程可以被调度执行而成为当前进程。 TASK_INTERRUPTIBLE:可中断的睡眠状态。处于该状态的进程在所需资源有效时被唤醒,也可以通过信号或定时中断唤醒。 TASK_UNINTERRUPTIBLE:不可中断的睡眠状态。处于该状态的进程仅当所需资源有效时被唤醒。 TASK_ZOMBIE:僵尸状态。表示进程结束且已释放资源,但其task_struct仍未释放。 TASK_STOPPED:暂停状态。处于该状态的进程通过其他进程的信号才能被唤醒。 2 调度方式 Linux中的每个进程都分配有一个相对独立的虚拟地址空间。该虚存空间分为两部分:用户空间包含了进程本身的代码和数据;内核空间包含了操作系统的代码和数据。 Linux采用“有条件的可剥夺”调度方式。对于普通进程,当其时间片结束时,调度程序挑选出下一个处于TASK_RUNNING状态的进程作为当前进程(自愿调度)。对于实时进程,若其优先级足够高,则会从当前的运行进程中抢占CPU成为新的当前进程(强制调度)。发生强制调度时,若进程在用户空间中运行,就会直接被剥夺CPU;若进程在内核空间中运行,即使迫切需要其放弃CPU,也仍要等到从它系统空间返回的前夕才被剥夺CPU。 3 调度策略 3.1 三种调度策略 (1)SCHED_OTHER。SCHED_OTHER是面向普通进程的时间片轮转策略。采用该策略时,系统为处于TASK_RUNNING状态的每个进程分配一个时间片。当时间片用完时,进程调度程序再选择下一个优先级相对较高的进程,并授予CPU使用权。 (2)SCHED_FIFO。SCHED_FIFO策略适用于对响应时间要求比较高,运行所需时间比较短的实时进程。采用该策略时,各实时进程按其进入可运行队列的顺序依次获得CPU。除了因等待某个事件主动放弃CPU,或者出现优先级更高的进程而剥夺其CPU之外,该进程把一直占用CPU运行。 (3)SCHED_RR。SCHED_RR策略适用于对响应时间要求比较高,运行所需时间比较长的实时进程。采用该策略时,各实时进程按时间片轮流使用CPU。当一个运行进程的时间片用完后,进程调度程序停止其运行并把其置于可运行队列的末尾。 3.2 进程调度依据 Linux只有一个可运行队列,处于TASK_RUNNING状态的实时进程和普通进程都加入到这个可运行队列中。Linux的进程调度采用了动态优先级和权值调控的方法,既可实现上述三种调度策略,又能保证实时进程总是比普通进程优先使用CPU。描述进程的数据结构task_struct中用以下几个数据作为调度依据:
linux学习指导
1# 大 中 小 发表于 2007-7-25 20:28 只看该作者 linux->linux学习指导 所指得类unix系统 指得是包含unix(商标所有权归opengroup所有) ,以及unix各个变体(aix,hp-unix,Solaris,BSD, FreeBSD ,etc ) 以及克隆 例如linux.下面这个是目前最全面的谱系图,大家有兴趣可以看看,了解一下.[unix 谱系图] [url]http://www./unix/[/url] Step 0: 这个阶段的同学基本对OS没有认识, 可以从安装系统, 配置系统,学习各种编辑器的使用, 与脚本的编写.建议从Linux入手,毕竟比较容易得到各种发行版本,而且用户群比较大,有了问题 容易得到解答.推荐的发行版本是桌面Ubuntu,服务器 Debian. 推荐教材: O‘Reilly 出版了一系列的关于linux环境下的工具使用的书. 包括了Bash, vim , emacs, linux 配置等 很多.用到具体工具时可以参考. 入门阶段各个linux社区的FAQ很重要,基本包含了初学者能碰到的大部分问题,好好利用. 例如国内的linuxsir, CLF, CU, etc .国外主要时几个主要的邮件列表. Step 1: 对于系统使用有了基本掌握之后,开始进入编写应用程序阶段 , 进入这阶段前提是 C语言必须 有非常扎实的基础. 如果看完 expert c programming , 觉得没有困难,算是过关 能基本使用vim,emacs ,其中之一 基本会编写makefile. 这阶段学习的必备之书是APUE.作者steven是我非常敬佩的前辈,可惜英年早逝.这本书讲解非常 全面,初学会感到困难,但是坚持下来受益非浅.第二版已经引进可以买到 Howto write makefile 这个有中文的,可以作为写makefile的参考. 这里除了一般的应用程序外有3个重要的分支. A.网络编程. 类unix下有非常丰富的网络工具所以这个是很大的一类分支.网络通信本质上也是 进程间通信,所以steven的进程间通信3卷本就是必看的书(steven生前只完成了2卷 第三卷由他的朋友续写.具体情况不明).作为更进一步可以研究apache的衍生项目 APR和ACE(这个需要比较深厚的C++,设计模式的功底).可以说网络编程是一个非常大的分支, 精通需要耗费很多时间.研究内核看完steven的前2卷即可. B. Xwindows 这个涉及到GUI, 也是一个庞大的分支,研究内核只需要关注X的架构和 驱动之间的关系即可.这个分支很庞大,可是好的书其实不多.只有92年的这个系列 O‘Reilly - The Definitive Guides To The X Window Systems, Vol 1 - Xlib Programming Manual, 3Rd Ed . 最近xserver的架构有很大的变化,xgl的出现石破天惊,看过novell2月在法国的演示 真是无话可说.只能说在创新这一点上我们还没有资格来谈.这点我同意BNN的观点,这 10年我们的任务就是学习,追赶.CLF 上面有一些文章和翻译的project C. 脚本.研究内核掌握Bash即可,不过这几年perl,php,python,ruby都很火爆,国内这 这方面也很红火.这些书如过江之鲫,没啥好说的. Step2: 开始进入OS 的正题, 首先要掌握基本概念 首推 operating system concepts 第六版 通过这本书可以掌握基本概念, 有个感性认识. 然后可以看<<操作系统设计与实现>> 这本书是结合minix这个教学系统来讲的,也是经典书籍 不过很少有人有耐心看完上下两册.现在已经进化到minix3了,老头不甘于只作一个教学系统. minix3 已经改变了很多. 还有一本很好的书籍Operating Systems: A Design-Oriented Approach 这本书很难找, 当年我从一堆垃圾书中掏到这本世图的影印本,印数很小,不过确实是一本好书,作者把每章的概 念对应到java代码 ,深入浅出,可惜没人重视. M. J. Bach , The Design of the UNIX Operating System, Prentice-Hall 经典中的经典 这个阶段主要是从总体上把握OS的整体结构,对各个概念基本了解. step 3: 以linux为平台的内核开发的初级阶段. <<understand linux kernel>> 3th <<Linux Device Driver >> 3th <<Linux kernel Develop>> 2th <<Approach for.x86.and.PowerPC.Architectures>> 介绍unix OS内核的几本重要的书: The Design and Implementation of the FreeBSD Operating System FreeBSD 的经典诠释. The Design and Implementation of the 4.4BSD Operating System 4.4BSD-Lite的经典诠释 《 UNIX 高级教程系统技术内幕 》中文的是96年的老版本,听说出新版了 Solaris Internals: Core Kernel Architecture sun在unix历史上作出了很多贡献,solaris的进程调度 内存管理,文件系统 都有独到之处. 还有线程模型是m:n 的混合模式, 实现方法还有很有意思的. Step4: 从这里开始进入了OS的具体实现和内核很具体的分支. 进入这章之前必须要对编译器, 体系结构有中等水平的认识. 也就是说编译器要看过龙书,体系要看过量化方法这本.最好加上see mips run 调度, 内存管理, 网络协议栈,文件系统,体系相关.进程管理, Linker&&Loader , tool-chain 这些都是很重要的分支都有很重要的应用. 对于调试器原理要有一定的了解,能熟练使用 The Linux® Networking Architecture: Design and Implementation of Network Understanding The Linux Virtual Memory Manager Mel Gorman , 2.4内核内存管理的全面分析, 2.6中改动不小 linux 情景分析 2.4 kernel 的全面分析. 浙大的毛德操,李善平老师力作. [url]www.opensolaris.org[/url] solaris 代码已经公开 可以参考 Wiley.UNIX.Filesystems.Evolution.Design.and.Implementation SunOS50MultithreadArchitecture Wiley - Symbian OS Internals {Real-time Kernel Programming} 这一阶段 书籍已经是辅助,主要是靠查看代码,做实际的修改,实验,比较. <<Linux 内核源代码情景分析>> 作者:胡希明, 毛德操
上下册, 80, 70 元 浙大出版 特点是: 不是传统的先结构, 后代码等等. 以一种类似于情景英语 的手法来研究 linux 的源码. 适于有一定基础的朋友. ==================================================================== 《The Design of The UNIX Operating System》 Author: Maurice J. Bach 中译本:《UNIX 操作系统设计》 --------------------- 翻译者:陈葆钰等 北大版: 32开,黄皮,9.40¥ 机工版: 16开,褐皮,30¥ --------------------- 一本老书,但绝对是bible级的。其内容覆盖了经典UNIX操作系统中的所有基本概念 以及设计思想。阅读者最好能懂一些基本的操作系统理论知识。 ==================================================================== ==================================================================== 《Unix Internals - The New Frontiers》 Author: Uresh Vahalia 中译本:《UNIX 高级教程:系统技术内幕》 --------------------- 翻译者:聊鸿斌等 清华大学出版社出版,16开,桔皮,58¥ --------------------- 一本新书,也是bible级的。其主要特点是80%的内容都是现代UNIX操作系统的新思想 和新概念。对各UNIX大家的精彩设计点都有很详尽的阐述。阅读者最好先看看贝奇那 本书。 ==================================================================== ==================================================================== 《Linux Core Kernel Commentary》 --------------------- Author: Scott Maxwell --------------------- 有中译本,但具体信息不详 对照源码讲Linux内核,版本还比较高,2.2.X。有些新 东西可看看。可惜没讲网络部分的实现。 ==================================================================== ==================================================================== 《Linux Kernel Internals: 2nd version》 --------------------- Author: M Beck ... --------------------- 目前无中译本 以数据结构为主体来介绍内核,内容很丰富,但版本太低(2.0.x),有 些陈旧的东西容易令人误入歧途。 ==================================================================== ==================================================================== 《The Design and Implementation of the 4.4BSD Operating System》 --------------------- Author: McKusick, Bostic, Karels, Quarterman --------------------- 目前无中译本 讲述BSD操作系统最权威的书。书的作者亦即BSD最早的几名开发者。 ==================================================================== ==================================================================== 《Linux 操作系统及实验教程》 --------------------- 作者:李善平,郑扣根(浙大教师) 机工出版 --------------------- 有些内容不错,讲得还比较深入。也缺少网络部分的描述。 ==================================================================== ==================================================================== 《UNIX 系统下的80386》 --------------------- 作者:周明德, 张淑玲 清华出版 --------------------- 讲X86的体系结构。要想看懂/arch/i386下的辕马,最好先看看这本书。 ==================================================================== ==================================================================== 《UNIX Systems for Modern Architectures》 --------------------- Author: Curt Schimmel --------------------- 目前无中译本 如果想了解辕马中SMP的实现。可参考看这本书。 ==================================================================== ==================================================================== 《保护模式下的80386及其编程》 --------------------- 出版社:清华大学出版社 --------------------- 本书全面地介绍了80386的结构。首先是80386实模式和保护模式下的寄存器集和 指令集,接着从保护模式下的虚存管理、保护级、多任务支持、中断和异常等方 面深入地剖析386的强大功能,再接着提供几个典型的编程实例以及一个完整的从 386加电初始化开始到形成一个有基本的多任务和虚拟存储能力的系统的例子并作 了详细解释,最后还清楚地说明了80386与8086/80286的兼容性和差别。本书的特 点是严谨深入,对CPU各种条件下的动作和反应用形式化的微程序讲解得十分清楚, 尤其适合系统程序员阅读。总之,这实在是一本不可多得的好书. ==================================================================== ==================================================================== 《Linux 操作系统的内核分析》 作者:陈莉君编著 --------------------- 价格:40 元 出版社:人民邮电出版社 |
|