上下文切换

通过上下文切换,虚拟处理器将从运行一个线程切换到运行另一个线程。当固定的时间量(时间片)期满时,数据库服务器不会像操作系统对进程那样预占一个正在运行的线程。 而是,线程会在下列点中的一个点上让步:

当完成任务所需的处理量会引起其他线程等待一段长度过长的时间时,线程在预先确定的点中止。用于这些长时间运行的任务的代码包括处理中的策略点上对让步函数的调用。当线程执行这些任务之一时,它会在遇到让步函数调用时让步。然后,就绪队列中的其他线程将有机会运行。当下一次轮到原来的线程时,该线程将在对让步函数进行调用后立即重新在点上执行代码。对中止函数的预先确定的调用将允许数据库服务器在对性能最有利的点上中断线程。

当线程无法再继续它的任务时,它也会中止直到出现某种条件。例如,当线程等待磁盘 I/O 完成时、当等待来自客户机的数据时或当等待一个锁定或其他资源时,线程中止。

当一个线程中止时,虚拟处理器在线程控制块中保存其上下文。 然后,虚拟处理器将从一队就绪的线程中选择要运行的新线程、从该新线程的线程控制块中装入该新线程的上下文,然后在程序计数器中的新地址处开始执行。下图说明了虚拟处理器如何完成上下文切换。

图: 上下文切换:虚拟处理器如何从一个线程切换到另一个线程


在该图之前的段描述了该图的内容。