linux中歷史命令死鎖 linux系統(tǒng)鎖定

在linux中用C語言實現(xiàn)死鎖

讓我來告訴你答案!設置狀態(tài)變量lock=0,在占用資源的函數(shù)中,設置lock=1;并在處理結(jié)束后設lock=0.

成都創(chuàng)新互聯(lián)是一家網(wǎng)站設計公司,集創(chuàng)意、互聯(lián)網(wǎng)應用、軟件技術為一體的創(chuàng)意網(wǎng)站建設服務商,主營產(chǎn)品:自適應網(wǎng)站建設、成都品牌網(wǎng)站建設網(wǎng)絡營銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站制作、成都做網(wǎng)站、移動互聯(lián)產(chǎn)品、網(wǎng)絡運營、VI設計、云產(chǎn)品.運維為核心業(yè)務。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務。

比如:

boollock=0;

intscan()

{

while(lock!=0);//循環(huán)檢測,直到資源釋放才執(zhí)行下面的語句

lock=1;//鎖定資源

...//具體的執(zhí)行掃描的語句

lock=1;//釋放資源

return0;

}

這個方法容易實現(xiàn),但是占用CPU,假定其他線程正在占用掃描儀,那么這個線程就會在自己的時間片內(nèi)不停的執(zhí)行while語句直到對方釋放掃描儀。由此造成了浪費。

現(xiàn)在流行的做法是通過中斷信號來做,那是一本書的內(nèi)容,建議看linux內(nèi)核編程方面的書。

linux內(nèi)核線程死鎖或死循環(huán)之后如何讓系統(tǒng)宕機重啟

在開發(fā)內(nèi)核模塊或驅(qū)動時,如果處理失誤,導致內(nèi)核線程中出現(xiàn)死鎖或者死循環(huán),你會發(fā)現(xiàn),除了重啟之外,你沒有任何可以做的。這時你的輸入不起任何作用,終端(不是指遠程的ssh工具)只會在那重復的輸出類似“BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]”,更無奈的是你重啟之后導致系統(tǒng)掛起的堆棧信息也看不到,你所能做的就是一遍遍的加調(diào)試信息,一遍遍的重啟機器(這是我的經(jīng)歷,現(xiàn)在想想很傻)。 這種情況你肯定不是第一個遇到的,所以內(nèi)核肯定會提供處理這種情況的一些機制。但是如何來找到這些機制在哪個地方,或者說根據(jù)什么信息去google呢?最有用的就是這句話“BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]”,因為這句話提供你的信息量很大。首先,這條信息可以輸出,說明即使發(fā)生死鎖或者死循環(huán),還是有代碼可以執(zhí)行。第二,可以通過這個日志信息,找到對應的處理函數(shù),這個函數(shù)所在的模塊就是用來處理CPU被過度使用時用到的。所以通過這個事情,可以看到內(nèi)核打印出的只言片語都有可能成為你解決問題的關鍵,一定要從重視這些信息,從中找出有用的東西。 我經(jīng)??吹膬?nèi)核版本是官方的2.6.32內(nèi)核,這個版本中我找到的函數(shù)是softlockup_tick(),這個函數(shù)在時鐘中斷的處理函數(shù)run_local_timers()中調(diào)用。這個函數(shù)會首先檢查watchdog線程是否被掛起,如果不是watchdog線程,會檢查當前占有CPU的線程占有的時間是否超過系統(tǒng)配置的閾值,即softlockup_thresh。如果當前占有CPU的時間過長,則會在系統(tǒng)日志中輸出我們上面看到的那條日志。接下來才是最關鍵的,就是輸出模塊信息、寄存器信息和堆棧信息,檢查softlockup_panic的值是否為1。如果softlockup_panic為1,則調(diào)用panic()讓內(nèi)核掛起,輸出OOPS信息。代碼如下所示:/** This callback runs from the timer interrupt, and checks * whether the watchdog thread has hung or not:*/void softlockup_tick(void){int this_cpu = smp_processor_id(); unsigned long touch_timestamp = per_cpu(touch_timestamp, this_cpu); unsigned long print_timestamp; struct pt_regs *regs = get_irq_regs(); unsigned long now; /* Warn about unreasonable delays: */ if (now = (touch_timestamp + softlockup_thresh))return; per_cpu(print_timestamp, this_cpu) = touch_timestamp; spin_lock(print_lock); printk(KERN_ERR BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n, this_cpu, now - touch_timestamp, current-comm, task_pid_nr(current)); print_modules(); print_irqtrace_events(current);if (regs)show_regs(regs);elsedump_stack(); spin_unlock(print_lock); if (softlockup_panic) panic(softlockup: hung tasks);} 但是softlockup_panic的值默認竟然是0,所以在出現(xiàn)死鎖或者死循環(huán)的時候,會一直只輸出日志信息,而不會宕機,這個真是好坑啊!所以你得手動修改/proc/sys/kernel/softlockup_panic的值,讓內(nèi)核可以在死鎖或者死循環(huán)的時候可以宕機。如果你的機器中安裝了kdump,在重啟之后,你會得到一份內(nèi)核的core文件,這時從core文件中查找問題就方便很多了,而且再也不用手動重啟機器了。如果你的內(nèi)核是標準內(nèi)核的話,可以通過修改/proc/sys/kernel/softlockup_thresh來修改超時的閾值,如果是CentOS內(nèi)核的話,對應的文件是/proc/sys/kernel/watchdog_thresh。CentOS內(nèi)核和標準內(nèi)核還有一個地方不一樣,就是處理CPU占用時間過長的函數(shù),CentOS下是watchdog_timer_fn()函數(shù)。 這里介紹下lockup的概念。lockup分為soft lockup和hard lockup。 soft lockup是指內(nèi)核中有BUG導致在內(nèi)核模式下一直循環(huán)的時間超過10s(根據(jù)實現(xiàn)和配置有所不同),而其他進程得不到運行的機會。hard softlockup是指內(nèi)核已經(jīng)掛起,可以通過watchdog這樣的機制來獲取詳細信息。這兩個概念比較類似。如果你想了解更多關于lockup的信息,可以參考這篇文檔: 注意上面說的這些,都是在內(nèi)核線程中有效,對用戶態(tài)的死循環(huán)沒用。如果要監(jiān)視用戶態(tài)的死循環(huán),或者內(nèi)存不足等資源的情況,強烈推薦軟件層面的watchdog。具體的操作可以參考下面的文章,都寫的非常好,非常實用:

怎么解除Linux系統(tǒng)的死鎖 ??

你可以進到系統(tǒng)另外一個環(huán)境,打開終端,使用TOP命令看看什么進程沒有響應,kill 掉 就可以解除死鎖了

Linux 如何處理死鎖

處理死鎖的策略

1.忽略該問題。例如鴕鳥算法,該算法可以應用在極少發(fā)生死鎖的的情況下。為什么叫鴕鳥算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。

2.檢測死鎖并且恢復。

3.仔細地對資源進行動態(tài)分配,以避免死鎖。

4.通過破除死鎖四個必要條件之一,來防止死鎖產(chǎn)生。

檢測死鎖的代價很大。所有的類unix系統(tǒng)包括Linux對死鎖不作任何處理,這是因為基于成本的考慮.選擇鴕鳥算法

新聞標題:linux中歷史命令死鎖 linux系統(tǒng)鎖定
新聞來源:http://muchs.cn/article40/hjcgho.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作App開發(fā)、網(wǎng)站維護品牌網(wǎng)站制作、網(wǎng)站排名、關鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計