Linux内核2_6进程调度分析与改进

Linux内核2_6进程调度分析与改进
Linux内核2_6进程调度分析与改进

linux系统进程调度

Linux系统进程调度 姓名: 班级: 学号: 摘要 Linux 自出现以来以惊人的速度在服务器和桌面系统中获得了成功。本文介绍了现代操作系统常见进程调度算法以及linux2.6.32中进程调度的策略并根据具体例子对Linux进程调度过程进行了具体分析。 一、最常用的操作系统调度算法有以下几种; 1.先来先服务调度算法 调度程序按照进程在就绪队列中的提交顺序或变为就绪状态的先后进行调度,是一种最普遍和最简单的方法,所需的系统开销最小。该算法对所有的进程一视同仁,不能反映对实时进程或特殊要求的进程的特殊处理,在实际操作系统中,很少单独使用该算法,而是和其它一些算法配合起来使用。 2.高优先权优先调度算法 1 优先权类型。 1)静态优先权,他是在创建进程时确定的,且在进程的整个运行期间保持不变。 2)动态优先权,他是在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。 2优先权调度算法的类型。 1)非抢占式优先权算法。在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。 2)抢占式优先权调度算法。这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。 3.时间片的轮转调度算法 时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一

2011180021-Linux操作系统-课程设计报告-基于Linux的进程调度模拟程序

河南中医学院 《linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗 指导教师:阮晓龙 完成日期:201X 年06 月22 日 目录 1. 课程设计题目概述3 2. 研究内容与目的4 3. 研究方法5 4. 研究报告6 5. 测试报告/实验报告7 6. 课题研究结论8 7. 总结9

1、课程设计题目概述 随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。本文就是对进程调度进行研究、实验的。 本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解 设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。关键词:linux 进程调度调度算法

计算机操作系统小论文-Linux进程调度

Linux进程调度 一、概述 自1991年Linux操作系统出现以来,Linux操作系统以令人惊异的速度迅速在服务器和桌面系统中获得了成功。它已经被业界认为是未来最有前途的操作系统之一,并且在嵌入式领域,由于Linux操作系统具有开放源代码、良好的可移植性、丰富的代码资源以及异常的健壮,使得它获得越来越多的关注。[1]本文分析了Linux操作系统中几种常用的调度算法。 二、高级、中级和低级调度 在操作系统中,存在很多种调度,如用户提交作业的调度、运行进程的调度、I/O 请求的调度、存储空间切换的调度等。在不同的操作系统中所采用的调度方式不完全相同,在执行调度时所采用的调度算法也可能不同。因此,可从不同的角度对调度进行分类。常用的一种分类方法是按调度的层次,把调度分为高级调度、中级调度和低级调度。 (1)高级调度 高级调度通常也称作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,准备执行。系统接纳一个作业后,将它变为一个或者多个进程,为它们分配除了处理机之外的必要的系统资源后,将其排入就绪队列,准备执行。值得注意的是,在批处理系统中,作业进入系统后,是先驻留在外存上的,因此,需要有作业调度,以将它们分批装入内存;在分时系统中,为了能及时响应,用户通过键盘输入的命令或数据等,都是直接送入内存,因而无须配置作业调度;类似地,在实时系统中,通常也不需要作业调度。 (2)中级调度 中级调度大多针对于分时系统,是按一定的算法在内存和外存之间进行进程对换,目的在于缓和内存的紧张。为此,应使那些暂时不具备执行条件的进程不再占用宝贵的内存空间,将它们挂起并调至外存上等待,称此时进程的状态为挂起状态。当这些进程重新又具备执行条件,且内存已空闲时,再由中级调度决定,将外存上哪些已具备执行条件的进程解除挂起后重新调入内存,排在进程就绪队列上,等待进程调度。 由此可见,中级调度实质上是决定允许哪些进程有资格参与竞争处理机资

LINUX进程调度算法的分析

