问题描述:
请问各位大虾
Windows进程调度的方式有那几种?
谢谢了
解析:
高级调度:又称作业调度。其主要功能是根据一定的算法,从输人的一批作业中选出若干个作业,分配必要的资源,如内存、外设等,为它建立相应的用户作业进程和为其服务的系统进程(如输人、输出进程),最后把它们的程序和数据调人内存,等待进程调度程序对其执行调度,并在作业完成后作善后处理工作。
低级调度:又称进程调度。其主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。执行低级调度功能的程序称做进程调度程序,由它实现CPU在进程间的切换。进程调度的运行频率很高,在分时系统中往往几十毫秒就要运行一次。进程调度是 *** 作系统中最基本的一种调度。在一般类型的 *** 作系统中都必须有进程调度,而且它的策略的优劣直接影响整个系统的计能。
中级调度:又称交换调度。为了使内存中同时存放的进程数目不至于太多,有时就需要把某些进程从内存中移到外存上,以减少多道程序的数目,为此设立了中级调度。特别在采用虚拟存储技术的系统或分时系统中,往往增加中级调度这一级。所以中级调度的功能是在内存使用情况紧张时,将一些暂时不能运行的讲程从内存对换到外存上等待。当以后内存有足够的空闲空间时,再将合适的进程重新换人内存,等待进程调度。引人中级调度的主要目的是为了提高内存的利用率和系统吞吐量。它实际上就是存储器管理中的对换功能
下面说说进程调度的策略问题(引用参考资料内容):
首先硬件机制上如何保证 *** 作系统的内核调度进程可以一定的时机可以获得CPU,来进行进程调度.?
通常我们会在软件层次上找答案.其实,是通过在CPU的硬件处理机制上实现的.CPU在执行完每个指令的周期后回扫描CPU的内部的一个中断寄存器,查询是否存在中断发生,若没有,则继续执行指令若有,则保存当前的CPU工作环境,跳转到中断服务列程,CPU执行中断服务程序,在推出中断后,跳转到内核调度程序(这是个内核程序,但是是对所有的进程共享的,包括用户进程)此时,内核调度程序占据CPU,进行进程的调度,以决定下个将占用CPU的进程.
接下来就要谈谈什么时候会需要进行进程调度?
在教科书书说到的有几种情况:1时间片到,即每个进程所分配的时间片用完后,要跳转到调度程序2 占用CPU的当前运行进程提出I/O *** 作,发起对内核的系统调用时,在系统调用结束后,跳转到调度程序3 我自己的想法: 当前运行进程对所有内核系统调用的结束时都要跳转到调度程序,根据当前的调度信息来决定下一个可以占用CPU的进程. 我所指的系统调用也包括中断列程.不过对与具体的调度时机,很多书上都写的不清不楚,真不知道他们不懂,还是不屑于写出来告诉我们. 其实除了在大多数硬件中断的触发后跳转到调度程序, 每个时钟中断发生的时候,我觉得都需要跳转到调度程序.(在进入时钟中断列程中,要对进程表中的所有的进程的调度信息进行更新和对各个进程队列的处理),对更新后的进程信息进行处理以决定调度哪个进程. 通常的教科书中都将硬件物理的处理机制和软件的调度处理机制分开,在物理和逻辑两个层次上分开谈,不利于我们理解.最好是把这两个结合起来理解进程调度的工作机制.目前需要解决的是:在什么时候需要内核调度程序占据CPU来调度? 至于调度的算法那就是逻辑层次上要考虑的东西.
其实看了这么多,我也有了些小论文的想法, 因为做的方向是应用在电子电力电路上的嵌入系统控制.该应用对嵌入 *** 作系统的性能就有些特殊的需求:首先体积要小,速度快内核就要小,进程调度要实现抢占式任务调度,且调度切换要快.它的进程调度与通用 *** 作系统的进程调度不同,这是因为它们的要求不一样,嵌入式通常是要求是实时,且严格的讲在电路上的控制系统应该是硬实时,而不象通用系统是非实时,或者是软实时.这跟它们对实时性的要求不同.所以我初步定个题目 "嵌入式系统和通用系统在进程调度上比较和分析,并针对特定的电路控制嵌入实时系统提出一个调度策略". 我想我从明天开始就要准备这方面的资料,分析分析,比较比较,弄篇小论文出来,,不然我都快给它凡死了.
*** 作系统-----进程调度
[/color][color=Gray][/color][color=Blue][/color][color=Lime] 要求:实现按优先级与时间片相结合的进程调度算法
内容:
1:设计进程控制快,进程队列结构(包括:就绪队列,等待队列,运行队列)等必要的数据结构。
2:模拟 *** 作系统进程调度的功能,编写进程调度程序,模拟的处理机分派程序,进程等待函数和进程唤醒函数。
3:编写用户程序,创建6个用户进程。
进程调度的设计方法
1。数据结构
(1)优先级与时间片的设计
◆进程因等待放弃CPU时,优先级置为1(高优先级)
◆进程因时间片到放弃CPU时,优先级置为0(低优先级)
◆优先1对应时间片4;优先级0对应时间片10。
(2)进程控制块(PCB)的内容
进程标识3---9
进程优先级 0,1
进程优先级 0,1
进程等待时间 20
链接指针
2:程序算法
(1)PCB结构,变量与主程序
struct PCB
{
int pname
int pri
int runtime
int waitting
struct PCB*next
}
pcb[7]
struct PCB*running,ready,wait
int sin=0
main()
{ 创建PCB[3]--PCB[9]并插入ready队列;/*pname分别为3--9,
pri=0,runtime=10,waittime=0 */
for()/*系统程序,完成初始化和处理机分派功能 */
{cast{sig=0:swtch
sig=1:waiter
sig=3:proc3
sig=4:proc4
sig=5:proc5
sig=6:proc6
sig=7:proc7
sig=8:proc8
sig=9:proc9}
}
}
(2) 进程调度程序
swtch()
{
while(ready==NULL)wakeup()
移出就绪队列第一个PCB
送running指针;
若pri=1,则runntime=4,否则runtime=10
将running→pname 送sig
}
(3) 将进程等待函数
wait()
{将运行进程插入wait队列,优先数置1;
sig=0
}
(4) 进程唤醒函数
wakeup()
{
将wait队列中所有的PCB中waittime减1;
将wait队列中的所有的waittime=0的PCB揭除;
插入到ready队列中第一个优先级为0的PCB前面
}
调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间。进程调度程序可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统,是像Linux这样的多任务 *** 作系统的基础。
多任务 *** 作系统就是能同时并发地交互执行多个进程的 *** 作系统。可以分为两类:
进程可以分为I/O消耗型和处理器消耗型(进程可以同时展示这两种行为)。
调度策略通常要在两个矛盾的目标中寻找平衡:进程响应迅速和最大系统利用率。Linux为了保证交互式应用和桌面系统的性能,对进程的响应做了优化(缩短响应时间),更倾向于优先调度I/O消耗型进程。
Linux采用了两种不同的优先级范围:
实时优先级和nice值处于互不相交的两个范畴,任何实时进程的优先级都高于普通进程。
时间片是一个数值,它表明进程在被抢占前所能持续运行的时间。
Linux自2.6内核系统开始引入新的进程调度算法,其中最著名的是“反转楼梯最后期限调度算法(rotating staircase deadline scheduler,RSDL)”,被称为“完成公平调度算法(CFS)”。
Linux的CFS调度器并没有直接分配时间片到进程,而是将处理器的使用比例划分给进程,也就是说,进程所获得的处理器时间和系统负载密切相关的。当一个进程进入可运行状态,他就被准许投入运行。Linux的CFS调度器,其抢占时机取决于新的可运行进程消耗了多少处理器使用比。如果消耗的使用比例比当前进程小,则新的进程立刻投入运行,抢占当前进程,否则推迟运行。
Linux调度器是以模块方式提供的,以允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类,它允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。每个调度器都有一个优先级,基础调度器会按照优先级顺序进程遍历调度类,拥有一个可执行进程的最高优先级的调度类胜出,去选择接下来要执行的程序。
CFS允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行的进程。nice值作为进程获得的处理器运行比的权重,nice值越低权重越高。每个进程都按照其权重在全部可行进程中所占比例的“时间片”来运行,任何进程所获的处理器时间是由它自己和其他所有可运行进程nice值的相对差值决定的。为了计算准确的时间片,CFS为完美多任务中的无限小调度周期的近似值设立了一个目标,称为目标延迟。
CFS调度算法的实现,主要关注:
所有的调度器都必须对进程运行时间做记账。CFS通过时间记账确保每个进程只在公平分配给它的处理器时间内运行。
CFS使用调度器实体结构来追踪进程运行记账,该结构为进程描述符(struct task_struct的成员变量):
vruntime变量存放进程的虚拟运行时间,经过了所有可运行进程总数的标准化(被加权的)。以ns为单位,和定时器节拍不相关。CFS使用vruntime来记录一个程序到底运行了多长时间以及它还应该再运行多久。
update_curr()函数实现了记账功能。是由系统定时器周期性调用的,无论进程处于可运行态,还是不可运行态。因此,vruntime可以准确地测量给定进程的运行时间,而且知道谁是应该被下一个运行的进程。
CFS算法的核心:选择具有最小的vruntime任务。
CFS使用红黑树(rbtree)来组织可运行进程队列,其节点的键值为可运行进程的虚拟运行时间vruntime,有利于迅速找到最小vruntime的进程(可通过__pick_next_entity()函数来访问红黑树最左的叶子即可,当然最左的叶子可能被缓存在rb_left_most字段中,可直接读取)。
另外,可通过enqueue_entity/dequeue_entity函数从红黑树中增加/删除进程。这两个函数都会调用update_curr()函数来更新所处理任务的运行时统计数据。
进程调度的主要入口点是schedule()函数,是内核其他部分用于调用进程调度器的入口:选择哪个进程运行,何时将其投入运行。schedule()函数会通过pick_next_task()函数遍历调度类,找出优先级最高的调度类(struct sched_class),再通过调度类的pick_next_entity()函数(会调用__pick_next_entity()函数)来选择要执行的进程。
休眠(被阻塞)的进程处于不可运行的状态。内核对其 *** 作是:进程把自己标记称休眠状态,从可执行红黑树中删除,放入等待队列,然后调用schedule()选择和执行下一个进程。
唤醒:进程被设置为可执行状态,然后从等待队列中移到可执行红黑树中。
其中,等待队列是由等待某些事件发生的进程组成的简单链表。
上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由context_switch函数处理。
用户抢占:
Linux完整地支持内核抢占,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务。只要没有持有锁,内核就可以进行抢占。内核抢占主要发生在:
普通的、非实时的调度策略是SCHED_NORMAL。
Linux提供两种实时调度策略:
Linux为实时调度策略提供一种软实时工作方式。也就是内核调度进程,尽力使进程在它的限定时间内运行,但内核不保证总能满足这些进程的要求。
对应的,硬实时系统保证在一定条件下,可以满足任何调度的要求。
七、与调度相关的系统调用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)