Linux进程调度策略与研究

摘要

多核操作系统已经被广泛应用到我们的日常生活,并让我们的生活更加丰

富多彩,系统增加了处理器的数量,这允许以最大化系统任务来分配处理器的

性能。最初,系统中只有一个处理器,在处理器中不用考虑进程的分布,只要

根据其他标准作出判断,现在增加了一个非常重要的因素,原标准必须调整到

新的标准。而有些CPU在处理器中闲置,有些过载,有必要进行适当的调整,以最大限度地提高整个系统的CPU利用率。如何找到这些不平衡在外观上如何

调整,为了使实施的总时间最小,Cache获得更多使用,这将是本文的重点,

从调度到优化系统的性能。

本课题试图分析Linux内核源代码,调度工作原理和规划进程的流程,在

此基础上改进系统。本文主要讨论基于Linux的多芯片SMP的定时进程调度系统,主要内容包括:

1. 研究进程管理调度基本原理;

2. 分析定时任务调度系统,研究时间片轮转调度机制与优先级计算;

3. 在ubuntu系统下实现上面的进程调度程序。

关键词: linux 进程调度分时任务时间片轮转优先级

I

ABSTRACT

Multi-core operating systems have been widely used in our daily lives, and make our lives more colorful, the system increases the number of processors, which allows to maximize the system tasks to allocate processor performance. Initially, there is only one processor in the system, in the processor do not consider the distribution of the process, as long as the other criteria to make judgments, now add a very important factor, the original standard must be adjusted to the new standard. And some CPU in the processor idle, some overload, it is necessary to make appropriate adjustments to maximize the overall system CPU utilization. How to find these imbalances in how to adjust, in order to make the implementation of the total time minimum, Cache get more use, it will be the focus of this article, from scheduling to optimize the system performance.

This topic attempts to analyze the Linux kernel source code, scheduling the working principle and planning process of the process, on the basis of improving the system. This paper mainly discusses the multi-chip SMP timing scheduling system based on Linux, the main contents include:

1. Research process management scheduling basic principles;

1. Analyze the timing task scheduling system, study the time slice rotation scheduling mechanism and priority calculation;

3. Under ubuntu system to achieve the above process scheduler.

KEY WORDS:Linux process scheduling time - sharing task time sheet rotation priority

II

目录

摘要 I

ABSTRACT II

第1章绪论 1

1.1课题研究背景及意义 (1)

1.2 国内外研究现状 (2)

1.3 本文研究内容及方法 (2)

第2章进程管理及其调度 (3)

2.1基本概念 (3)

2.1.1进程 (3)

2.1.2进程在........................ Linux 内核中的实现3

2.2线程及其实现 (8)

第3章 Linux内核任务调度系统研究 (10)

3.1 O(n)调度器 (10)

3.2 Linux 内核 O(1)调度器 (10)

第4章 Linux内核任务调度系统研究 (13)

4.1时间片和优先级的计算 (13)

4.1.1时间片的计算方法 (13)

4.1.2优先级的计算过程 (13)

4.2定时调度模型实现 (15)

第5章全文总结及展望 (22)

5.1 全文总结 (22)

5.2 展望 (22)

参考文献........................................... 错误!未定义书签。致谢 (24)

III

第1章绪论

1.1课题研究背景及意义

随着技术的发展,计算机科学也在不断前进,而CPU 作为计算机最昂贵的资源,发展的速度很快,体积骤减和频率剧增,但是单核处理器的架构越来越繁琐、复杂,不仅给设计带来了相当大的困难,而且还使得CPU 得不到最大化的使用,再加上体积变小,功耗却没有降下来,散热也成了问题,很难使得处理器的设计与实现以及频率的提升能够顺利的进行下去[1]。一来处理器的频率提升出现了天花板效应,很难再提升。微处理器性能的提升很大程度是依赖于工业设计的发展,制造CPU 所需的电阻电容等的体积在急剧的变小,这就使得在同一个处理器内集合很多的设计,然而它们之间的连接线路却成了它们的瓶颈,导致了频率不易于提升。所以一些大公司在研发了 3.8G 赫兹这样的高频率CPU 后,就不在这个方向上继续投入开发力度。二来处理器的功耗也不断飙升。CPU 的制造工艺一直在不停的改善,晶体管的体积革命性的变小,这就便于集成,再加上CPU 的频率提升了,单位面积内功耗比以前更多了,发热量也更大了,这不利于CPU 的稳定工作。

