亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12
最近訪問板塊 發(fā)新帖
樓主: bfdhczw
打印 上一主題 下一主題

[內(nèi)存管理] 【求助】OOM的時候kill進程失敗 [復(fù)制鏈接]

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
11 [報告]
發(fā)表于 2015-12-21 16:43 |只看該作者
還是由等待的事件源來wakeup要安全一些。

這種情況下,倒不如想辦法終止或減少磁盤IO的頻率?

論壇徽章:
2
2015年亞洲杯之烏茲別克斯坦
日期:2015-04-15 15:43:482015亞冠之迪拜阿赫利
日期:2015-06-30 20:36:46
12 [報告]
發(fā)表于 2015-12-21 17:20 |只看該作者
回復(fù) 11# nswcfd


    我也想等到事件來源,但是現(xiàn)在系統(tǒng)已經(jīng)不調(diào)度了,幾乎是卡死狀態(tài),沒法等到事件來源。
減少磁盤操作是不可能的,原因有兩個
其一,這個進程的源碼不在我們手上,
其二,這個進程本身是個下載器,不操作磁盤不可能。

所以,我現(xiàn)在期望能達到的最好效果就是,OOM的時候kill這個進程,保證系統(tǒng)不被卡死。

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
13 [報告]
發(fā)表于 2015-12-22 16:10 |只看該作者
11樓表達的不準(zhǔn)確,意思是接管內(nèi)核的disk io入口(hack/hack/hack),替換成空操作,避免新的io操作產(chǎn)生。
這樣,舊的請求才能及時被舊的io模塊滿足,產(chǎn)生wakeup調(diào)用,進程才能結(jié)束D狀態(tài)。

當(dāng)然,也可以去模擬disk io的complete事件,終極目標(biāo)是觸發(fā)wakeup。
不太建議繞過io系統(tǒng)去直接wakeup處于D狀態(tài)的進程,除非先cancel掉原來的wait。

不建議的原因是出于穩(wěn)定性考慮。
waitq通常位于等待進程的stack上(類似DEFINE_WAIT),如果自行把進程wakeup,則進程會繼續(xù)執(zhí)行。
像樓主的例子,就響應(yīng)OOM的kill signal結(jié)束進程了。
但是io子系統(tǒng)不知道這些事情,當(dāng)事件完成后,依然會調(diào)用wakeup,去修改waitq的狀態(tài)。
這時候就不知道會touch到誰的內(nèi)存了。

論壇徽章:
2
2015年亞洲杯之烏茲別克斯坦
日期:2015-04-15 15:43:482015亞冠之迪拜阿赫利
日期:2015-06-30 20:36:46
14 [報告]
發(fā)表于 2015-12-24 15:04 |只看該作者
回復(fù) 13# nswcfd


    我是這樣做的,直接active,但還是殺不掉
  1. int kill_etm(void)
  2. {
  3.         int ret = 0;
  4.         struct task_struct *p;

  5.         read_lock(&tasklist_lock);
  6.         for_each_process(p){
  7.                 if(!strcmp("my_process_name", p->comm)){
  8.                         oom_kill_task(p, NULL);
  9.                         ret = 1;
  10.                         break;
  11.                 }
  12.         }
  13.         read_unlock(&tasklist_lock);

  14.         if(likely(ret) && likely(p!=current)){
  15.                 printk("%s active %s and schedule()\n", __func__, p->comm);
  16.                 activate_task_priv(p);               
  17.                 schedule_timeout_uninterruptible(HZ>>2);
  18.         }
  19.        
  20.         return ret;
  21. }
復(fù)制代碼

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
15 [報告]
發(fā)表于 2015-12-25 10:37 |只看該作者
不好意思,忽略了一件事情,D狀態(tài)是不考慮signal的。
  1. #define __wait_event(wq, condition)                                         \
  2. do {                                                                        \
  3.         DEFINE_WAIT(__wait);                                                \
  4.                                                                         \
  5.         for (;;) {                                                        \
  6.                 prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);        \
  7.                 if (condition)                                                \
  8.                         break;                                                \
  9.                 schedule();                                                \
  10.         }                                                                \
  11.         finish_wait(&wq, &__wait);                                        \
  12. } while (0)
復(fù)制代碼
其中的schedule會被樓主顯式的wake_up恢復(fù),但是如果繼續(xù)檢查條件(IO未完成等),還是不滿足,繼續(xù)schedule。
關(guān)鍵還是得破壞(或者說滿足)condition條件。

論壇徽章:
2
2015年亞洲杯之烏茲別克斯坦
日期:2015-04-15 15:43:482015亞冠之迪拜阿赫利
日期:2015-06-30 20:36:46
16 [報告]
發(fā)表于 2015-12-28 18:18 |只看該作者
回復(fù) 15# nswcfd


    D狀態(tài)不響應(yīng)signal我是知道的,我理解的不響應(yīng)只是暫時不響應(yīng),信號被掛起而已,等到進程退出D狀態(tài)的時候,就會響應(yīng)了。難道我理解錯了?

論壇徽章:
2
2015年亞洲杯之烏茲別克斯坦
日期:2015-04-15 15:43:482015亞冠之迪拜阿赫利
日期:2015-06-30 20:36:46
17 [報告]
發(fā)表于 2015-12-29 10:35 |只看該作者
本帖最后由 bfdhczw 于 2015-12-29 10:36 編輯

回復(fù) 15# nswcfd
  1. #define __wait_event(wq, condition)                                         \
  2. do {                                                                        \
  3.         DEFINE_WAIT(__wait);                                                \
  4.                                                                         \
  5.         for (;;) {                                                        \
  6.                 prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);        \
  7.                 if (condition)                                                \
  8.                         break;                                                \
  9.                 if(current->force_quit)\
  10.                         break;\
  11.                 schedule();                                                \
  12.         }                                                                \
  13.         finish_wait(&wq, &__wait);                                        \
  14.         if(current->force_quit){\
  15.                 printk("=========> force_quit at %s\n", __func__);\
  16.                 force_sig(SIGKILL, current);\
  17.         }\
  18. } while (0)
復(fù)制代碼
我把代碼改成了這樣,在task_struct里面加了force_quit成員,看起來wait queue上不會出什么問題,不知道會不會引起其他問題。
目前還沒有測試結(jié)果,等后面有測試結(jié)果了,再繼續(xù)更新狀況。

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
18 [報告]
發(fā)表于 2015-12-29 11:08 |只看該作者
回復(fù) 16# bfdhczw
“退出D狀態(tài)去響應(yīng)信號”不會平白無故的發(fā)生,一定對應(yīng)某個kernel code path,比如
1)等待的條件滿足,結(jié)束wait_event循環(huán),在核心態(tài)返回用戶態(tài)的路徑上檢查信號處理;
2)像wait_event_interruptible那樣,在wait循環(huán)里面,每次醒來之后顯式的檢查是否有信號發(fā)生,如果有退出循環(huán),在返回用戶態(tài)的路徑上處理signal。


   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP