Linux中进行进程切换的调度方式有两种:
1. 抢占式调度(Preemptive Scheduling):在抢占式调度中,操作系统可以在任何时候强制剥夺当前正在运行的进程,并切换到另一个可运行的进程。这种调度方式基于时间片轮转(Round Robin)调度算法,每个进程被分配一个固定的时间片,当时间片用完时,操作系统会暂停当前进程并选择另一个处于就绪状态的进程运行。
2. 非抢占式调度(Non-preemptive Scheduling):在非抢占式调度中,进程只有在主动释放CPU或发生某些特殊情况(如阻塞、等待IO等)时,才会切换到另一个可运行的进程。这种调度方式通常基于优先级调度算法,较高优先级的进程可以一直运行,直到主动放弃CPU或被某个更高优先级的进程抢占。
其中,Linux内核中通过系统调用`schedule()`来进行进程切换。当调度器认为当前进程的时间片已经耗尽或满足某个切换条件时,它会调用`schedule()`函数来选择一个新的进程运行。`schedule()`函数会根据当前的调度策略(如CFS、实时调度等)选择下一个合适的进程,并进行上下文切换,将CPU控制权交给新的进程。
需要注意的是,抢占式调度和非抢占式调度的选择是由内核的编译选项决定的。一般情况下,Linux内核使用的是抢占式调度,但在某些特殊场景下(如实时系统),可能会选择非抢占式调度以满足实时性要求。
向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti