1. 程式人生 > >大神教你設定Linux程序的睡眠和喚醒

大神教你設定Linux程序的睡眠和喚醒

Linux核心的例子

在Linux作業系統中,核心的穩定性至關重要,為了避免在Linux作業系統核心中出現無效喚醒問題,
Linux核心在需要程序睡眠的時候應該使用類似如下的操作:
/* ‘q’是我們希望睡眠的等待佇列 */
DECLARE_WAITQUEUE(wait,current);
add_wait_queue(q, &wait);
set_current_state(TASK_INTERRUPTIBLE);
/* 或TASK_INTERRUPTIBLE */
while(!condition) /* ‘condition’ 是等待的條件*/
schedule();
set_current_state(TASK_RUNNING);
remove_wait_queue(q, &wait);
上面的操作,使得程序通過下面的一系列步驟安全地將自己加入到一個等待佇列中進行睡眠:首先調
用DECLARE_WAITQUEUE ()建立一個等待佇列的項,然後呼叫add_wait_queue()把自己加入到等待佇列中,並且將程序的狀態設定為 TASK_INTERRUPTIBLE 或者TASK_INTERRUPTIBLE。然後迴圈檢查條件是否為真:如果是的話就沒有必要睡眠,如果條件不為真,就呼叫schedule()。當程序 檢查的條件滿足後,程序又將自己設定為TASK_RUNNING 並呼叫remove_wait_queue()將自己移出等待佇列。
從上面可以看到,Linux的核心程式碼維護者也是在程序檢查條件之前就設定程序的狀態為睡眠狀態,
然後才迴圈檢查條件。如果在程序開始睡眠之前條件就已經達成了,那麼迴圈會退出並用set_current_state()將自己的狀態設定為就緒,這樣同樣保證了程序不會存在錯誤的進入睡眠的傾向,當然也就不會導致出現無效喚醒問題。
下面讓我們用linux 核心中的例項來看看Linux 核心是如何避免無效睡眠的,這段程式碼出自Linux2.6的核心(linux-2.6.11/kernel/sched.c: 4254):
4253 /* Wait for kthread_stop */
4254 set_current_state(TASK_INTERRUPTIBLE);
4255 while (!kthread_should_stop()) {
4256 schedule();
4257 set_current_state(TASK_INTERRUPTIBLE);
4258 }
4259 __set_current_state(TASK_RUNNING);
4260 return 0;
上面的這些程式碼屬於遷移服務執行緒migration_thread,這個執行緒不斷地檢查kthread_should_stop(),
直 到kthread_should_stop()返回1它才可以退出迴圈,也就是說只要kthread_should_stop()返回0該程序就會一直睡 眠。從程式碼中我們可以看出,檢查kthread_should_stop()確實是在程序的狀態被置為TASK_INTERRUPTIBLE後才開始執行 的。因此,如果在條件檢查之後但是在schedule()之前有其他程序試圖喚醒它,那麼該程序的喚醒操作不會失效。

相關推薦

設定Linux程序睡眠喚醒

Linux核心的例子 在Linux作業系統中,核心的穩定性至關重要,為了避免在Linux作業系統核心中出現無效喚醒問題, Linux核心在需要程序睡眠的時候應該使用類似如下的操作: /* ‘q’是我們希望睡眠的等待佇列 */ DECLARE_WAITQUEUE(wait,current); add_wa

Linux中查詢刪除重複檔案

導讀 在Linux系作業系統中查詢並刪除重複檔案的方法的確有很多,不過這裡介紹的是一款非常簡單實用的軟體FSlint。FSlint是一個重複檔案查詢工具,可以使用它來清除不必要的重複檔案,筆者經常使用它來釋放Linux系統中的磁碟空間。 FSlint同時具有GUI和

輕松玩轉DockerKubernetes中如何運行MongoDB微服務

cdn 成員 實現 細節 步驟 class 就會 接受 blog 本文介紹了利用Docker和Kubernetes搭建一套具有冗余備份集合的MongoDB服務,從容器對CI和CD引發的改變入手,討論了容器技術對MongoDB帶來的挑戰和機會,然後實戰如何部署一套穩定的Mo

如果學習Python爬蟲 如何才能高效地爬取海量數據

Python 爬蟲 分布式 大數據 編程 Python如何才能高效地爬取海量數據我們都知道在互聯網時代,數據才是最重要的,而且如果把數據用用得好的話,會創造很大的價值空間。但是沒有大量的數據,怎麽來創建價值呢?如果是自己的業務每天都能產生大量的數據,那麽數據量的來源問題就解決啦,但是沒有數

AI新時代-使用python+Opencv完成人臉解鎖(附源碼)

判斷 剛才 src 學習 需要 亂七八糟 很多 request mbx 好吧,夥計們,我回來了。說我拖更不寫文章的可以過來用你的小拳拳狠命地捶我胸口.... 那麽今天我們來講關於使用python+opencv+face++來實現人臉驗證及人臉解鎖。代碼量同樣不多,你可以將這

2018最新用Python玩轉數據視頻教程

data arr 學習者 ui組件 array 字符 玩轉 統計 afr 本課程共分為5個模塊(實際課時為8周):Module 01: Python基礎本模塊主要討論Python的基本語言結構、數據類型、基本運算、條件和循環、函數和模塊等內容,用它們就可以寫一些有用的程序了

一招,如何使用Shell

