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