0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

一文解讀Linux進程凍結技術

454398 ? 來源:蝸窩科技 ? 作者:itrocker ? 2020-09-30 15:26 ? 次閱讀

1 什么是進程凍結

進程凍結技術(freezing of tasks)是指在系統(tǒng)hibernate或者suspend的時候,將用戶進程和部分內(nèi)核線程置于“可控”的暫停狀態(tài)。

2 為什么需要凍結技術

假設沒有凍結技術,進程可以在任意可調(diào)度的點暫停,而且直到cpu_down才會暫停并遷移。這會給系統(tǒng)帶來很多問題:

(1)有可能破壞文件系統(tǒng)。在系統(tǒng)創(chuàng)建hibernate image到cpu down之間,如果有進程還在修改文件系統(tǒng)的內(nèi)容,這將會導致系統(tǒng)恢復之后無法完全恢復文件系統(tǒng);

(2)有可能導致創(chuàng)建hibernation image失敗。創(chuàng)建hibernation image需要足夠的內(nèi)存空間,但是在這期間如果還有進程在申請內(nèi)存,就可能導致創(chuàng)建失敗;

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

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

3 代碼實現(xiàn)框架

凍結的對象是內(nèi)核中可以被調(diào)度執(zhí)行的實體,包括用戶進程、內(nèi)核線程和work_queue。用戶進程默認是可以被凍結的,借用信號處理機制實現(xiàn);內(nèi)核線程和work_queue默認是不能被凍結的,少數(shù)內(nèi)核線程和work_queue在創(chuàng)建時指定了freezable標志,這些任務需要對freeze狀態(tài)進行判斷,當系統(tǒng)進入freezing時,主動暫停運行。

kernel threads可以通過調(diào)用kthread_freezable_should_stop來判斷freezing狀態(tài),并主動調(diào)用__refrigerator進入凍結;work_queue通過判斷max_active屬性,如果max_active=0,則不能入隊新的work,所有work延后執(zhí)行。

標記系統(tǒng)freeze狀態(tài)的有三個重要的全局變量:pm_freezing、system_freezing_cnt和pm_nosig_freezing,如果全為0,表示系統(tǒng)未進入凍結;system_freezing_cnt》0表示系統(tǒng)進入凍結,pm_freezing=true表示凍結用戶進程,pm_nosig_freezing=true表示凍結內(nèi)核線程和workqueue。它們會在freeze_processes和freeze_kernel_threads中置位,在thaw_processes和thaw_kernel_threads中清零。

fake_signal_wake_up函數(shù)巧妙的利用了信號處理機制,只設置任務的TIF_SIGPENDING位,但不傳遞任何信號,然后喚醒任務;這樣任務在返回用戶態(tài)時會進入信號處理流程,檢查系統(tǒng)的freeze狀態(tài),并做相應處理。

任務主動調(diào)用try_to_freeze的代碼如下:

static inline bool try_to_freeze_unsafe(void)

{

if (likely(!freezing(current))) //檢查系統(tǒng)是否處于freezing狀態(tài)

return false;

return __refrigerator(false); //主動進入凍結

}

static inline bool freezing(struct task_struct *p)

{

if (likely(!atomic_read(&system_freezing_cnt))) //系統(tǒng)總體進入freezing

return false;

return freezing_slow_path(p);

}

bool freezing_slow_path(struct task_struct *p)

{

if (p-》flags & PF_NOFREEZE) //當前進程是否允許凍結

return false;

if (pm_nosig_freezing || cgroup_freezing(p)) //系統(tǒng)凍結kernel threads

return true;

if (pm_freezing && ?。╬-》flags & PF_KTHREAD)) //系統(tǒng)凍結用戶進程

return true;

return false;

}

進入凍結狀態(tài)直到恢復的主要函數(shù):bool __refrigerator(bool check_kthr_stop)

{

。..

for (;;) {

set_current_state(TASK_UNINTERRUPTIBLE); //設置進程為UNINTERRUPTIBLE狀態(tài)

spin_lock_irq(&freezer_lock);

current-》flags |= PF_FROZEN; //設置已凍結狀態(tài)

if (!freezing(current) ||

(check_kthr_stop && kthread_should_stop())) //判斷系統(tǒng)是否還處于凍結

current-》flags &= ~PF_FROZEN; //如果系統(tǒng)已解凍,則取消凍結狀態(tài)

spin_unlock_irq(&freezer_lock);

if (?。╟urrent-》flags & PF_FROZEN)) //如果已取消凍結,跳出循環(huán),恢復執(zhí)行

break;

was_frozen = true;

schedule();

}

。..。..

}

4 參考文獻

(1) http://www.wowotech.net/linux_kenrel/suspend_and_resume.html

(2) http://www.wowotech.net/linux_kenrel/std_str_func.html

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關注

    關注

    3

    文章

    1346

    瀏覽量

    40152
  • Linux
    +關注

    關注

    87

    文章

    11161

    瀏覽量

    208465
  • 進程
    +關注

    關注

    0

    文章

    198

    瀏覽量

    13933