所以转向多核处理器是发展的需要。片上多核处理器CMP(Chip Multi- Processor)[2]就是在那个关键的时刻被提出的,它在一个处理器芯片上封装了多个核心,各个核心能并行地运行各自的任务,非常接近传统的对称多处理器系统(Symmetric Multiprocessors,SMP)[3]。多核处理器中的每个核都可视为一个独立的单元,并且它的实现起来相对容易,对以后的研发也便于扩展,并且发热也没有比单核处理器少。多核处理器在频率不变的情况下通过并行运行多个任务来实现性能的提升,也使得CPU 得到了充分的利用。

多核处理器的发展,对操作系统的相关研究既提供了机遇,又提出了更高的要求。第一,与单核相比,如何在多核环境下各个CPU 间合理地均匀地调派任务才能充分发挥计算机系统结构优势,提高系统整体的性能?其次,如何降低这种底层核心架构的改变对上层计算机系统用户的影响,保持对外接口的稳定?对计算机系统各种使用者而言,最好是实现计算机体系结构尽可能平滑地过渡。一方面,用户界面最好不要发生改变,另一方面,最好能保持对以前开发的软件及程序兼容,节省重复开发的成本。这些都是在设计和开发多核体系结构下系统软件所必须面对和解决的问题。

1

但归结为一点,如何高效率的调派任务以便将多核体系结构的性能发挥到极限是多核平台下研发操作系统的核心命题,这是人们对多核系统软件的最大要求。

1.2 国内外研究现状

针对新的多核平台的相关的操作系统方面的研究从起步至今还比较短暂,许多方面需要完善,特别是缺乏比较完备的进程调度策略。因此,多核平台下操作系统的进程调度问题是当今比较前沿的一个研究热点。在本文,我们基于Linux内核研究其在多核环境下的进程调度问题。尽管相对于其他操作系统的漫长历史来说,Linux 的历史非常短暂,但Linux在从其问世到现在短短的时间之内得到了非常迅猛的发展,已成为主流的多用户多任务的操作系统之一,而且具有良好的特性,特别是其开放性、可靠的安全性及良好的可移植性使其获得了广泛的应用[5]。Linux 与Unix 完全兼容并且开放源代码,也使其成为操作系统的研究人员的不二选择。

从二十世纪六十年代进程的概念由J.H.Sallexer 等人提出以后,人们对进程和任务的组织与调度问题的研究一直是一个热点。Linux 操作系统之所以受到好评,是因为它的高效率很大程度上要归功于其内核进程调度系统的超凡设计。同时,我们又可以借助其开源特性,将最新的操作系统方面相关的思想、研究和技术融合于Linux 操作系统中,通过修改其内核来个性化定制并进一步完善、优化它。近年来,基于Linux 的进程调度研究比较活跃。文献[8]分析了Linux 内核的任务调度流程,指出Linux 内核的调度策略综合了时间片轮转和可剥夺式优先级两种调度策略。高珍等人[9]分析了Linux 内核对SMP 的实现方式。安智平、张德运等[10]设计了进程调度的Master/Slave 模型,并考虑了该模型在Linux 环境下的实现。

1.3 本文研究内容及方法

1. 研究进程管理调度基本原理;

2. 分析定时任务调度系统,研究时间片轮转调度机制与优先级计算;

3. 在ubuntu系统下实现上面的进程调度程序

2

第2章进程管理及其调度

2.1基本概念

2.1.1进程

进程(Process)的概念是在上世纪六十年代被提出的,最初是由MIT 的Multics 和IBM 的TSS/360 系统引用。至今人们从各方面对进程做出过许多种定义。主要考虑了:

(1)进程的并发执行性(S. E. Madnick, J. T. Donovan);

(2)进程作为独立的被系统调度的单位(E. Cohen, D. Jofferson);

(3)进程的抽象性以及任务调度时作为系统分配和释放各种资源的单位(P. Denning);

(4)进程与程序的区别。程序是行为规则的集合,程序的运行即体现为进程(E. W. Dijkstra);

(5)进程是具体操作的序列(Brinch Hansen)。

以上关于进程的描述,尽管角度不同,但它们在实质上是相通的,即进程的动态执行性。因此,进程可被定义为可并发执行的程序对相关数据的一次具体的执行过程,是系统调配资源的单位。进程的基本特征有:并发性;动态性;独立性;异步性以及结构特征。进程在并发执行过程中总是相互制约的。进程在其活动期间至少具备三种基本状态,它们是:执行状态、就绪状态和等待状态。进程的状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。进程在执行期间,可以在三个基本状态之间进行多次转换。

2.1.2进程在 Linux 内核中的实现

进程由操作系统创建。具体到Linux 环境下,系统可以通过调用fork()函数复制一个现有进程来生成新的进程[13]。调用fork()函数的进程是父进程,复制出的进程是子进程。fork()函数返回后,父进程从返回点继续执行,子进程从返回点独立运行。fork()函数在父进程和子进程的返回值不同。另外,fork()函数又是通过clone()函数实现的。为了使子进程执行新的任务,可以通过exec()相关函数装载新的任务。最后通过exit()函数退出。exit()函数的作用是结束进程及释放分配给该进程的各种资源。父进程和子进程可以通过相关函数实现同步。如wait4()函数可用来查询子进程是否结束。进程结束后即成为僵尸进程,

3

由其父进程通过wait()或waitpid()函数进行进一步处理。可以发现,Linux 进程之间存在一个明显的继承关系。所有的进程都是PID(进程标识值)为 1 的init进程的后代。内核在系统启动的最后阶段启动init 进程。值得说明的是,Linux 内核通常把进程称做任务(task)。并使用类型为task_struct、称为进程描述符(process descriptor)的结构来描述进程[14]。该结构定义在文件中。进程描述符包含一个具体进程的所有信息,主要有:

1、进程的状态(Process State)

进程从产生到结束期间会经历几种状态的改变。进程的状态是操作系统决定如何对其调度的重要属性。Linux 环境下进程状态如表2-1 所示。

进程的状态在不同条件下可以相互转换,如图2-1 所示:

4

5

2、和进程调度相关的信息

这些信息一般反映了系统对进程调度的组织方式,比较重要的如进程的优先级,进程是普通进程还是实时进程。相关字段参见表 2-2 说明。

当 need_resched 字段被设置时,在“下一次的调度机会”就调用调度程序schedule()。 counter 代表进程剩余的时间片,是进程调度的主要依据,也可以说是进程的动态优先级,因为这个值在不断地减少;nice 值代表静态优先级,

反映进程拥有的时间片,影响counter 值,可以用nice()函数改变nice 值;policy 代表了操作系统该进程的调度方式,如该进程是按照实时进程的方式被调度还是按照普通进程的方式被调度;rt_priority 是操作系统对实时进程进行调度时的重要依据。

表2-3 说明了进程的调度策略类型。

只有root 用户能通过sched_setscheduler()系统调用来改变调度策略。

3、标识符(Identifiers)信息

最基本的如进程标识符(Process Identifier),其他如用户标识符(User Identifier)、组标识符(Group Identifier)。

4、和进程通信相关的一些信息(IPC)

主要为了使进程在执行期间能够与其他进程进行信息交换。

5、进程链接信息(Links)

相关信息如表2-4 说明。进程通过这些指针可以组织成一颗进程树。

6

6、和时间以及定时器相关的信息(Times and Timers)

进程的生存期(lifetime)是指该进程从产生到结束的这段时间。在此期间,内核要详细统计并更新进程使用CPU 的时间,一般包括用户态执行时间和系统态执行时间。

有了“时间”的概念,可以实现进程的“定时”操作,即判断系统时间是否到达某个时刻,是否应该执行相关的操作。Linux 提供了许多种定时方式,用户可以灵活使用这些方式来为自己的程序定时。

7

7、和文件系统相关的信息(File System)

用来存储进程对文件操作的信息,如访问文件的文件描述符等等。

8、虚拟内存相关信息(Virtual Memory)

进程通过自己的mm_struct 数据结构描述自己独立的地址空间。

9、内存页面管理相关信息

当系统内实际内存分配不足时,Linux 内核内存管理模块会把某些页面搬移到硬盘等辅助存储器。

