Linux程序凍結技術

2021-07-11 14:52:13 字數 1941 閱讀 8880

1 什麼是程序凍結

程序凍結技術(freezing of tasks)是指在系統hibernate或者suspend的時候,將使用者程序和部分核心執行緒置於「可控」的暫停狀態。

2 為什麼需要凍結技術

假設沒有凍結技術,程序可以在任意可排程的點暫停,而且直到cpu_down才會暫停並遷移。這會給系統帶來很多問題:

(1)有可能破壞檔案系統。在系統建立hibernate image到cpu down之間,如果有程序還在修改檔案系統的內容,這將會導致系統恢復之後無法完全恢復檔案系統;

(2)有可能導致建立hibernation image失敗。建立hibernation image需要足夠的記憶體空間,但是在這期間如果還有程序在申請記憶體,就可能導致建立失敗;

(3)有可能干擾裝置的suspend和resume。在cpu down之前,device suspend期間,如果程序還在訪問裝置,尤其是訪問競爭資源,就有可能引起裝置suspend異常;

(4)有可能導致程序感知系統休眠。系統休眠的理想狀態是所有任務對休眠過程無感知,睡醒之後全部自動恢復工作,但是有些程序,比如某個程序需要所有cpu online才能正常工作,如果程序不凍結,那麼在休眠過程中將會工作異常。

3 **實現框架

凍結的物件是核心中可以被排程執行的實體,包括使用者程序、核心執行緒和work_queue。使用者程序預設是可以被凍結的,借用訊號處理機制實現;核心執行緒和work_queue預設是不能被凍結的,少數核心執行緒和work_queue在建立時指定了freezable標誌,這些任務需要對freeze狀態進行判斷,當系統進入freezing時,主動暫停執行。

kernel threads可以通過呼叫kthread_freezable_should_stop來判斷freezing狀態,並主動呼叫__refrigerator進入凍結;work_queue通過判斷max_active屬性,如果max_active=0,則不能入隊新的work,所有work延後執行。

標記系統freeze狀態的有三個重要的全域性變數:pm_freezing、system_freezing_cnt和pm_nosig_freezing,如果全為0,表示系統未進入凍結;system_freezing_cnt>0表示系統進入凍結,pm_freezing=true表示凍結使用者程序,pm_nosig_freezing=true表示凍結核心執行緒和workqueue。它們會在freeze_processes和freeze_kernel_threads中置位,在thaw_processes和thaw_kernel_threads中清零。

fake_signal_wake_up函式巧妙的利用了訊號處理機制,只設定任務的tif_sigpending位,但不傳遞任何訊號,然後喚醒任務;這樣任務在返回使用者態時會進入訊號處理流程,檢查系統的freeze狀態,並做相應處理。

任務主動呼叫try_to_freeze的**如下:

static

inline

bool

try_to_freeze_unsafe

(void

)static

inline

bool

freezing

(struct

task_struct *p

)bool

freezing_slow_path

(struct

task_struct *p

)

進入凍結狀態直到恢復的主要函式:

bool __refrigerator(bool check_kthr_stop)

......

}

4 參考文獻

(1) 

(2) 

(3) kenrel document: freezing-of-tasks.txt

程序列舉技術

1 快照方式列舉程序 createtoolhelp32snapshot 介紹 功能 獲取指定程序的快照,以及這些程序使用的堆 模組和執行緒。函式原型 handle createtoolhelp32snapshot dword dwflags,系統快照的某些部分。dword th32processid...

Linux 程序 父程序 子程序

程序和程式的區別 一 程序是動態的,程式是靜態的 程式是有序 的集合,程序是程式的執行。程序有核心態 使用者態。二 程序是暫時的,程式是永久的 程序是乙個狀態變化的過程,程式可以長久儲存 三 程序和程式的組成不同,程序的組成包括程式 資料和程序控制塊 即程序狀態資訊 什麼是程序識別符號什麼是父程序和...

Linux程序 程序的退出

linux程序 程序的退出 2011 12 27 20 44 56 分類 linux void exit int status 注意點 1.status表明了程序終止時的狀態。當子程序使用 exit 後,父程序如果在用wait 等待子程序,那麼wait 將會返回status狀態,注意只有status...