日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解Linux進(jìn)程凍結(jié)

Linux休眠前需要先凍結(jié)所有進(jìn)程,休眠喚醒后再解凍進(jìn)程,驅(qū)動(dòng)開(kāi)發(fā)中的某些問(wèn)題可能導(dǎo)致凍結(jié)進(jìn)程失敗,下面為大家詳細(xì)講解一下Linux進(jìn)程凍結(jié)。

目前成都創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、新洲網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

1 什么是進(jìn)程凍結(jié)

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

2 為什么需要凍結(jié)技術(shù)

假設(shè)沒(méi)有凍結(jié)技術(shù),進(jìn)程可以在任意可調(diào)度的點(diǎn)暫停,而且直到cpu_down才會(huì)暫停并遷移。這會(huì)給系統(tǒng)帶來(lái)很多問(wèn)題:

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

(2)有可能導(dǎo)致創(chuàng)建hibernation image失敗。創(chuàng)建hibernation image需要足夠的內(nèi)存空間,但是在這期間如果還有進(jìn)程在申請(qǐng)內(nèi)存,就可能導(dǎo)致創(chuàng)建失?。?/p>

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

(4)有可能導(dǎo)致進(jìn)程感知系統(tǒng)休眠。系統(tǒng)休眠的理想狀態(tài)是所有任務(wù)對(duì)休眠過(guò)程無(wú)感知,睡醒之后全部自動(dòng)恢復(fù)工作,但是有些進(jìn)程,比如某個(gè)進(jìn)程需要所有cpu online才能正常工作,如果進(jìn)程不凍結(jié),那么在休眠過(guò)程中將會(huì)工作異常。

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

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

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

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

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

任務(wù)主動(dòng)調(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); //主動(dòng)進(jìn)入凍結(jié)

}

static inline bool freezing(struct task_struct *p)

{

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

return false;

return freezing_slow_path(p);

}

bool freezing_slow_path(struct task_struct *p)

{

if (p-》flags & PF_NOFREEZE) //當(dāng)前進(jìn)程是否允許凍結(jié)

return false;

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

return true;

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

return true;

return false;

}
進(jìn)入凍結(jié)狀態(tài)直到恢復(fù)的主要函數(shù):bool __refrigerator(bool check_kthr_stop)
{

。..

for (;;) {
set_current_state(TASK_UNINTERRUPTIBLE); //設(shè)置進(jìn)程為UNINTERRUPTIBLE狀態(tài)
spin_lock_irq(&freezer_lock);

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

if (!freezing(current) ||

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

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

spin_unlock_irq(&freezer_lock);

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

break;

was_frozen = true;

schedule();

}

。..。..

}

網(wǎng)頁(yè)標(biāo)題:詳解Linux進(jìn)程凍結(jié)
網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/cdjdped.html