10、对称多处理器(SMP)信息

Linux 内核对SMP 进行了全面的支持。

11、和处理器相关的环境(上下文)信息(Processor Specific Context)

进程调度过程中需要保存上下文切换时的处理器现场信息。

12、与进程相关的其他信息

2.2线程及其实现

在传统的操作系统中,进程是系统进行调度和资源分配的基本单位,在任一时刻只执行一个控制流程,这就是单线程(结构)进程(Single Threaded Process)。然而随着并行技术、网络技术和软件设计技术的发展,研究人员提出了多线程(结构)进程(Multiple Threaded Process)的概念[15],其思想是把“分配资源”与“被调度”这两项功能独立。进程仍然是操作系统分配资源的独立单位,可以适当避免由于进程被频繁调度而在进程间切换;线程来作为操作系统新的调度单位。可以说,进程实现了程序的并发执行,提高了系统效率;那么线程则可以有效减少系统开销,使多任务系统的并发性能更好。

线程作为可被调度执行的独立实体是进程的组成要素,若某个进程内包含有多个线程,那么该进程就是多线程进程。该进程中的线程共享操作系统分配

8

给该进程的各种资源。多线程进程的内存布局如图2-2 所示。

由于线程具有许多传统进程所具有的特征,所以,也把线程称为轻量进程LWP(Light-Weight Process)。我们期望通过线程在操作系统和程序设计中来改善系统和应用程序的性能。

然而,在Linux 环境下,我们并没有线程这样的结构。Linux 内核并没有对线程做什么特殊的对待,它把线程当做进程处理,也没有特殊的数据结构和调度策略专门为线程服务。线程同样用task_struct 结构来描述并按照进程的管理和调度策略来对待。因此,线程在Linux 环境下可认为是普通的进程。Linux 系统的这种处理方式区别于Microsoft Windows、Sun Solaris 等系统的处理方式。对Linux 操作系统而言,线程并不是什么“轻量级进程”,而仅仅是共享系统内各种资源的一种手段。这一方面简化了线程的设计同时在调度方面,可以不用区分进程和线程,关于线程的调度实际上就是对进程的调度。

9

第3章 Linux内核任务调度系统研究

进程调度是操作系统的核心功能。从Linux 2.4 到Linux 2.6,内核进程调度程序历经数次改进(Linux 内核的修订与改进是相当频繁的),每一次内核调度程序的改善都使内核的性能上升到更高层面。

3.1 O(n)调度器

O(n)调度器是指Linux 2.4 版本内核所采用进程调度程序,基于静态优先级实现。该调度器为系统内所有CPU 维护一个全局运行队列,调度时每次为该队列中优先级最高的那个进程分配CPU 执行。

进程在产生时会得到一个时间片。当进程占有CPU 后,其时间片随着进程的运行逐渐减少至零。当该进程的时间片已消耗完,该进程就必须让出系统分配给它的CPU。当所有在运行队列中的进程的时间片都消耗完后,由内核重新分派时间片。

O(n)调度器的性能受全局运行队列中的任务数量约束。就绪进程越多,查找下一个要运行的进程耗时越长。系统的就绪任务越多,O(n)调度器的效率就越低。而且,给进程分配多长的时间片才合适也很难判断。同时,由于系统内只有一个全局的运行队列,该调度器不适合在多核体系结构下应用。任意一个处理器调度时都需要访问这个全局唯一的运行队列,这样就必须加锁以控制各处理器因访问队列而产生的竞争,而各处理器对锁的争用又会产生新的系统性能瓶颈

3.2 Linux 内核 O(1)调度器

为了改进O(n)调度器,使系统性能在就绪队列拥有大量进程的情况下有所提升,Linux 内核调度器的设计者Ingo Molnar 提出并实现了O(1)调度器。O(1)调度器在进程调度上所需要的时间是恒定的,和就绪队列的任务数没有关系。该调度器效率很高,得到了广泛应用。Linux2.6.23 内核版本之前各版本均采用O(1)调度器。该调度器还被集成到Linux 2.4 内核中以改进调度性能。

运行队列结构struct runqueue 是O(1)调度器中一个关键的的数据结构,它主要用于存储每个CPU 的就绪队列信息。限于篇幅,本文在此只说明struct runquene 最重要的数据成员:prio_array_t *active,*expired。