shel 14. text 組合 行為 語法 權限 測試 如何 Shell是用來解決用戶如何與操作系統通信的問題。    其實大家都對Shell這個概念有誤解,好像一定要是命令行的Shell才叫Shell。    其實Shell,就是殼。    顧名思義就是機器外面的一層殼

CAD如何查找CAD圖紙的ID座標位置?

mark href ref html images 辦公 選項 了解 就是 CAD大神教你如何查找CAD圖紙的ID座標?在日常的辦公中,我們在編輯器CAD圖紙的過程中會遇到許多比較棘手的問題,就是在編輯圖紙的時候如何查找CAD圖紙的ID座標位置,具體要怎麽來進行操作了?在進

CAD初學者要如何學好CAD?CAD技巧

CAD初學者如何學好CAD?CAD大神教你技巧。就問你想不想學,現在有一些新的小夥伴們開始加入到CAD行業中的這個大家庭中來,但是他們有一些煩惱,那就是CAD初學者要如何學好CAD呢?那下面想要學好CAD的小夥伴們可要注意了,CAD大神教你如何學好CAD,首先第一步就是要學會對CAD圖紙的檢視,那下面就和小編

錄屏軟體哪個好?快速錄製高清視訊

  現在錄遊戲視訊的自媒體很多,像之前大火的蛋蛋解說還有B站上熱門的吃雞遊戲UP主大忽悠等等~這些自媒體的視訊素材就是來自於錄製的遊戲視訊~其實錄制高清的視訊,用對工具就行了,不光是可以錄製電腦上的遊戲視訊,手機上也可以的。大家可以試試下面說的這款螢幕錄影工具,裡面除了有常規的錄製功能外,還有挺多好用的快

玩轉 SSD 系列一:關注哪些指標

很多公司已經使用SSD裝置來緩解了IO壓力,提高生產力和降低運維成本。關係資料庫、KV儲存都對磁碟的隨機讀寫效能有需求,而SSD的出現,正好滿足了這些需求。如何評估固態儲存裝置的效能,並根據業務需求挑選出合適的SSD產品,避免效能不足和過剩,成為儲存選型所面臨的一個問題。 前言 本系列將分為以下

玩轉 SSD 系列二:基準測試環境專案

如何評估固態儲存裝置的效能,並根據業務需求挑選出合適的SSD產品?在上一篇中,介紹了 SSD 基準測試應該關注哪些指標,這裡我們繼續關注基準測試環境和具體測試專案。 前言 本系列將分為以下 4 個主題進行介紹。 一、SSD基準測試應該關注哪些指標 二、基準測試環境(工具/磁碟要

玩轉 SSD 系列三:資料處理

本系列將分為以下 4 個主題進行介紹。 一、SSD基準測試應該關注哪些指標 二、基準測試環境(工具/磁碟要求等) 三、針對磁碟的具體測試專案 四、資料處理 本篇主要介紹第四點——資料處理,在後面的文章推送中會繼續將把本系列的其他各主題分享給大家。 資料處理 如果記錄原始log,日誌都很大,好處是可

幾招玩轉Bootstrap框架技術

一、概述 首先我們來說說 Bootstrap 是什麼。 進入 Bootstrap 的官方網站(http://getbootstrap.com/),我們可以看到這樣一句話:Bootstrap is the most popular HTML, CSS, and JS fra

抖音怎麼上傳照片圖集?抖音照片視訊怎麼製作?輕鬆搞定!

抖音怎麼上傳照片圖集?抖音照片視訊或照片圖集怎麼製作?現在抖音上很多那種照片或圖片做成的短視訊,主題好,有音樂,還有文字或好看的切換效果。今天就請大神來教大家簡單幾步,輕鬆做一個好看的抖音照片圖集!教程用到的製作照片圖片的工具是數碼大師,大家可以先看看做好的抖音照片圖集效果: 下面就是製

如何將未激活的Win10變回已激活狀態

http 可用 size 導入 完成 專業 ado ati 開始菜單 1.右鍵單擊開始按鈕,選擇命令提示符(管理員);2、在命令指示符窗口中,輸入slmgr /upk,回車即會提示成功地卸載了產品密鑰;3、操作完成後,Win10系統就變成了未激活狀態,之後就使用自己的方式來

safari刪外掛技巧!

導讀 對於 Mac 使用者來說,在 Safari 瀏覽器中新增擴充套件程式是非常有用的,用蘋果的話來說就是“讓你用自己想要的方式來探索網路”。那麼問題來了,我們應該如何刪除這些擴充套件程式呢?如果 Safari 的擴充套件程式造成了 Mac 宕機和其他故障

阿里----如何深入剖析tomcat之servlet容器

其實我們開發中經常用tomcat應用伺服器,tomcat就一個servlet容器,能夠執行基於serlvlet的應用程式並響應相應的http請求,開發時間長了,還是想想具體知道它是怎麼執行的,尤其是servlet容器的機理,所以有幸拜讀了外國人的《深入剖析tomcat》,

谷歌解釋Kubernetes, 微服務容器化

來自谷歌雲平臺(Google Cloud Platform)的開發者佈道師 Ray Tsang

Linux程序休眠喚醒

喚醒函式很少會需要呼叫wake_up_interruptible 之外的喚醒函式,但為完整起見,這裡是整個集合:wake_up(wait_queue_head_t *queue); wake_up_interruptible(wait_queue_head_t *queue); wake_up 喚醒佇列中的每