LINUX进程调度算法的分析 何 翔,顾 新 (西安电子科技大学,陕西西安 710071) 摘 要进程调度对一个操作系统来说是至关重要的,它起着非常关键的作用。本文针对Linux操作系统中的普通进程调度算法进行了分析,对以进程为CPU时间分配单位和以用户为CPU时间分配单位的两种算法进行了分析和对比。对它们在不同环境下对进程调度效率和公平性的影响进行了探讨,并总结出它们各自适用的环境。 最后为了进一步提高进程调度的效率和公平性,提出了混合算法的思想。 关键词进程调度;普通进程;动态优先级 中图分类号 TP316 1 前 言 在Linux操作系统中,有两种常用的普通进程 调度算法。它们分别以进程和用户为调度单位来进 行CPU时间的分配。这两种算法分别体现了多进程 环境下系统运行的高效性和多用户环境下的公平 性。但是这两种算法都有各自的适用环境,因此它 们各自都有优缺点。本文从多用户的公平性和多进 程的高效性出发对这两种算法进行了分析和比较, 最后提出了混合算法的思想,使进程调度更加高效 和公平。 2 进程调度 进程调度要满足高效率,公平性,响应时间快,周转时间短和吞吐量大等要求。Linux操作系统的内核根据进程响应时间的情况把进程分为3大类:交互进程;批处理进程;实时进程。内核在此基础上实现了3种不同的调度策略:SCHED_ FIFO(即先进现出策略);SCHED_RR(即轮转策略);SCHED_OTHER(适合交互分时的程序)。 进程调度时机,即调度器何时开始启动。可以在以下几个时刻进行进程调度: (1)进程状态转换的时刻; (2)可运行队列中新增加一个进程时; (3)当前进程的时间片用完时; (4)进程从系统返回到用户态时; (5)内核处理完中断后,进程返回到用户态时。 在以上几种情况下进程调度可以解释为在下面几 个状态中进行切换。 进程调度的流程如图1所示。 图1 进程调度的流程图 图1的转换条件如下: (1)调度;(2)时间片用完;(3)跟踪并调度; (4)退出;(5)收到信号并醒来;(6)等待资源 到位再调度;(7)等待资源到位再调度;(8)等待 资源到位;(9)资源到位或收到信号。 3 普通进程调度算法的分析 3.1 按进程调度的算法分析 Schedulue()是按进程调度算法的主要函数, 是系统的核心函数。它的核心代码如下: next=idle_task(this_cpu); 电子科技 2005年第9期(总第192期) 21

Linux进程调度器基础讲解

1.1 进程 ?从教科书上,我们都能知道:进程是资源分配的最小单位,而线程是CPU 调度的的最小单位。 ?进程不仅包括可执行程序的代码段,还包括一系列的资源,比如:打开的文件、内存、CPU时间、信号量、多个执行线程流等等。而线程可以共享进程内的资源空间。 ?在Linux内核中,进程和线程都使用struct task_struct结构来进行抽象描述。 ?进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,没有用户虚拟地址空间的进程称为内核线程。 Linux内核使用task_struct结构来抽象,该结构包含了进程的各类信息及所拥有的资源,比如进程的状态、打开的文件、地址空间信息、信号资源等等。task_struct结构很复杂,下边只针对与调度相关的某些字段进行介绍。 struct task_struct { /* ... */ /* 进程状态*/ volatile long state; /* 调度优先级相关,策略相关*/ int prio; int static_prio; int normal_prio; unsigned int rt_priority; unsigned int policy; /* 调度类,调度实体相关,任务组相关等*/ const struct sched_class *sched_class; struct sched_entity se; struct sched_rt_entity rt; #ifdef CONFIG_CGROUP_SCHED struct task_group *sched_task_group;

linux和UNIX调度算法比较分析

Linux与UNIX进程调度策略的比较分析 崔洪星 (华中科技大学机械科学与工程学院 M201170270) 摘要:文章先是阐述了进程调度策略的引入、概念、分类和原则,接着就Linux和UNIX不同操作系统的进程策略进行了描述,最后比较得出结论。 1.进程调度概述 当计算机是多道程序设计系统时,通常会有多个进程竞争CPU。当多个处于就绪态而只有一个CPU时,操作系统就必须决定运行哪一个进程。操作系统中做出这种决定的部分称为调度器。它使用的算法称为调度算法。通常进程调度的功能应由以下3部分组成: (1)确定调度时机 (2)执行调度算法(确定调度策略、计算优先级),即选择哪些 进程运行。 (3)完成调度过程的具体操作,主要是原来运行的进程退出CPU,保护退出进程的运行现场,选中进程占用CPU,恢复选中进程的运行现场。 进程调度分为两大类:一类是抢占式(剥夺式),系统中出现优先权高的可运行进程,立即让它执行;另一类是非抢占式(非剥夺式),系统中即使出现优先权高的可运行进程,也要等到调度时机出现时,才让它运行。 非抢占式的进程调度时机分为两种情况:进程自动放弃CPU和进程由核心态转入用户态。 (1)进程自动放弃CPU有以下几种情况: ●进程已完成(虽然时间片未用完); ●进程等待某事件(如I/0,等待资源,……); ●时间片用完; ●进程需要与其他进程保持同步; ●……

(2)进程由核心态转入用户态时系统产生一次调度,将最高优先权的就绪进程投入运行。 不同的环境需要不同的调度算法,这是因为不同的应用领域有不同的目标。换句话说,在不同的系统中,调度器的优化目标是不同的。为了设计一个调度算法,应当首先明确一个好的调度算法必须做什么。一些目标是根据环境(批处理、交互式或实时)设定的,而另外一些目标是在各种情况下都使用的。公平在所有的情况下,都是非常重要的,相对于处于同等地位的进程而言,给予一个进程更多的CPU时间是不公平的。当然,不同种类的进程应该得到不同的处理。 下面将对Linux和UNIX进程的调度原理分别进行讨论。 2.Linux 进程调度原理 调度程序运行时,要在所有可运行状态的进程中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct 结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter 也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。 Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了以上提到的四项,还结合了一些其他的因素,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。关于goodness()的情况在后面将会详细分析。

linux操作系统课程设计—进程调度优先数法与简单轮转法

《操作系统原理》课程设计报告 姓名:吴沛儒 班级:BX0907 学号:9 指导老师:胡静 二〇一一年十二月十二日

目录 一、《操作系统原理》课程设计的目的与要求.......................................... 错误!未定义书签。 1、目的.................................................................................................. 错误!未定义书签。 2、要求.................................................................................................. 错误!未定义书签。 二、简述课程设计内容、主要功能和实现环境 ...................................... 错误!未定义书签。 1.课程设计内容...................................................................................... 错误!未定义书签。 三、任务的分析、设计、实现和讨论...................................................... 错误!未定义书签。 1、任务的分析...................................................................................... 错误!未定义书签。 2、任务的设计与实现.......................................................................... 错误!未定义书签。 五、附录...................................................................................................... 错误!未定义书签。

Linux进程状态与调度

Linux进程状态与调度 目录 一.进程的状态 1.schedule_timeout 2.wake_up 3.task_struct current 二.内核与用户空间信号传递fasync 一.进程的状态 1.Schedule_timeout 当我们调用schedule_timeout时,有两种情况能打断该定时器,一种为超时,一种为有信号打断。 在该函数的申明中提到 * %TASK_INTERRUPTIBLE - the routine may return early if a signal is * delivered to the current task. In this case the remaining time * in jiffies will be returned, or 0 if the timer expired in time * * The current task state is guaranteed to be TASK_RUNNING when this * routine returns. 配合schedule_timeout,使用__set_currnet_state.对于支持信号打断的schedule_timeout,调用__set_currnet_state设置task state 为 TASK_INTERRUPIBLE,如下, __set_current_state(TASK_INTERRUPTIBLE); Timeout=schedule_timeout(timeout); __set_current_state(TASK_RUNNING); 调用schedule_timeout如果超时之后会自动设置task_state为 TASK_RUNNING,在调用schedule_timeout之后,进程会进入休眠状态,退出进程调度,只有在有关于此进程的事件到来时会被唤醒(各种信号),重新加入进程调度中。 用过msleep都知道所在的task会sleep 相应ms,而实际上其原理就与schedule_timeout和进程状态有关。 当设置current_state为TASK_UNINTERRUPTIBLE时,只能等待超时,signal 无法打断

实验报告四LINUX进程调度与系统监视

实验四LINUX进程调度与系统监视 实验环境:Linux 环境 实验目的: (1)熟练掌握手工启动前后台作业的方法。 (2)熟练掌握进程与作业管理的相关 Shell 命令。 (3)掌握 at 调度和 cron 调度的设置方法。 (4)了解进行系统性能监视的基本方法。 实验内容及操作过程: 1.作业和进程的基本管理 操作要求1: 先在前台启动vi 编辑器并打开f4 文件,然后挂起,最后在后台启动一个查找inittab 文件的find 作业,find 的查找结果保存到f5。 操作过程: (1)以超级用户(root)身份登录到 RHEL Server 5 字符界面。 (2)输入命令“vi f4”,在前台启动 vi 文本编辑器并打开 f4 文件。 (3)按下 Ctrl+Z 组合键,暂时挂起“vi f4”作业,屏幕显示该作业的作业号。 (4)输入命令“find / -name inittab > f5 &”,启动一个后台作业,如下所示。在显示作业号的同时还显示进程号。 结果: 有截图可以看到f4的作业号是1,启动的后台作业f5可以看到作业号为2,并显示进程号为1662. 操作要求2: 查看当前作业、进程和用户信息,并对作业进行前后台切换。 操作过程:

(1)输入命令“jobs”,查看当前系统中的所有作业。 (2)输入命令“fg 2”,将“find / -name inittab > f5 &”作业切换到前台。屏幕显示出“find / -name inittab > f5”命令,并执行此命令。稍等片刻,作业完成后屏幕 再次出现命令提示符。 (3)输入命令“cat f5”,查看“find / -name inittab > f5”命令的执行结果。 (4)再次输入命令“jobs”,可发现当前系统中的只有一个已停止的作业“vi f4”。(5)输入命令“kill -9 %1”,终止“vi f4”作业。 (6)稍等片刻,输入命令“jobs”,查看到当前没有任何作业。 (7)输入命令“ps –l”,查看进程的相关信息。 (8)输入命令“who –H”,查看用户信息。 结果: (1)输入命令“jobs”,查看当前系统中的所有作业。可以看到vi f4作业的作业号为 1,已经停止。“find / -name inittab > f5 &”的作业号为2,已经完成。 作业的作业号为 2,正在运行。 (2)输入命令“cat f5”,可以得到f5的文件目录为/etc/inittab ; (3)输入命令“kill -9 %1”,终止“vi f4”作业。过一会查看jobs时发现当前没有任何作业。 (4)输入命令“ps –l”,查看进程的相关信息,显示出的信息类似如上信息。 主要输出项的含义为: S(State)进程状态,其中 R 表示运行状态;S 表示休眠状态;T 表 示暂停或终止状态;Z 表示僵死状态。 UID(User ID)进程启动者的用户 ID。

2011180016_Linux操作系统_课程设计报告_基于Linux的进程调度模拟程序

河南中医学院《Linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级: 2011级计算机科学与技术 完成学生: 2011180016 朱晨 指导教师:阮晓龙 完成日期: 2014 年 06 月 22 日

目录 1. 课程设计题目概述 (3) 2. 研究内容与目的 (4) 3. 研究方法 (5) 4. 研究报告 (6) 5. 测试报告/实验报告 (16) 6. 课题研究结论 (17) 7. 总结 (18)

1. 课程设计题目概述 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。 本文将基于linux的进程调度进行研究,包括CPU的利用率评价、进程在就绪队列中的等待时间与执行时间之比等。但是由于进程进入就绪队列的随机模型很难确定,而且进程上下文切换等也将影响进程的执行效率,所以在此我们用进程调度的模拟程序并测试系统响应时间的方法来评价进程调度的性能。 关键词:进程调度,并行执行,优先数优先的调度算法,先来先服务算法,优先数,进程控制块。

2. 研究内容与目的 要求:写出课题的研究内容和研究目的。 2.1 研究内容 2.1.1最高优先数优先的调度算法 对就绪队列中的每个进程采用静态优先数,即首先安某种原则定义一个优先数来表示它,处理机调度时,每次选择就绪队列中优先数最大者(也可规定优先数愈小,其优先权愈高),让它占用处理机运行。且本文研究的是非抢占式的最高优先数优先的调度算法。 2.1.2 先来先服务算法 早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU 周期的长短及其他因素。 2.1.3 两种调度算法的对比分析 通过C语言编写分别编写最高优先数优先的调度算法和先来先服务算法的程序,在CactiFans系统下进行分别执行两个程序,然后对执行结果进行分析。 2.2 研究目的 通过对两种调度算法的执行,实现对进程调度进行模拟实验,并对比分析出两种算法的优缺点。

Linux进程调度算法分析

Linux进程调度算法分析 摘要:基于X86平台Linux2.6.26内核进程调度部分代码,刨析Linux进程调度算法,对算法的原理,实现和复杂度进行了分析并提出了算法改进措施。 1. Linux进程调度概述 Linux系统支持用户态进程和内核线程,需要说明的是,Linux没有提供用户态线程支持,实现用户态线程需要引入第三方线程库。 操作系统进程调度是整个操作系统理论的核心,在设计进程调动机制需要考虑的具体问题主要有: 1)调度的时机:在什么情况下,什么时候进行调度。 2)调度的“政策”(policy):根据什么准则挑选下一个进入运行的进程。 3)调度的方式:是“可剥夺”(preemptive)还是“不可剥夺”(nonpreemptive)。 图1.2.1给出了Linux进程状态转换关系: 图1 Linux进程状态转换图 Linux进程调度分为自愿调度和强制调度两种。 1)在内核空间,一个进程可以通过schedule()启动一次调度,也可以在调用schedule()之前,将本进程状态设置为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,暂时放弃运行而进入睡眠。这通常发生在来自用户空间的系统调用被阻塞。在用户空间,用户进程可以通过系统调用nanosleep()达到目的。 2)调度还可以是非自愿的。在一定条件下,内核会强制性剥夺当前进程运行而调度其他进程进入运行。 Linux调度政策基础是时间片轮转+优先级抢占的结合,为了满足不同应用的需要,内核提供了三种调度方法: 1)SCHED_FIFO实时调度策略,先到先服务 2)SCHED_RR实时调度策略,时间片轮转 3)SCHED_NORMAL 分时调度策略(在2.6内核以前为SCHED_OTHER)。用户进程可以通过系统调用sched_setscheduler()设定自己的调度策略。SCHED_FIFO和SCHED_RR的区别是,前者只有在就绪队列中有优先级更高的进程,或进程被阻塞,或自愿调用阻塞原语(如sleep_on_interruptible)的情况下,才会放弃CPU,而如果调度策略是后者,当前进程与就绪队列里其他进程按Round Robin方式共享CPU。 2. Linux进程调度原理 基本的操作系统进程调度算法包括先来先服务(first come first serve),时间片轮转(round robin),多级反馈轮转法(round robin with multiple feedback),优先级法(静态优先级法/动态优先级法),短作业优先法(shortest job first),最高响应比优先法(highest response_ratio next)。不同调度算法应用场合不同,某些调度算法可能仅具有研究价值,实际中鲜有应用;而某些调度算法需要互补以完成设计需求。但是,无论哪种进程调度算法,都要面对以下实际问题: 1)调度器对实时进程的响应; 2)调度器的调度开销,以及系统进程负载对调度的影响; 3)在SMP环境下,当前CPU调度对其他CPU的影响; Linux2.6.x内核进程调度算法为解决上述问题,设计了全新的数据结构和调度算法,但其基本策路仍是以优先级为基础的抢占式调度,与2.6以前内核版本不同,内核抢占可能发

linux进程状态分析

Linux进程状态(ps stat)之R、S、D、T、Z、X Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 Linux进程状态:R (TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。 Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。 处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于 TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。 Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。 与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。 绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill -9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。 而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。(参见《linux 内核异步中断浅析》) 在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。

linux进程调度算法

linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR) linux内核的三种调度方法: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 linux内核的三种调度方法: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。 SHCED_RR和SCHED_FIFO的不同: 当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。 SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。 如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。 相同点: RR和FIFO都只用于实时任务。 创建时优先级大于0(1-99)。 按照可抢占优先级调度算法进行。 就绪态的实时任务立即抢占非实时任务。 所有任务都采用linux分时调度策略时。 1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。 2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。 3,如果没有等待资源,则将该任务加入到就绪队列中。 4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。 5,此时调度程序重复上面计算过程,转到第4步。 6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。 所有任务都采用FIFO时, 1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。 2,如果没有等待资源,则将该任务加入到就绪队列中。 3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。 4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。 5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。 所有任务都采用RR调度策略时 1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。 2,如果没有等待资源,则将该任务加入到就绪队列中。

相关主题
相关文档
最新文档