10

这几个成员是runqueue 中最重要的内容。在Linux 内核中,每个CPU 只维护一个和它一一对应的就绪队列rq,但rq 又根据时间片的使用区分为active和expired 两个队列。active 队列是就绪队列中时间片尚未消耗完的就绪进程组成的队列;expired 队列是就绪队列中时间片已消耗完的就绪进程组成的队列。active 和expired 指针都是prio_array_t 类型。

由typedef struct prio_array prio_array_t;知prio_array_t 类型实际上是prio_array 类型。数据结构prio_array 的定义如下:

struct prio_array{

unsigned int nr_active;

unsigned long bitmap[BITMAP_SIZE];

struct list_head queue[MAX_PRIO];

};

其中:BITMAP_SIZE=5,MAX_PRIO=140。

MAX_PRIO 定义系统拥有的优先级个数,其默认值为140。每一个优先级在内核中都拥有与自己对应的运行队列。同时内核还维护一个优先级位图bitmap,其作用是提高查找当前系统中拥有最高优先级的可执行进程时的效率。优先级位图各个位的初值为零,只有当某个优先级的运行队列不为空时,响应的标志位才为1。优先级数组的示意图如图3-1 所示。

11

12

第4章 Linux内核任务调度系统研究

4.1时间片和优先级的计算

4.1.1时间片的计算方法

在O(1)调度器中,进程刚被创建时,它的初始时间片从父进程那里继承得来,为了避免进程通过反复fork()来窃取时间片,子进程被创建时并不是分配时间片,而是与父进程平分父进程的剩余时间片,即

同时父进程的时间片也减少一半。这一过程是在sched_fork()函数(sched.c 1145)中实现的。

内核以HZ 的频率发生时钟中断,在其处理函数中调用scheduler_tick()函数将进程的时间片减去一毫秒。一旦普通进程消耗完运行时间片time_slice 后,调度器将调用task_timeslice()函数重新计算它的运行时间片,然后把它从CPU 上切换下来,将其重新插入到就绪队列,等待再次被调度。和Linux 2.4 不同,2.6 调度系统中,当进程时间片用完时,会及时地重算。时间片的递减和重算工作都是在scheduler_tick()函数中实现的。

在O(1)调度器中,进程的时间片完全由静态优先级static_prio 决定。

由此可见,不同的用户执行相同的程序,在O(1)调度器中,他们创建的进程将获得相同的静态优先级static_prio,由于时间片完全由static_prio 决定,所以,不同用户执行相同的程序,他们创建的进程将获得相同的运行时间片。这样对高级别的用户是不公平的。

4.1.2优先级的计算过程

O(1)调度器在进行进程调度时是完全根据进程的动态优先级的大小来确定候选进程的,可见优先级是决定进程能否被尽快调度到的关键因素。因此,优先级的计算至关重要。

动态优先级的计算主要由函数effective_prio()完成,该函数实现相当简单,

13

总的来说,它是static_prio 和sleep_avg 的函数

onus 是根据进程的sleep_avg 计算出来的对其动态优先级prio 的奖励。

普通进程的优先级则复杂的多。Linux 2.6 中,优先级prio 的计算不再集中在调度器选择next 进程时,而是分散在进程状态state 改变的任何时候。这些时机有:

①进程被创建时应用程序调用do_fork()创建新进程,在完成拷贝父进程task_t 结构、初始化某些成员后,do_fork()调用wake_up_new_task()函数初始化新进程的sleep_avg、interactive_credit 等,然后调用effective_prio()计算其prio,根据prio 将其插入到就绪队列中等待被CPU 调度。②休眠进程被唤醒时当休眠进程等待的条件满足时,该进程将被唤醒。此时activate_task()函数将调用recalc_task_prio()函数根据休眠时间来更新进程的prio。③从TASK_INTERRUPTIBLE 状态中被唤醒的进程被调度时调度器在选择了候选进程后,如果该进程是从休眠状态中被唤醒的,调度器将给该进程一定的sleeg_avg 奖励,调用recalc_task_prio()函数重新计算其prio,然后根据新prio 将其插入就绪队列中,以利于下次尽早被调度到。④因时间片耗尽被剥夺CPU 时⑤因时间片过长而分段被剥夺CPU 时在时钟中断处理中调用scheduler_tick()函数,对当前进程current 执行时间片减一操作后,如果发现普通进程的时间片太长,为了防止该进程长期垄断CPU,调度器将其时间片进行分散执行:保持时间片长度不变,重算prio,然后根据新prio 调整它在就绪队列中的位置等待下次被调度。在以上五种情况下,内核都会直接或间接的调用effective_prio()函数(/kernel/sched.c)重新计算进程的动态优先级prio,并根据计算结果调整它在就绪队列中的位置。

