进程调度算法

1:可运行队列:调度程序中最主要的数据结构式运行队列(runqueue)。可运行队列是给定处理器上的可运行进程的链表,每一个处理器一个。每一个可投入运行的进程都唯一的归属于一个可运行队列。此外,可运行队列中还包括每一个处理器的调度信息。所以,可运行队列也是每一个处理器最重要的数据结构。为了避免死锁,要锁住多个执行队列的代码必须总是依照相同的顺序获取这些锁:依照可执行队列地址从低向高的顺序。
2、优先级数组:每一个执行队列都有两个优先级数组,一个活跃的和一个过期的。优先级数组是一种可以提供O(1)级算法复杂度的数据结构。优先级数组使可执行处理器的每一种优先级都包括一个相应的队列,而这些队列包括相应优先级上的可执行进程链表。优先级数组还拥有一个优先级位图,当须要查找当前系统内拥有最高优先级的可执行进程时,它可以帮助提高效率。
3、又一次计算时间片:很多操作系统在全部进程的时间片都用完时,都採用一种显示的方法来计算时间片。典型的实现是循环訪问每一个进程,这样可能会耗费相当长的时间,最坏情况为O(N);重算时必须考锁的形式来保护任务队列和每一个进程描写叙述符,这样做会加剧对锁的争用;又一次计算时间的实际不确定。活跃数组内的可运行队列上的进程都还有时间片剩余,而过期数组内的都耗尽了时间片。当一个进程的时间片耗尽时,它会被移至过期数组,但在此之前,时间片已经给它又一次计算好。又一次计算时间片变得很easy,仅仅要在活跃和过期数组之间来回切换,这是O(1)级调度程序的核心。
4、schedule(): 选定下一个进程并切换到它去运行是通过schedule()函数实现的。当内核代码想要休眠时,会直接调用该函数,另外,假设有哪个进程将被抢占,那么该函数也会被唤起运行。schedule()函数独立于每一个处理器运行。首先要在活动优先级数组中找到第一个被设置的位,该位对于这优先级最高的可运行进程。然后,调度程序选择这个级别链表里的有一个进程。这就是系统中优先级最高的可运行程序。假设被选中的进程不是当前进程,就进行上下文切换。
5、计算优先级和时间片: nice值之所以起名为静态优先级,是由于它从一開始由用户指定后,就不能改变。动态优先级通过一个关于静态优先级和进程交互性的函数关系计算而来。effective_prio()函数能够返回一个进程的动态优先级。这个函数以nice值为基数,再加上-5到+5之间的进程交互性的奖励或罚分。 怎么通过一些判断来获取准确反映进程究竟是I/O消耗型的还是处理器消耗型的。最明显的标准莫过于进程休眠的时间长短了。假设一个进程的大部分时间都在休眠,那么它就是I/O消耗型的。假设一个进程运行的时间比休眠的时间长,那它就是处理器消耗型的。还有一方面,又一次计算时间片相对简单了。它仅仅要以静态优先级为基础就能够了。在一个进程创建的时候,新建的子进程和父进程均分父进程剩余的进程时间片。这种分配非常公平而且防止用户通过不断创建新进程来不停地获取时间片。task_timeslice()函数为给定任务返回一个新的时间片。时间片的计算仅仅须要把优先级按比例缩放,使其符合时间片的数值范围要求就能够了。进程的静态优先级越高,它每次运行得到的时间片就越长。调度程序还提供了第二种机制以支持交互进程:假设一个进程的交互性很强,那么当它时间片用完后,它会被放置到活动数组而不是过期数组中。
6、睡眠与唤醒:休眠(被堵塞)的进程处于一个特殊的不可运行状态。进程把它自己标记成休眠状态,把自己从可运行队列移出,放入等待队列,然后调用schedule()选择和运行一个其它进程。唤醒的过程刚好相反:进程被设置为可运行状态,然后再从等待队列中移到可运行队列。休眠有两种相关的进程状态:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。休眠通过等待队列进行处理。等待队列是由等待某些事件发生的进程组成的简单链表。内核用wake_queue_head_t来代表等待队列。等待队列能够通过DECLARE_WAITQUEUE()静态创建,也能够由init_waitqueue_head()动态创建。唤醒操作通过函数wake_up()进行,它会唤醒指定的等待队列上的全部进程。
7、负载平衡:Linux的调度程序为堆成多处理系统的每一个处理器准备了单独的可运行队列和锁。为了使各个可运行队列上的负载平衡,提供了负载平衡程序。假设它发现了不平衡,就会把相抵繁忙的队列中的进程抽到当前的可自行队列中来。负载平衡程序有kernel/sched.c中的函数load_balance()来实现。它有两种调用方法。在schedule()运行的时候,仅仅要当前的可运行队列为空,它就会被调用。此外,它还会被定时器调用:系统空暇时每隔1毫秒调用一次或者在其它情况下每隔200毫秒调用一次。负载平衡程序调用时须要锁住当前处理器的可运行队列而且屏蔽中断,以避免可运行队列被并发地訪问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值