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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1423 | 回復: 0
打印 上一主題 下一主題

僵尸進程 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-02-23 15:41 |只看該作者 |倒序瀏覽
在fork()/execve()過程中,假設(shè)子進程結(jié)束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數(shù)調(diào)用
waitpid()等待子進程結(jié)束,又沒有顯式忽略該信號,則子進程成為僵尸進程,無法正常結(jié)束,此時即使是root身份kill
-9也不能殺死僵尸進程。補救辦法是殺死僵尸進程的父進程(僵尸進程的父進程必然存在),僵尸進程成為"孤兒進程",過繼給1號進程init,init始
終會負責清理僵尸進程。
  僵尸進程是指的父進程已經(jīng)退出,而該進程dead之后沒有進程接受,就成為僵尸進程.(zombie)進程
  怎樣產(chǎn)生僵尸進程的:
  一個進程在調(diào)用exit命令結(jié)束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進
程的狀態(tài)中,僵尸進程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進程列表中保留一個位置,記載該進程的
退出狀態(tài)等信息供其他進程收集,除此之外,僵尸進程不再占有任何內(nèi)存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數(shù)
調(diào)用wait或waitpid()等待子進程結(jié)束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態(tài),如果這時父進程結(jié)束了,那么init進程自動會接手
這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環(huán),不會結(jié)束,那么子進程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的
僵尸進程。
  怎么查看僵尸進程:
  利用命令ps,可以看到有標記為Z的進程就是僵尸進程。
  怎樣來清除僵尸進程:
  1.改寫父進程,在子進程死后要為它收尸。具體做法是接管SIGCHLD信號。子進程死后,會發(fā)送SIGCHLD信號給父進程,父進程收到此信號后,執(zhí)行waitpid()函數(shù)為子進程收尸。這是基于這樣的原理:就算父進程沒有調(diào)用wait,內(nèi)核也會向它發(fā)送SIGCHLD消息,盡管對的默認處理是忽略,如果想響應這個消息,可以設(shè)置一個處理函數(shù)。
  2.把父進程殺掉。父進程死后,僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵尸進程.它產(chǎn)生的所有僵尸進程也跟著消失。
  ===========================================
  在Linux中可以用
  ps auwx
  發(fā)現(xiàn)僵尸進程
  a all w/ tty, including other users 所有窗口和終端,包括其他用戶的進程
  u user-oriented 面向用戶(用戶友好)
  -w,w wide output 寬格式輸出
  x processes w/o controlling ttys
  在僵尸進程后面 會標注
  ps axf
  看進程樹,以樹形方式現(xiàn)實進程列表
  ps axm
  會把線程列出來,在linux下進程和線程是統(tǒng)一的,是輕量級進程的兩種方式。
  ps axu
  顯示進程的詳細狀態(tài)
  ===========================================
  killall
  kill -15
  kill -9
  一般都不能殺掉 defunct進程
  用了kill -15,kill -9以后 之后反而會多出更多的僵尸進程
  kill -kill pid
  fuser -k pid
  可以考慮殺死他的parent process,
  kill -9 他的parent process
  ===========================================
  一個已經(jīng)終止,但是其父進程尚未對其進行善后處理(獲取終止子進程的有關(guān)信息、釋放它仍占用的資源)的進程被稱為僵死進程(Zombie Process)。
  避免zombie的方法:
  1)在SVR4中,如果調(diào)用signal或sigset將SIGCHLD的配置設(shè)置為忽略,則不會產(chǎn)生僵死子進程。另外,使用SVR4版的sigaction,則可設(shè)置SA_NOCLDWAIT標志以避免子進程僵死。
  Linux中也可使用這個,在一個程序的開始調(diào)用這個函數(shù)
  signal(SIGCHLD,SIG_IGN);
  2)調(diào)用fork兩次。程序8 - 5 實現(xiàn)了這一點。
  3)用waitpid等待子進程返回.
  ===========================================
  zombie進程是僵死進程。防止它的辦法,一是用wait,waitpid之類的函數(shù)獲得
  進程的終止狀態(tài),以釋放資源。另一個是fork兩次
  ===========================================
  defunct進程只是在process table里還有一個記錄,其他的資源沒有占用,除非你的系統(tǒng)的process個數(shù)的限制已經(jīng)快超過了,zombie進程不會有更多的壞處。
  可能唯一的方法就是reboot系統(tǒng)可以消除zombie進程。
  ===========================================
  任何程序都有僵尸狀態(tài),它占用一點內(nèi)存資源(也就是進程表里還有一個記錄),僅僅是表象而已不必害怕。如果程序有問題有機會遇見,解決大批量僵尸簡單有效的辦法是重起。kill是無任何效果的
  fork與zombie/defunct"
  在Unix下的一些進程的運作方式。當一個進程死亡時,它并不是完全的消失了。進程終止,它不再運行,但是還有一些殘留的小東西等待父進程收回。這些
殘留的東西包括子進程的返回值和其他的一些東西。當父進程 fork() 一個子進程后,它必須用 wait() 或者 waitpid()
等待子進程退出。正是這個 wait() 動作來讓子進程的殘留物消失。
  自然的,在上述規(guī)則之外有個例外:父進程可以忽略 SIGCLD 軟中斷而不必要 wait()?梢赃@樣做到(在支持它的系統(tǒng)上,比如Linux):
  main()
  {
  signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
  .
  .
  fork();
  fork();
  fork(); /* Rabbits, rabbits, rabbits! */
 。
  現(xiàn)在,子進程死亡時父進程沒有 wait(),通常用 ps 可以看到它被顯示為“”。它將永遠保持這樣 直到 父進程 wait(),或者按以下方法處理。
  這里是你必須知道的另一個規(guī)則:當父進程在它wait()子進程之前死亡了(假定它沒有忽略 SIGCLD),子進程將把 init(pid
1)進程作為它的父進程。如果子進程工作得很好并能夠控制,這并不是問題。但如果子進程已經(jīng)是
defunct,我們就有了一點小麻煩?,原先的父進程不可能再 wait(),因為它已經(jīng)消亡了。這樣,init 怎么知道 wait() 這些
zombie 進程。
  答案:不可預料的。在一些系統(tǒng)上,init周期性的破壞掉它所有的defunct進程。在另外一些系統(tǒng)中,它干脆拒絕成為任何defunct進程的父
進程,而是馬上毀滅它們。如果你使用上述系統(tǒng)的一種,可以寫一個簡單的循環(huán),用屬于init的
defunct進程填滿進程表。這大概不會令你的系統(tǒng)管理員很高興吧?
  你的任務(wù):確定你的父進程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有進程。不過,你也未必 要 總是這樣做(比如,你要起一個 daemon 或是別的什么東西),但是你必須小心編程,如果你是一個 fork() 的新手。另外,也不要在心理上有任何束縛。
  總結(jié):
  子進程成為 defunct 直到父進程 wait(),除非父進程忽略了 SIGCLD 。
  更進一步,父進程沒有 wait() 就消亡(仍假設(shè)父進程沒有忽略 SIGCLD )的子進程(活動的或者 defunct)成為 init 的子進程,init 用重手法處理它們。
               
               
               

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/92500/showart_2185181.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(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