上下文切换是在两个进程之间花费的时间(即,使等待进程进入执行状态并将正在执行的进程发送到等待状态)。这发生在多任务处理中。操作系统必须将等待进程的状态信息带入内存,并保存当前运行进程的状态信息。
为了解决这个问题,我们想记录交换过程的第一条和最后一条指令的时间戳。上下文切换时间是两个进程之间的差异。
举个例子:假设只有两个进程,P1 和 P2。
P1 正在执行,P2 正在等待执行。在某些时候,操作系统必须交换 P1 和 P2,让我们假设它发生在 P1 的第 n 条指令处。如果 t(x, k) 表示进程 x 的第 k 条指令的时间戳(以微秒为单位),则上下文切换将采用 t(2, 1) – t(1, n)。
另一个问题是交换由操作系统的调度算法控制,并且可能有许多内核级线程也在进行上下文切换。其他进程可能会争用 CPU 或内核处理中断。用户对这些无关的上下文切换没有任何控制权。例如,如果在时间 t(1, n) 内核决定处理一个中断,那么上下文切换时间就会被夸大。
为了避开这些障碍,我们必须构建一个环境,使得在 P1 执行后,任务调度器立即选择 P2 运行。这可以通过构建数据通道来实现,例如 P1 和 P2 之间的管道。
也就是说,让我们允许 P1 作为初始发送者,P2 作为接收者。最初,P2 在等待数据令牌时被阻塞(休眠)。当 P1 执行时,它通过数据通道将数据令牌传递给 P2,并立即尝试读取响应令牌。上下文切换结果和任务调度程序必须选择另一个进程来运行。由于 P2 现在处于准备运行状态,因此它是任务调度程序选择执行的理想候选者。当 P2 运行时,P1 和 P2 的角色互换。 P2 现在作为发送方,P1 作为被阻止的接收方。
总结——
- P2 阻塞等待来自 P1 的数据
- P1 标记开始时间。
- P1 向 P2 发送一个令牌。
- P1 尝试从 P2 读取响应令牌。这会导致上下文切换。
- P2 被调度并接收令牌。
- P2 向 P1 发送响应令牌。
- P2 尝试从 P1 读取响应令牌。这会导致上下文切换。
- P1 被调度并接收令牌。
- P1 标记结束时间。
关键是数据令牌的传递会引发上下文切换。设 Td 和 Tr 分别为传递和接收数据令牌所花费的时间,设 Tc 为上下文切换所花费的时间量。在第 2 步,P1 记录令牌交付的时间戳,在第 9 步,它记录响应的时间戳。这些事件之间经过的时间量 T 可以表示为:
T = 2 * (Td + Tc + Tr)
这个公式的出现是由于以下事件:
- P1发送令牌(3)
- CPU 上下文切换 (4)
- P2收到(5)
- P2 然后发送响应令牌 (6)
- CPU 上下文切换 (7)
- 最后,P1收到它(8)
GATE CS 练习题 –
- GATE-CS-2006 |第 85 题
- 门 CS 1998 |第 52 题