天天看點

Linux suspend 流程介紹(2)之 freeze task

Linux  suspend 流程介紹之當機任務

一、什麼是任務當機

任務當機是在系統休眠(hibernation)或者全系統睡眠(system-wide suspend)過程中使用者态程序和部分核心線程的控制機制。

二、為什麼需要程序當機

1.      防止系統休眠或者睡眠後,檔案系統損壞;如果沒有當機程序,在系統suspend過程中,還有程序在對檔案系統程序寫操作,會破壞檔案系統。

2.      確定有足夠的記憶體空間存放休眠鏡像(hibernation image);

3.      防止核心線程或者使用者态程序幹擾裝置的suspend和resume;當程序運作在另一個CPU上,此時執行suspend,如果沒有當機任務的話,需要考慮一些競争條件。

4.      防止使用者程序使suspend流程工作異常。

三、任務當機的原理

任務當機相關的flag有3個,分别為:

PF_NOFREEZE 無需freeze的task

PF_FROZEN   task 已經freeze了

PF_FREEZER_SKIP

當task(所有的使用者程序和部分核心線程)的PF_NOFREEZE沒有被置位時,則task被認為是可當機的,在suspend過程中,會當機這些task。

任務當機過程的函數調用關系如下:

->suspend_freeze_processes

         ->freeze_processes        //使用者态程序

                   ->try_to_freeze_tasks

                            ->freeze_task

                                     ->fake_signal_wake_up

         -> freeze_kernel_threads //核心線程

                   ->try_to_freeze_tasks

                            ->freeze_task

                                     ->wake_up_state

在執行完fake_signal_wake_up和wake_up_state後,所有的可當機任務都會調用try_to_freeze函數進行響應,此時會置位PF_FROZEN flag,将任務狀态修改為TASK_UNINTERRUPTIBLE,進入死循環直到PF_FROZEN flag被clear,這時我們稱任務已經被當機了。從代碼執行的先後順序可知,使用者态程序通常比核心态線程先freeze。

參考文獻:

Linux 核心文檔:freezing-of-tasks.txt

繼續閱讀