14

4.2定时调度模型实现

使用动态优先级调度策略和时间片轮转法调度策略C语言代码如下:

#include

#include

#include

#include

typedef struct _pcb {

int pid;

char *pname;

int priority;

int needtime;

int runtime;

int waittime;

struct _pcb *next;

} PCBNode, *PCBList, *PCBPointer;

PCBList pcbList;

void

inputWithPriority(int pcbSize) {

int i;

PCBPointer pcbPointer;

pcbList = (PCBPointer)malloc(sizeof(PCBNode));

pcbList->next = NULL;

PCBPointer pcbCursor = pcbList;

for (i = 0; i < pcbSize; i++) {

pcbPointer = (PCBPointer)malloc(sizeof(PCBNode));

printf("建立第%d 个进程\n", i);

pcbPointer->pid = i;

15

/*printf("\t进程名为: "); scanf("%s", pcbPointer->pname); fflush(stdin); */

/*printf("\t进程名为: "); gets(pcbPointer->pname); fflush(stdin); */

printf("\t优先级为: "); scanf("%d", &(pcbPointer->priority)); fflush(stdin);

printf("\t服务时间: "); scanf("%d", &(pcbPointer->needtime)); fflush(stdin);

pcbPointer->runtime = 0;

pcbPointer->next = NULL;

pcbCursor->next = pcbPointer;

pcbCursor = pcbCursor->next;

}

}

void

print4test() {

PCBPointer cursor = pcbList->next;

while (cursor != NULL) {

printf("%d\t%s\t%d\t%d\n", cursor->pid, cursor->pname, cursor->priority, cursor->needtime);

/*printf("%d\t%d\n", cursor->pid, cursor->priority); */

cursor = cursor->next;

}

}

void

printHorizontalBar() {

int i;

for (i = 0; i <= 33; i++)

printf("-");

16

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系统中的进程调度 解读Linux系统中的进程调度 有人说,进程调度是操作系统中最为重要的一个部分。我觉得这种说法说得太绝对了一点,就像很多人动辄就说"某某函数比某某函数效率高XX倍"一样,脱离了实际环境,这些结论是比较片面的。 而进程调度究竟有多重要呢?首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见《linux进程状态浅析》)。如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系。 所以,如果你的系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程。那么进程调度也就不会太重要。哪个进程可执行,就让它执行去,没有什么需要多考虑的。 反之,如果系统负载非常高,时时刻刻都有N多个进程处于可执行状态,等待被调度运行。那么进程调度程序为了协调这N个进程的执行,必定得做很多工作。协调得不好,系统的性能就会大打折扣。这个时候,进程调度就是非常重要的。 尽管我们平常接触的很多计算机(如桌面系统、网络服务器、等)负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。 当然,这些设计对于低负载(且没有什么实时性要求)的环境,没多大用。极端情况下,如果CPU的负载始终保持0或1(永远都只有一个进程或没有进程需要在CPU上运行),那么这些设计基本上都是徒劳的。 优先级

