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