主要讨论的是单核 CPU 的状况下,进行调度的一些算法和思路。讨论都是基于单核 CPU 的条件下进行。算法
在内存中,不管对于用户而言有多少个进程,但在 CPU 运行的时候,老是只有只执行一个进程。进程调度的方式有不少,传统的算法有 FIFO,SJF(shortest job first),多级队列反馈调度。可是因为多进程的出现,必然不会采用单个进程依次执行的状况,因此如今的 CPU 都是对多个进程同时运行,把时间分摊到每一个进程上,这样,对于用户而言,能够感觉到多个进程并行的错觉。缓存
CPU 在对于每一个进程进行分摊的时候,在每次运行一段程序的时候,采用了时间片的概念,即这个时候 CPU 会运行这个程序一个时间段的长度。kernel 进行调度的时候,就是经过动态计算时间片来进行控制和调度选择的。队列
通常而言,进程能够分为两类,将进程分类是有必要的,不一样的进程因为其须要的资源不一样,能够分为 IO 消耗和处理器消耗两类。对于这两类进程的区分,能够有效避免 CPU 的资源的浪费,IO 消耗可能在 IO 时间或者等待用户输入的时间多一些,那么他们须要的 CPU 进行计算的时间相比之下就少,这种分类能够有效的避免资源的浪费。进程
调度策略的核心就是在 CPU 进行效应运行和尽量的让系统利用率,吞吐量之间作 tradeoff。内存
进程因为其做用的不一样,相应的就有不一样的重要性。对于不一样的进程,咱们能够划分一个不一样的优先级,对于优先级比较高的进程先运行,而优先级比较低的程序后运行。对于相同优先级的进程,咱们能够按照轮转的方式,依次进行。这样就造成了一个多级优先级,轮转调度的算法。资源
如今的 Kernel 主要采用的最基本的调度是彻底公平调度 (CFS)的算法进行调度程序。这里并无时间片的概念,只有程序的等待时间。即这个程序在就绪队列中等待了多久。多进程
对于相同优先级的进程而言,咱们应该尽量的保证花在每一个进程的时间均匀。即每一个进程使用的资源同样多。在理想状态下,咱们能够把时间划分红无穷小量,每一个进程都运行相同的无穷小量,而后在进程之间作没有 cost 的进程切换,这样,咱们就能够将资源平均的花在每一个进程上。可是现实的困难是,在进行进程切换的时候,每每会有cost的存在,同时,cpu 的 cache 缓存也会受到影响。test
CFS 的作法是对每一个进程运行一个时间段,而后选择运行最少的进程做为下一个的进程。对于每一个进程应该运行多久,依靠的是其进程的重要性的差值在所对应的运行总时间的比重。即越重要的进程,所得到的时间就越多。同时,每一个进程在运行的时候,老是要有一个最小的运行粒度,不只能够避免饥饿现象的出现,还要避免频繁的调度致使的大量的 cost 。程序