上篇文章介绍了 Linux 进程的数据结构和创建、退出。
这篇文章我们来看下处理器在调度不同进程时有什么策略,我们开发者可以如何影响处理器的调度。
什么是调度
首先我们来看下,调度的基本概念:
- 调度对象
- 调度策略
我们知道进程/线程有很多状态:
- TASK_INTERRUPTIBLE:可中断的睡眠,等待资源时进入,除了资源,还可以被信号中断唤醒
- TASK_UNINTERRUPTIBLE(D状态):不可中断睡眠,必须得等到资源才能唤醒
- TASK_RUNNING:等待执行或者正在执行
处理器调度的对象,是就绪(TASK_RUNNING)的线程(因为 I/O 或者锁等原因进入阻塞状态的线程,暂时不会被调度)。
在多个任务并行执行时,究竟由哪个进程执行,有 2 种机制:
- 抢占式
- 协同式
抢占式就是由调度器决定谁来运行、运行多久,同时在运行时间片结束后,强制切换到下一个进程。
协同式就是由用户态进程自行决定是否要占用 CPU 还是让出,目前比较火的“协程”就是这种理念,好处就是一个进程内的协程切换不需要内核参与,CPU 缓存数据也不需要反复切换,性能更好。
Linux 中采用的是抢占式调度,所