进程与线程的关系和区别
進程與線程的關(guān)系和區(qū)別
一、定義
進程:具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
線程:是進程的一個實體,是cpu調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但是它可以和同屬于一個進程的其他線程共享進程所擁有的的全部資源。
二、關(guān)系和區(qū)別
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行。相對于進程而言,線程是一個更加接近于執(zhí)行體的概念,它可以與同進程中的其他進程共享數(shù)據(jù),但是擁有自己的棧空間,擁有獨立的運行序列。
區(qū)別主要有以下幾點:
調(diào)度:進程是擁有資源的基本單位,線程是調(diào)度和分派的基本單位。
共享地址空間:進程擁有各自獨立的地址空間、資源,所以共享復(fù)雜,需要用IPC(Inter-Process Communication,進程間通信),但是同步簡單。而線程共享所屬進程的資源,因此共享簡單,但是同步復(fù)雜,需要用加鎖等措施。
占用內(nèi)存和cpu:進程占用內(nèi)存多,切換復(fù)雜,cpu利用率低;而線程占用內(nèi)存少,切換簡單,cpu利用率高。
互相影響:進程之間不會互相影響;而一個線程掛掉會導(dǎo)致整個進程掛掉。
三、關(guān)于僵尸進程
產(chǎn)生原因:當(dāng)子進程比父進程先運行結(jié)束,而父進程沒有回收子進程時,子進程將會成為一個僵尸進程。如果父進程先退出了,那么子進程將會被init接管,從而就不會成為僵尸進程了。
如何避免僵尸進程的產(chǎn)生?
解決方法有以下幾種:
父進程通過wait或waitpid等待子進程結(jié)束,但是這會導(dǎo)致父進程掛起。
如果父進程很忙,那么可以用signal函數(shù)為SIGCHLD安裝handler,這樣在子進程結(jié)束后,父進程會收到該信號,就可以在handler中調(diào)用wait回收。
若父進程不關(guān)心子進程何時結(jié)束,那么可以用 signal(SIGCHLD, SIG_IGN) 通知內(nèi)核自己對于子進程的結(jié)束不感興趣,這樣子進程結(jié)束后內(nèi)核會回收,并不會再給父進程發(fā)送信號。
讓僵尸進程變?yōu)?ldquo;孤兒進程”(即殺死其父進程),過繼給1號進程init,init始終會負(fù)責(zé)清理僵尸進程。
linux下如何查看和殺死僵尸進程?
使用 top 命令可以查看當(dāng)前是否存在僵尸進程,運行結(jié)果如下圖:
可以看到當(dāng)前系統(tǒng)中有6個僵尸進程,確定存在僵尸進程了,那么如何定位呢?別急,請往下看 ↓
定位僵尸進程和其父進程:ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
【注】:-A表示列出所有進程;-o 是自定義輸出字段,我們設(shè)定顯示字段為 stat(狀態(tài)), ppid(進程父id), pid(進程id),cmd(命令)這四個參數(shù);由于狀態(tài)為 z或者Z的進程為僵尸進程,所以我們使用grep抓取stat狀態(tài)為zZ進程。
運行結(jié)果如下圖:
一、定義
進程:具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
線程:是進程的一個實體,是cpu調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但是它可以和同屬于一個進程的其他線程共享進程所擁有的的全部資源。
二、關(guān)系和區(qū)別
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行。相對于進程而言,線程是一個更加接近于執(zhí)行體的概念,它可以與同進程中的其他進程共享數(shù)據(jù),但是擁有自己的棧空間,擁有獨立的運行序列。
區(qū)別主要有以下幾點:
調(diào)度:進程是擁有資源的基本單位,線程是調(diào)度和分派的基本單位。
共享地址空間:進程擁有各自獨立的地址空間、資源,所以共享復(fù)雜,需要用IPC(Inter-Process Communication,進程間通信),但是同步簡單。而線程共享所屬進程的資源,因此共享簡單,但是同步復(fù)雜,需要用加鎖等措施。
占用內(nèi)存和cpu:進程占用內(nèi)存多,切換復(fù)雜,cpu利用率低;而線程占用內(nèi)存少,切換簡單,cpu利用率高。
互相影響:進程之間不會互相影響;而一個線程掛掉會導(dǎo)致整個進程掛掉。
三、關(guān)于僵尸進程
產(chǎn)生原因:當(dāng)子進程比父進程先運行結(jié)束,而父進程沒有回收子進程時,子進程將會成為一個僵尸進程。如果父進程先退出了,那么子進程將會被init接管,從而就不會成為僵尸進程了。
如何避免僵尸進程的產(chǎn)生?
解決方法有以下幾種:
父進程通過wait或waitpid等待子進程結(jié)束,但是這會導(dǎo)致父進程掛起。
如果父進程很忙,那么可以用signal函數(shù)為SIGCHLD安裝handler,這樣在子進程結(jié)束后,父進程會收到該信號,就可以在handler中調(diào)用wait回收。
若父進程不關(guān)心子進程何時結(jié)束,那么可以用 signal(SIGCHLD, SIG_IGN) 通知內(nèi)核自己對于子進程的結(jié)束不感興趣,這樣子進程結(jié)束后內(nèi)核會回收,并不會再給父進程發(fā)送信號。
讓僵尸進程變?yōu)?ldquo;孤兒進程”(即殺死其父進程),過繼給1號進程init,init始終會負(fù)責(zé)清理僵尸進程。
linux下如何查看和殺死僵尸進程?
使用 top 命令可以查看當(dāng)前是否存在僵尸進程,運行結(jié)果如下圖:
可以看到當(dāng)前系統(tǒng)中有6個僵尸進程,確定存在僵尸進程了,那么如何定位呢?別急,請往下看 ↓
定位僵尸進程和其父進程:ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
【注】:-A表示列出所有進程;-o 是自定義輸出字段,我們設(shè)定顯示字段為 stat(狀態(tài)), ppid(進程父id), pid(進程id),cmd(命令)這四個參數(shù);由于狀態(tài)為 z或者Z的進程為僵尸進程,所以我們使用grep抓取stat狀態(tài)為zZ進程。
運行結(jié)果如下圖:
可以看到存在的6個僵尸進程的ID及其父進程的ID。
獲得僵尸進程的父進程ID之后,我們就可以使用命令殺死它了。
kill -9 父進程ID
例如:kill -9 16092
如果僵尸進程多了,這樣一個一個處理豈不是很慢?別著急,來個批處理命令一次搞定:
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
【注】:管道是 Linux 使用的主要進程間通信機制之一。一般而言,管道采用異步發(fā)送,阻塞式接收 (blocking receive) 操作,即接收進程在管道沒有有效數(shù)據(jù)時被掛起等待。在 Shell中使用管道符 “|” 可以將一個命令的輸出重定向到另一個命令的輸入,可以嵌套運行,管道連接的每個命令程序都按一個獨立進程執(zhí)行, 整串命令的退出狀態(tài)是最后一個命令的退出狀態(tài)。
awk '{print $2}'作用是一行一行地讀取前面的查找結(jié)果,打印第二個字段(即ppid);
xargs kill -9 中的 xargs 命令是用來把前面命令的輸出結(jié)果作為"kill -9"命令的參數(shù),并執(zhí)行該命令。
————————————————
總結(jié)
以上是生活随笔為你收集整理的进程与线程的关系和区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非典是哪年(让人胆 寒的非典)
- 下一篇: 小众又美好的成语(形容小众且高端的词)