為什麼要執行多個進程,把所有功能都放到一個進程裡面執行會影響性能嗎?

如果我把所有進程的裡面的function,都放到一個進程裡面,通過事件驅動方式來實現,I/O通過非同步非阻塞,這樣會不會提高效率?對於只有一個cpu來說,進程切換無非是優先順序和時間片輪詢等,事件驅動也能實現類似,但可以節省內存與進程切換的資源,希望大家給點意見


當然可以。

只要有個方式讓一段代碼交出控制權保證其他代碼有機會執行就是了。時間片輪詢只是一種方法。fiber啦coroutine啊都是方法。

但是,這不一定公平。比如用IO事件來切換控制權,如果兩個純計算任務都沒有觸發中斷,那必然有一個會很倒霉。。。又比如需要代碼主動交出控制權的話,可以想像你的計算機很快就將變成硝煙瀰漫的戰場。。。

為了保證公平,很快你還是會採用時間片,並且由一段具有更高特權的代碼來分配。

然後,每次有新的功能要加進來的時候,你可能需要重新編譯整個系統。還有,現在你的所有代碼都在內存里,你的內存很快就會不夠用。對了,隨著任務越來越多代碼越來越龐大你的腦子也會亂掉。

最終,你會按功能把代碼獨立組織調度,再把不同任務代碼的邏輯也分開,然後在需要的時候把對應代碼調入內存執行。為了防止一段代碼崩潰影響整個系統,某種隔離技術也會被發明。

於是你重新發明了進程。。。

對了,在這個過程中,你可能還會重新發明文件系統、邏輯地址和虛擬內存。

一個操作系統就這麼成了。

嗯哼~


把整個操作系統看做一個進程就可以了


XY,事件驅動能實現時間片輪詢嗎?我怎麼想都做不到吧?

比如A事件來了觸發A任務,然後B事件又來了,應該觸發B任務,但是你就一個進程,函數都是順序執行的,A任務沒執行完怎麼切換到B任務?怎麼都得等A任務搞完之後才輪的到B任務吧?

你可以強行在A任務里插一個跳轉,或者強行讓A任務執行一會就退出來到B,但那個顯然不如時間片輪詢優雅吧。反正我是沒想到有完美替代的方案,不知道你實現類似功能的構想是怎樣的,可以說出來討論一下。

總之,就是我現在想要A任務在運行到任意位置的時候切換到B任務運行,接著還希望在B任務運行到任意位置時再切回到A任務現場接著運行。這個需求怎麼在單進程內實現?我真的想不出。

你IO當然可以實現非同步了,但很多時候,希望非同步並行的不止是IO任務啊?


那如果大進程里有個玩意有bug會crash怎麼辦,所有邏輯跟著一起奔潰嗎


可以。理論上效率會更佳。

但人腦無法在這麼複雜的系統上開發。


一般程序開的進程數大致等於CPU的內核數,如果過多會導致頻繁上下文切換影響效率,過少無法發揮多核cpu的工作能力,多進程比多線程的好處就是易於管理和監控,操作系統管理進程的各種工具方法遠多於對線程的,一個進程有問題關掉重開就行,一個線程有問題通常程序就要重啟了,另外一般驅動程序的寫法就是大循環不停的 while(1) 然後dosomething


只知道windows的情況,linux沒用過不知道

多進程最大的好處是可以讓操作系統對多進程的安排進行管理和優化,而操作系統在這方面做得優化一般比你自己做得好

另外就是多進程在操作系統層級獲得的總資源,比起單進程多線程,獲得的總資源更多。

當然,進程對進程的通信,肯定比線程對線程的通信來的慢。而且如果你本來也有需要共享的資源的話,那麼線程顯然也是更合適的選擇

最後最關鍵的就是,如果一個線程crash那麼整個進程包括裡邊的所有其他線程都會立刻完蛋,而且在很多情況下,沒有任何辦法恢復也沒有辦法檢查。

但是如果多進程就不一樣了,大不了重開一次,對於其他並行運行的東西是沒有任何影響的

基本就這樣。


推薦閱讀:

Nginx源碼中值得學習的編程風格有哪些?
請問nginx比apache性能高為什麼apache現在依然流行?
為什麼 node.js 的官網不用 node.js 而用 nginx 搭建?
Nginx 和 Apache 各有什麼優缺點?
有哪些知名網站Web伺服器是Nginx?

TAG:Nginx | Linux開發 | 進程管理 | 進程 |