现代计算机都是多道程序设计系统。在多道程序设计系统中,通常会有多个进程或线程同时竞争同一个CPU。只要有2个或更多的进程处于就绪状态,那么这种情形就发生了:CPU必须要在多个就绪的进程中选择下一个要运行的程序。在操作系统中,完成这个选择工作的程序叫做调度程序(scheduler)。该程序使用的算法叫做调度算法。 许多适用于进程调度的方法同样也适用于线程调度。内核管理线程的时候,调度是按照线程级别进行的,与线程所属的进程没有关联。本文主要讨论同样适用于进程和线程调度的问题。然后介绍线程调度所独有的问题。本文讨论的问题假设机器是单CPU单核。
不同的应用领域有不同的目标,也就需要不同的操作系统。所以,不同的操作系统,需要有不同的调度算法。常见的操作系统分为3类:
说是调度算法的目标,其实也是衡量调度算法的指标。下面将介绍一些适合于所有系统的通用指标,然后再介绍衡量不同类型系统调度算法的指标。
调度算法的好坏取决于目标系统,所以需要对不同类型的应用不同的调度算法。但仍有一些目标适用于所有系统,包括:
采用调度机制和调度策略分离的原则。将调度算法以某种形式参数化,参数可以由用户进程填写。
线程分为用户级线程和内核级线程。 用户级线程场景下,当进程获得CPU的时间片时,由进程内的线程调度程序决定把时间片分给哪个线程。直到该进程被挂起。用户级场景下,运行时系统使用的调度算法通常是轮转调度和优先级调度。唯一的缺陷是缺乏一个时钟中断运行过长的线程,但由于用户级线程之间是合作关系,这种影响通常也不是问题。 内核级线程的场景下,内核选择一个线程,内核级线程是脱离用户级的,内核不会考虑这个线程属于哪个进程。当然如果有必要,内核也做得到。内核对被选中的线程赋予一个时间片,超过时间片则线程被挂起。
用户级线程和内核级线程的差别在于性能。用户级线程的切换只需要少量的机器指令。而内核级线程需要完整的上下文切换,修改内存映射,使高速缓存失效,这导致了若干数量及的延迟。这也就是说,从进程A的一个线程A1切换到进程B的一个线程B1,其代价高于切换到进程A的线程A2。 用户级线程可以使用专为应用程序定制的线程调度程序,这能比内核更好的满足应用程序的需要。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。