linux實時性 避免頁面錯誤
阿新 • • 發佈:2022-03-11
當應用讀取或寫入未提交到實體記憶體的記憶體時,會發生頁錯誤。 不可能(或很難)預測頁面錯誤何時會發生,因此它們是計算機中不確定性的另一個來源。
幸運的是,有一個函式允許您提交程序使用的所有記憶體並將其鎖定,這樣它就不會導致頁面錯誤。 它是mlockall(2)
。 這是它的兩面旗幟:
-
MCL_CURRENT
:此選項鎖定當前對映的所有頁面。 -
MCL_FUTURE
:此選項鎖定稍後在中對映的頁面。
通常在應用啟動期間呼叫mlockall
,並將這兩個標誌設定為鎖定所有當前和未來的記憶體對映。
MCL_FUTURE
不是魔術,因為在使用malloc()
/free()
或mmap()
分配或釋放堆記憶體時,仍然會有不確定的延遲。 這樣的操作最好在啟動時完成,而不是在主控制迴圈中完成。
在堆疊上分配的記憶體比較棘手,因為它是自動完成的,如果您呼叫一個使堆疊比以前更深的函式,您將遇到更多的記憶體管理延遲。 一個簡單的解決方法是將堆疊的大小增加到您認為在啟動時永遠不會需要的大小。 程式碼如下所示:
#define MAX_STACK (512*1024) static void stack_grow (void) { char dummy[MAX_STACK]; memset(dummy, 0, MAX_STACK); return; } int main(int argc, char* argv[]) { […] stack_grow (); mlockall(MCL_CURRENT| MCL_FUTURE); […]
stack_grow()
函式在堆疊上分配一個較大的變數,然後將其置零,以強制將這些記憶體頁提交給該程序。
中斷是我們應該警惕的另一個非決定論的來源。