[CareerCup] 16.2 Measure Time in a Context Switch 测量上下文转换的时间
?
16.2 How would you measure the time spent in a context switch?
?
上下文轉換發生在兩個進程之間,比如讓一個等待進程進入執行和讓一個運行進程進入等待,這些在多任務中發生。操作系統需要把等待進程的信息放入內存和把當前運行的進程信息保存下來。為了解決這個問題,我們記錄在切換進程時的最后和第一個指令的時間點,比如我們有兩個進程P1和P2,P1在執行P2在等待,當我們切換P1和P2時,假設發生在P1的第N個指令,我們用tx,k來表示進程x的第k個指令的時間點,那么切換的時間為t2,1-t1,n。
那么問題是我們怎么知道什么時候轉換發生,我們又不能記錄進程的每個指令的時間點。另外還有轉換是由操作系統的安排算法管理的,而且有很多核心線程也要用上下文轉換。其他進程也可能競爭CPU或內核處理中斷。用戶不能控制外部的上下文轉換,比如在時間t1,n,內核決定處理中斷,那么上下文轉換的時間就會延長。為了克服這些困難,我們需要建立一個上下文使得P1執行完,P2馬上就能運行。我們可以建立一個數據通道Data Chanel,例如管道Pipe,在P1和P2之間,就像兩個進程在打乒乓球,使用數據權標Data Token。
我們讓P1當發送者,P2當接受者。開始時,P2在等待,當P1執行了,它發送了數據權標給P2,然后等著讀取一個回執。但是由于P2還沒能執行,所以P1沒有回執,進行被阻礙了,釋放了CPU。上下文轉換發生了,任務分配器必須選另一個進程執行,且P2處于準備執行狀態。當P2運行了,P1和P2的角色互換了,P2現在是發送者而P1是接受者,當P2發回執給P1,整個過程就完成了:
1. P2等待P1發送消息。
2. P1記錄時間點。
3. P1給P2發送消息。
4. P1試圖讀取回執,這包括了一個上下文轉換。
5. P2準備就緒并接到了消息。
6. P2發送回執給P1。
7. P2嘗試讀取P1的回執,這包括了一個上下文轉換。
8. P1準備就緒且接到了消息。
9. P1記錄時間點。
那么步驟2到9之間的時間差T,表示為T = 2 * (Td + Tc + Tr),其中Td和Tr表示發送和接受消息時間,Tc表示狀態轉換的時間。那么現在問題是要求Td + Tr的值,即為P1發送信息給自己到接受到消息的時間,這不包括狀態轉換的時間因為是發給自己。由于可能存在的未知中斷,所以我們需要重復多次,取最小的Tc當做結果。
這也只是一個近似結果,因為我們這么做有個假設就是當P2接到消息后馬上就開始運行,這得根據任務分配器的實現方法,所以只是個近似值。
CareerCup All in One 題目匯總
總結
以上是生活随笔為你收集整理的[CareerCup] 16.2 Measure Time in a Context Switch 测量上下文转换的时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 5182 PM2.5
- 下一篇: 获取网页数据的例子