现在的操作系统为了协调多个进程的“同时”运行,最基本的手段就是给进程定义优先级。定义了进程的优先级,如果有多个进程 同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠 结的了。 那么,进程的优先级该如何确定呢?有两种方式:由用户程序指定、由内核的调度程序动态调整。(下面会说到) linux内核将进程分成两个级别:普通进程和实时进程。实时进 程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。 实时进程的调度 实时,原本的涵义是“给定的操作一定要在确定的时间内完成”。重点并不在于操作一定要处理得多快,而是时间要可控(在最坏情况 下也不能突破给定的时间)。 这样的“实时”称为“硬实时”,多用于很精密的系统之中(比 如什么火箭、导弹之类的)。一般来说,硬实时的系统是相对比较专 用的。 像linux这样的通用操作系统显然没法满足这样的要求,中断处理、虚拟内存、等机制的存在给处理时间带来了很大的不确定性。 硬件的cache、磁盘寻道、总线争用、也会带来不确定性。 比如考虑“i++;”这么一句C代码。绝大多数情况下,它执行得很快。但是极端情况下还是有这样的可能: 1、i的内存空间未分配,CPU触发缺页异常。而linux在缺页异常的处理代码中试图分配内存时,又可能由于系统内存紧缺而分配 失败,导致进程进入睡眠; 2、代码执行过程中硬件产生中断,linux进入中断处理程序而 搁置当前进程。而中断处理程序的处理过程中又可能发生新的硬件 中断,中断永远嵌套不止……; 等等……

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

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

操作系统课程设计+linux操作+进程调度

计算机科学系操作系统课程设计任务书 姓名: 学号: 班级: 专业: 指导老师:

一、引言: Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x8 6系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux以它的高效性和灵活性著称。它能够在PC计算机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。 Linux之所以受到广大计算机爱好者的喜爱,主要原因有两个,一是它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改,无偿对它使用,无约束地继续传播。另一个原因是,它具有Unix的全部功能,任何使用Unix操作系统或想要学习Unix操作系统的人都可以从Linux中获益。 二、linux常用基本命令介绍 1.)Linux目录管理有关命令 pwd ---显示当前工作目录的绝对路径 格式: pwd 2. cd ---改变当前工作目录 命令格式:cd [目录名] 3.Ls--- 列出文件目录的信息 命令格式:ls [可选项] [子目录名] [文件名] 4.mkdir --- 建立目录 命令格式:mkdir [可选项] [目录名] 5.rmdir ---删除目录 本命令用于删除指定的一个或多个目录,必须保证要删除的目录中没有任何文件。 命令格式:rmdir [可选项] [目录名] 2.)更改目录或文件访问权限的命令Ls---查看访问权限 格式: ls –l 文件名 2. chmod ---改变文件或目录的访问权限 命令格式:chmod [可选项] [权限] [目录或文件名] 3.chgrp命令----改变文件或目录所属的组。 命令格式:chgrp [选项] group filename 选项:-R:递归式地改变指定目录及其下的所有子目录和文件的属组 4. chown ----更改某个文件或目录的属主和属组 命令格式:chown [选项] 文件或目录的新属主[.文件或目录所在的新组] [文件名|目录] 3.)显示文件内容的命令 1. cat ----显示,新建,连接文件 4.)文件管理命令 2. cp ---功能:文件或目录的拷贝,如同dos的copy 命令格式:cp [选项] 源文件或目录目标文件或目录 3. mv ---功能:为文件或目录改名或将文件由一个目录移入另一个目录中

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 无法打断

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进程调度与系统监视 实验环境: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。

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下的模拟调度算法 学号:201012120209 姓名:冯文雯 专业:网络工程

课程:操作系统 指导教师:燕孝飞职称: 完成时间:2012年 5 月----2012 年 6 月 枣庄学院信息科学与工程学院制 2012年06 月20日 课程设计任务书及成绩评定 课程设计的任务和具体要求 观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程调度算法,进程切换的理解。 采用动态优先数的方法,编写一进程调度程序模拟程序。模拟程序只进行相应的调度模拟操作 指导教师签字:日期:

指导教师评语 成绩:指导教师签字:日期: 课程设计所需软件、硬件等 系统:Windows 2000上的虚拟机上运行的Red Hat Linux 语言:C/C++ 开发工具:GCC

课程设计进度计划 起至日期工作内容备注6月14日- 收集资料 程序设计 撰写论文 参考文献、资料索引 序 文献、资料名称编著者出版单位号 《LINUX权威指南(第3版)》--------中国电力出版社 《Linux编程技术详解》--------人民邮电出版社 《Linux程序设计(第3版) 》 -------人民邮电出版社 《计算机网络操作系统》--------

