当我们在平时工作或学习中用电脑的时候,我想很多人都是一边听着音乐一边写代码、看文档、编辑Markdown写笔记或者Chrome看着网页,不知道你有没有好奇电脑为什么可以可以同时完成这些程序的运行,并且如果你细心可能发现了有时候程序的响应快,有时候响应慢。这些都是因为进程&线程调度的结果,哪怕你的电脑处理器只有一核,可同时同时执行多个应用程序。
并不是所有的程序都是cpu密集型的,也有I/O密集型,如下图,a是cpu密集型任务,它有很长的cpu周期,而b则持有cpu的时间短但是却很频繁。如果你是系统的设计者你会让程序如果运行呢?如果每次都先执行完a再执行b,那么磁盘可能长期处于空闲状态,这里有一个简单的想法是,优先保证b进程执行,这样磁盘就可以长期保持忙碌的状态。所以,进程调度的目的一方面是让程序并发执行,一方面是为保持系统各个组件处于忙碌状态避免资源浪费。
下面的笔记是探索进程&线程调度的笔记,一步步揭开处理器调度神秘的面纱。本文的结果,先介绍一些调度的基本概念方便理解后边的内容,然后会介绍调度算法(以单核和进程为视角介绍,线程和进程差不多的),之后会介绍线程调度的特有特征,然后介绍多核心环境下调度,最后可能会简单的举个例子介绍实际OS采用的是什么调度策略。
调度器是操作系统实现的,通过一定的算法从一堆就绪线程中选择一个,然后完成上下文切换,然后执行新调度线程的代码的一个线程,注意调度器也是一个线程,它是一个高优先级的内核线程。
实时系统和批处理和交互式系统不同,这里先列出一些实时系统的基本概念
上面所有算法都是以进程为调度目标是为了简化,线程调度算法和进程的是一样的,其实现代操作系统调度的都是内核线程。下面是上边没有介绍到的线程调度的区别