收藏 人收藏

    評論

    相關推薦

    深入探討Linux進程調(diào)度器

    Linux操作系統(tǒng)作為個開源且廣泛應用的操作系統(tǒng),其內(nèi)核設計包含了許多核心功能,而進程調(diào)度器(Scheduler)就是其中個至關重要的模塊。進程
    的頭像 發(fā)表于 08-13 13:36 ?849次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>調(diào)度器

    百度首席技術官王海峰解讀心大模型的關鍵技術和最新進展

    4月16日,以“創(chuàng)造未來”為主題的Create 2024百度AI開發(fā)者大會在深圳國際會展中心成功舉辦。百度首席技術官王海峰以“技術筑基,星河璀璨”為題,發(fā)表演講,解讀了智能體、代碼、多模型等多項
    的頭像 發(fā)表于 04-18 09:20 ?597次閱讀
    百度首席<b class='flag-5'>技術</b>官王海峰<b class='flag-5'>解讀</b><b class='flag-5'>文</b>心大模型的關鍵<b class='flag-5'>技術</b>和最新進展

    linux下查詢進程占用的內(nèi)存方法有哪些?

    linux下查詢進程占用的內(nèi)存方法
    發(fā)表于 04-08 06:03

    EMC技術:基礎概念到應用的解讀?

    EMC技術:基礎概念到應用的解讀?|深圳比創(chuàng)達電子
    的頭像 發(fā)表于 03-11 11:55 ?469次閱讀
    EMC<b class='flag-5'>技術</b>:基礎概念到應用的<b class='flag-5'>解讀</b>?

    淺談Linux進程

    進程和程序的區(qū)別: 進程是動態(tài)的,程序是靜態(tài)的 進程的創(chuàng)建(fork()函數(shù)) int main(){ pid_t pid; pid=fork(); if(pid?????>0
    的頭像 發(fā)表于 01-28 15:54 ?224次閱讀
    淺談<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>

    你還是分不清多進程和多線程嗎?搞懂!

    你還是分不清多進程和多線程嗎?搞懂! 多進程和多線程是并發(fā)編程中常見的兩個概念,它們都可以用于提高程序的性能和效率。但是它們的實現(xiàn)方式和使用場景略有不同。 1. 多
    的頭像 發(fā)表于 12-19 16:07 ?491次閱讀

    Linux進程、線程和協(xié)程的基礎概念

    進程是計算機中運行的程序的實例,它是操作系統(tǒng)中最基本的執(zhí)行單元之。每個進程都有自己的獨立內(nèi)存空間、系統(tǒng)資源和代碼執(zhí)行流。這意味著進程
    的頭像 發(fā)表于 12-06 09:22 ?711次閱讀

    linux查看weblogic進程

    Linux操作系統(tǒng)中,WebLogic是種常用的Java應用服務器,用于部署和管理企業(yè)級Java應用程序。為了確保WebLogic服務器正常運行,有時我們需要查看WebLogic進程以了解其狀態(tài)
    的頭像 發(fā)表于 12-05 16:07 ?1643次閱讀

    Linux進程通信的方法

    進程是操作系統(tǒng)的概念,每當我們執(zhí)行個程序時,對于操作系統(tǒng)來講就創(chuàng)建了進程,在這個過程中,伴隨著資源的分配和釋放??梢哉J為進程
    的頭像 發(fā)表于 11-29 14:45 ?640次閱讀
    <b class='flag-5'>Linux</b>下<b class='flag-5'>進程</b>通信的方法

    解讀GNSS信號對網(wǎng)絡中授時應用的益處

    漲知識 | 解讀GNSS信號對網(wǎng)絡中授時應用的益處
    的頭像 發(fā)表于 11-24 14:26 ?447次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>解讀</b>GNSS信號對網(wǎng)絡中授時應用的益處

    linux下開發(fā)避免僵尸進程的方法

    、什么是僵死進程? 般情況下,程序調(diào)用exit(包括_exit和_Exit,它們的區(qū)別這里不做解釋),它的絕大多數(shù)內(nèi)存和相關的資源已經(jīng)被內(nèi)核釋放掉,但是在進程表中這個
    的頭像 發(fā)表于 11-11 16:38 ?654次閱讀
    <b class='flag-5'>linux</b>下開發(fā)避免僵尸<b class='flag-5'>進程</b>的方法

    如何實現(xiàn)linux進程間通信的機制

    我們知道linux進程的間通信的組件有管道,消息隊列,socket, 信號量,共享內(nèi)存等。但是我們?nèi)绻约簩崿F(xiàn)一套進程間通信的機制的話,要怎么做?了解android 開發(fā)的可能會知道
    的頭像 發(fā)表于 11-10 14:56 ?579次閱讀
    如何實現(xiàn)<b class='flag-5'>一</b>套<b class='flag-5'>linux</b><b class='flag-5'>進程</b>間通信的機制

    Linux系統(tǒng)上多線程和多進程的運行效率

    深受其害。 經(jīng)常在網(wǎng)絡上看到有的XDJM問“多進程好還是多線程好?”、“Linux下用多進程還是多線程?”等等期望勞永逸的問題,我只能說:沒有最好,只有更好。根據(jù)實際情況來判斷,哪個
    的頭像 發(fā)表于 11-10 10:54 ?1219次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)上多線程和多<b class='flag-5'>進程</b>的運行效率

    LINUX進程的最大理論數(shù)計算

    LINUX進程的最大理論數(shù)計算 每個進程都要在全局段描述表GDT中占據(jù)兩個表項 每個進程的局部段描述表LDT都作為個獨立的段而存在,在全
    的頭像 發(fā)表于 11-09 09:17 ?546次閱讀
    <b class='flag-5'>LINUX</b>中<b class='flag-5'>進程</b>的最大理論數(shù)計算

    基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務器設計

    電子發(fā)燒友網(wǎng)站提供《基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務器設計.pdf》資料免費下載
    發(fā)表于 11-08 15:31 ?0次下載
    基于ARM-<b class='flag-5'>Linux</b>嵌入式系統(tǒng)的多<b class='flag-5'>進程</b>并發(fā)服務器設計