單進程編程:順序執行 數據同步 復雜度低 用途單一
多進程編程:同時執行 數據異步 復雜度高 用途廣泛
1. 多進程的優勢在於任務的獨立性,比如某個任務單獨作為一個進程的話,崩潰只影響自己的服務,其他任務不受影響.如果是多個任務在同一個進程內部利用多個線程進行處理,某個線程發生了未處理的異常的話,會導致整個進程完蛋,所有的任務跟着遭殃
2. 從資源分配上來說,多進程方案比多線程方案更加靈活和自由
3. 不過任務間的通信方面多進程要比多線程復雜些,編一個好的多進程通信方案要比多線程間的通信方案困難多了
以web server為例的話,比如我的服務器上架設了三個網站,如果是用一個進程管理的話, 網站A遭受攻擊死掉了,意味着另外兩個網站會出現同樣的現象. 如果是分開獨立的進程的話,三個網站互不影響
單進程VS多進程 優點:
1. 初期實現起來比較簡單快速,省去了進程間通信的工作
2. 單一性使得部署和運營比較簡單
3. 內存占有少, 現在內存都很便宜,這個優勢不明顯
4. 進程內部通信效率比IPC/socket等要高效
單進程VS多進程 缺點:(引用:http://blog.csdn.net/blade2001/article/details/6790890)
1. 中后期隨着業務邏輯的復雜化和需求的增加,這個單進程會變得臃腫, 難以維護。 一個任務分解成多個進程會使單個進程的邏輯簡單,而不容易出錯
2. 同進程內模塊間是強依賴關系,需要在一起編譯相互的影響也比較大。 這相對於多進程間通信來說, 耦合度較大, 不利於多團隊並行開發。 多進程更便於多語言的協作開發。
3. 任何模塊的崩潰都將導致整個進程的失效,多進程模式更加穩定健壯,業務處理程序隔離運行, 一個Crash不會影響其他
4. 性能問題: 如果不支持進程間cascading的話,單進程的capacity是受限的, 這個性能瓶頸對於支持群組類服務的尤其需要考慮。多進程部署極其靈活,可以擴充機器數量來提高系統處理性能,還可以從硬件上避免單點故障。
5. 單進程中多線程難調試
如果需要高性能處理,只要根據實際情況設計合理,多進程和多線程都是可行的。
如何選擇取決於業務要求, 在高端應用中穩定是關鍵,效率和功能只能排第二, 如金融系統。即使是重負載程序,也分很多種:計算密集型、I/O密集型、通信密集度?
為了應對瀏覽器經常出現崩潰的現象,現在很多瀏覽器廠商都采用了多進程標簽瀏覽的概念,其中包括主的IE8、Chrome、 Firefox瀏覽器,而眾多基於WebKit的瀏覽器在蘋果發布WebKit2內核以后已經將可以后采用多進程標簽瀏覽這個功能。
搜狗瀏覽器是多進程瀏覽器,
在瀏覽器中添加多進程瀏覽之后,即使是瀏覽器其中的一個進程出現了崩潰現象,其他的進程也不會受到影響。例如一個網站中有漏洞或包含惡意代碼、木馬等網絡攻擊,有可能摧毀當前運行在這個網站上的標簽,但是卻不會影響其他的進程或整個瀏覽器。多進程是瀏覽器發展趨勢,微軟windows系統自帶IE以后也不會有單進程了
Linux中多進程、多線程編程需要注意什么問題?
注意同步啊。別搞成死鎖了
Linux多進程編程實例
創建兩個子進程;一個子進程(生產者進程)依次向緩沖區寫入整數0,1,2,...,9;另一個子進程(消費者進程)暫停5s后,從緩沖區讀數,每次讀一個,並將讀出的數字從緩沖區刪除,然后將數字顯示出來;父進程等待子進程2(消費者進程)的退出信息,待收集到該信息后,父進程就返回。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
int i = 0;
int *nCount;
int pfd[2];
char szBuff[11] = {0};
int status;
pid_t pid;
pipe(pfd);
if (fork() == 0)
{
nCount = malloc(sizeof(int) * 10);
for (i = 0; i < 10; ++i)
{
nCount[i] = i;
sprintf(szBuff, "%s%d", szBuff, nCount[i]);
}
write(pfd[1], szBuff, strlen(szBuff));
free(nCount);
close(pfd[0]);
close(pfd[1]);
}
else
{
if (fork() == 0)
{
printf("sleep (5) !\n");
sleep(5);
read(pfd[0], szBuff, 10);
printf("%s\n", szBuff);
close(pfd[0]);
close(pfd[1]);
}
else
{
pid = wait(&status);
i = WEXITSTATUS(status);
printf("child is %d ,exit status =%d\n", pid, i);
pid = wait(&status);
i = WEXITSTATUS(status);
printf("child is %d ,exit status =%d\n", pid, i);
}
}
close(pfd[0]);
close(pfd[1]);
return 0;
}
-------------------------------------------------------
解釋一下,由於fork出的進程有自己獨立的空間,所以兩個子進程通信用pipe(管道),由一個子進程malloc出空間,寫給子進程2,子進程2接收后返回!