簡體   English   中英

多任務處理和測量時差

[英]Multitasking and measuring time difference

我知道搶占式多任務OS可以在任何“代碼位置”中斷進程。

給出以下代碼:

int main() {
  while( true ) {
    doSthImportant(); // needs to be executed at least each 20 msec
    // start of critical section
    int start_usec = getTime_usec();
    doSthElse();
    int timeDiff_usec = getTime_usec() - start_usec;
    // end of critical section
    evalUsedTime( timeDiff_usec );
    sleep_msec( 10 );
  }
}

我希望這段代碼通常會為timeDiff_usec產生適當的結果,尤其是在doSthElse()getTime_usec()不需要太多時間的情況下,因此它們很少被OS調度程序打斷。

但是程序有時會在“關鍵部分”的某個地方被打斷。 上下文切換將執行預期的操作,並且在這種情況下,程序仍然會為timeDiff_usec產生錯誤的結果。

這是我目前唯一想到的例子,但是我敢肯定,在其他情況下,多任務處理可能會使程序(mer)陷入困境(因為時間不是重新輸入時唯一可能改變的狀態)。

  • 有沒有辦法確保測量某個動作的時間正常?
  • 還有哪些其他常見問題對於多任務處理至關重要,需要加以考慮嗎? (我沒有考慮線程安全性-但可能存在一些常見問題)。

編輯:我更改了示例代碼以使其更加精確。 我想檢查一下花費的時間,以確保doSthElse()不會花費大約50毫秒左右的時間,如果可以,那么我會尋找更好的解決方案。

  • 有沒有辦法確保測量某個動作的時間正常?

這取決於您的操作系統和特權級別。 在某些系統上,對於某些特權級別,可以將進程或線程設置為具有優先級,以防止其被任何較低優先級的東西搶占。 例如,在Linux上,您可以使用sched_setscheduler賦予線程實時優先級。 (如果您真的很認真,還可以設置線程關聯和SMP關聯,以防止在運行線程的CPU上處理任何中斷。)

您的系統還可以提供時間跟蹤,以說明搶占的時間。 例如,POSIX定義了getrusage函數,該函數返回一個結構,其中包含ru_utime (進程在“用戶模式”下花費的時間)和ru_stime (進程在“內核模式”下花費的時間)。 這些應該是CPU在進程上花費的總時間,不包括進程掛起的時間間隔。 請注意,例如,如果內核需要花費一些時間來代表您的進程進行分頁,則不會定義該進程要花費多少時間(如果有的話)。

無論如何,衡量花費在某個關鍵動作上的時間的常見方法是在一個閑置的系統上重復計時(基本上是您的問題提出的方式),排除異常值,然后取平均值(消除異常值后),或者采用測量的中位數或第95個百分位數,具體取決於您為什么需要進行測量。

還有哪些其他常見問題對於多任務處理至關重要,需要加以考慮嗎? (我沒有考慮線程安全性-但可能存在一些常見問題)。

太寬泛。 有整本關於這個主題的書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM