很多情況下我們會(huì)遇到編程模型選擇的問(wèn)題:多進(jìn)程 or 多線程 ? 下面簡(jiǎn)要介紹下兩者區(qū)別:
多進(jìn)程 | 多線程 | |
資源 | 進(jìn)程是資源分配的基本單位,獨(dú)占用整個(gè)進(jìn)程所有資源 | 進(jìn)程內(nèi)所有線程共享進(jìn)程資源
|
通信 | 需要借助共享內(nèi)存、管道、信號(hào)量、socket等方式實(shí)現(xiàn) | 由于線程資源共享,很容易實(shí)現(xiàn)各線程間消息通信 |
編程 | 編程調(diào)試簡(jiǎn)單,可靠性高,創(chuàng)建銷毀系統(tǒng)開(kāi)銷大 | CPU調(diào)度的基本單位,切換速度快,資源訪問(wèn)互斥、同步導(dǎo)致編程復(fù)雜度增加,同時(shí)也不方便調(diào)試 |
信號(hào) | 每個(gè)進(jìn)程獨(dú)立控制信號(hào) | 進(jìn)程內(nèi)所有線程共享信號(hào)處理函數(shù),除了SIGSEGV,SIGALRM這樣的信號(hào)會(huì)直接發(fā)送給調(diào)用線程,其余的信號(hào)都默認(rèn)交給主線程。信號(hào)處理邏輯復(fù)雜 |
上面表格中寫(xiě)出了多線程、多進(jìn)程的基本區(qū)別,除了上述內(nèi)容我們還有一些需要關(guān)注的點(diǎn):
由于所有線程共享進(jìn)程的資源,因此所有線程能夠打開(kāi)的最大文件描述符數(shù)(包含socket)之和等于進(jìn)程支持的最大文件描述符數(shù);所有線程棧(默認(rèn)8MB)大小的總和等于進(jìn)程訪問(wèn)的最大地址空間,因此如果線程創(chuàng)建了一個(gè)超大的局部數(shù)組或者其他結(jié)構(gòu),可能會(huì)導(dǎo)致所有線程所占的地址空間總和超出進(jìn)程地址空間的范圍進(jìn)而觸發(fā)SIGSEGV段錯(cuò)誤,致使整個(gè)程序崩潰。
多線程的優(yōu)勢(shì)在于共享進(jìn)程中的全局資源以及堆區(qū)資源,極大方便了各個(gè)線程間信息的交換;在帶來(lái)方便的同時(shí),為了保