Cracking the coding interview--Q18.2

来源:互联网 发布:linux怎样安装压缩文件 编辑:程序博客网 时间:2024/06/04 00:43

题目

原文:

How can you measure the time spent in a context switch?

译文:

怎样计算上下文切换的时间?

解答

上下文切换(有时也称为进程切换或任务切换)是指CPU 的控制权从一个进程或线程切换到另一个。

引起上下文切换的原因有哪些?

  1. 时间片用完,CPU正常调度下一个任务;
  2. 被其他优先级更高的任务抢占;
  3. 执行任务碰到IO阻塞,调度器挂起当前任务,切换执行下一个任务;
  4. 用户代码主动挂起当前任务让出CPU时间;
  5. 多任务抢占资源,由于没有抢到被挂起;
  6. 硬件中断;
为了解决这个问题,我们需要记录两个进程切换时第一条指令和最后一条指令的时间戳, 上下文切换就是这两个时间戳的差。来看一个简单的例子,假设只有两个进程:P1和P2。


P1正在执行,而P2在等待。在某个时刻,操作系统从P1切换到P2。假设此时, P1执行到第N条指令,记录时间戳Time_Stamp(P1_N),当本来在等待的P2 开始执行第1条指令,说明切换完成,记录时间戳Time_Stamp(P2_1)。因此, 上下文切换的时间为:Time_Stamp(P2_1) - Time_Stamp(P1_N)

思路非常简单。问题在于,我们如何知道上下文切换是何时发生的? 进程的切换是由操作系统的调度算法决定的。我们也无法记录进程中每个指令的时间戳。

另一个问题是:许多内核级线程也做上下文切换,而用户对于它们是没有任何控制权限的。

总而言之,我们可以认为,这最多只能是依赖于底层操作系统的近似计算。 一个近似的解法是记录一个进程结束时的时间戳,另一个进程开始的时间戳及排除等待时间。

如果所有进程总共用时为T,那么总的上下文切换时间为: T - (所有进程的等待时间和执行时间)


转自:http://hawstein.com/posts/18.2.html


---EOF---


0 0
原创粉丝点击