目录 摘要………..。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3 1引言 1 常用基本命令的介绍 1.1 关于linux的目录命令 (3) 1.2 关于linux的文件命令 (3) 2 进程调度程序的设计 2.1进程调度 (5) 2.2介绍一下优先权调度 (5) 2.3程序的设计思路 (4) 2.4程序代码 (7) 2.5程序运行情况 (10) 3.实验总结 (11)

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,如果没有等待资源,则将该任务加入到就绪队列中。

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操作系统期末复习资料

电信2012级《Linux操作系统》期末复习提纲 第1章概述 ●操作系统的概念与功能 操作系統的概念: 1.操作系统是计算机系统的一种基本软件,它直接管理和控制计算机的硬件和软件资源,合理地调度资源,使之得到充分的利用;并为用户使用这些资源提供一个方便的操作环境和良好的用户界面。 2.从资源角度看,操作系统是管理和控制计算机资源的软件。 3.从用户角度看,操作系统是用户与计算机的接口。 操作系統的功能: 1.处理器管理:在多道程序间分配和调度CPU,协调各程序的运行。 2.存储器管理:对内存储器进行分配、保护和扩充。 3.设备管理:对设备进行有效地管理和分配,并控制设备完成I/O操作。 4.文件管理:管理文件的存储和检索操作,并对文件实施共享、保密和保护措施。 5.用户接口:提供使用界面,方便用户使用系统功能。 ●Linux系统的特点 1.继承UNIX优秀品质,具有出色的性能和稳定性; 2.遵照GPL许可,自由软件; 3.符合POSIX标准,兼容性好; 4.适用于各种硬件平台,可移植性好; 5.网络功能强大; 6.安全性好。

第2章Linux操作基础 ●命令的格式; 命令名[选项1] [选项2] ... [参数1] [参数2] ... ●简单命令的功能与用法:echo、who、date、cal ●文件系统概念: ?文件命名与通配符 1.文件的命名:Linux 文件名的最大长度是255个字符,通常由字母、数字、‘.’ 、‘_’ 和‘-’ 组成。以‘.’开头的文件是隐含文件。 2.文件名中不能含有‘/ ’字符和空字符‘\0’,因为它们对Linux内核具有特殊含义。如‘/ ’ 表示根目录或路径分隔符。 3.文件名中不应含有以下字符,因为它们对Shell具有特殊含义:; | < > ` " ' $ ! % & * ? \ ( ) [ ] ?文件类型及表示法 1.普通文件(-):包括文本文件、数据文件、可执行的二进制程序等。 2.目录文件(d):一种特殊的文件,用于构成文件系统的分层树型结构。 每个目录文件中至少包括两个文件,“..”表示上一级目录,“.”表示该 目录本身。 3.设备文件:一种特殊文件,Linux 系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。有两类特别的设备文件:字符设备(c) 和块设备(b)。 ?文件(包括目录)权限的含义及表示法(字符和数字表示法) 1.读权限(r):对普通文件,可读取其内容;对目录,可列出其中的文件列 表。 2.写权限(w):对普通文件,可修改其内容;对目录,可在其中建立、删除 文件,或修改文件名。 3.执行权限(x):对普通文件,可执行其内容;对目录,可进入该目录。 4.无权限(-):不能对其作相应的操作。 ?目录结构与路径、当前目录及用户主目录,表示方法 目录结构:Linux的文件系统采用树形目录结构。根目录为/。 路径:文件在目录树中所处的位置。 绝对路径:从根目录沿目录树到文件所在目录的路径名。以‘/’开头。 相对路径:从当前目录沿目录树到文件所在目录的路径名。以./开头,可以省略。 当前目录:用户在Linux系统中始终“处在”某个目录之中,此目录称作当前工作目录或当前目录。 用户主目录:用户刚登录到系统中时所处的目录称为其主目录(home directory),用户的默认主目录是/home/用户登录名。 ●文件系统相关命令的功能与用法: ?目录操作命令:mkdir、rmdir、pwd、cd、ls ?文件操作命令:cat、more、less【文件显示】、cp、rm、mv【文件复制、删除和移动】、wc、sort【文件内容的统计与排序】、chmod【改变文件的 存取权限】、touch【改变文件的时间标签】、umask【设置文件掩码】、 find、grep【文件查找、搜索】 ●命令的输入输出重定向与管道:原理、格式、用法。

相关文档
最新文档