同樣使用 Chromium 內核的瀏覽器,採用單進程和多進程方式各有何利弊?

好像360用的是單進程,而七星、chrome、115這些用的都是多進程,順便一提火狐是單進程,各自有什麼優劣呢?


多進程的好處自然是容易隔離。為什麼要隔離?一是因為程序都有bug,特別是頁面渲染這一塊。有些bug導致的結果並不是try-catch然後退出當前線程就能控制的,有可能進程中的其他內存地址的內容也被寫壞了,導致整個進程崩掉。二是有些頁面可能造成死循環,這也很難在線程級別進行隔離。

進程級別的隔離就容易多了,殺掉一個進程就都乾淨了,就算死循環了只要不進kernel也都能幹凈利落地殺掉。

從劣勢來說,有人說會有性能開銷問題。當然一個進程的開銷要比線程高很多,但總的來說多進程的額外開銷還好啦。從chrome來看,並不是每個chrome進程都是做同樣的事情的,而是有一個主進程負責大部分的操作,包括用戶UI,窗體控制。而每個網頁標籤的具體渲染工作是交給一個子進程執行的,要注意的是這個子進程是純後台沒有UI的,它做的只是html的渲染,而真正顯示給用戶看的步驟還是主進程完成的,當然這只不過是paint一個bitmap而已。

所以本身父子進程之間並沒有重複的邏輯,沒有太多額外開銷。各個子進程之間確實有重複的模塊需要被載入到各自進程中,但要注意的是在Windows中多個進程載入相同的DLL時其實在物理內存中是共享的,當然那些DLL代碼所動態申請的內存(堆)在各進程中是獨立的,所以那些公共的全局的對象初始化操作確實是在各進程中重複執行了。

另一個額外開銷就是進程間通訊的代價一般要比進程內高(直接寫內存了),不過如果使用類似shared memory section這樣的技術的話其實也還好啦。


多進程都是為了解決一個問題:穩定性。瀏覽器穩定性一直是個大難題,而最最無奈的一點是,最大的隱患之一併不是瀏覽器能解決的:網頁代碼才是罪魁禍首。

也就是說,你瀏覽器做的再牛x,很可能碰到一個坑爹網站就崩了……

為了解決這個問題,最早有些瀏覽器想了個招數,外框是一個線程,頁面是一個線程,然後頁面崩潰了,瀏覽器還在……其實沒什麼卵用……

後來不知道是誰首先提出的,反正到了Chrome,就變成了一個網頁一個進程……誰崩了就崩自己~

弱點也就很明顯了,吃資源。雖然是多標籤的,實際上都是獨立運行的。視覺上也不好,搞的任務管理器亂爬趴的……


謝邀,其實這要看電腦配置。在電腦配置高的機器上多進程處理事務的速度會快上不少。配置低的話沒什麼區別。

還有其實很多瀏覽器用的不是自己的內核,國內大多數瀏覽器都是基於ie內核的。


推薦閱讀:

美國CS本科生可以做一些什麼項目來證明自己的軟體工程能力? 大家本科階段自己都獨自實現了一些什麼項目?
Android 操作系統為什麼不啟用swap?
大部分安卓手機真的都能升級android 8.0嗎?
如何最有效的解決Google公共庫&字體庫被屏蔽的問題?

TAG:GoogleChrome | 程序員 | 網頁瀏覽器 | 編程 | 谷歌Google |