進程?線程?傻傻分不清楚

今天,我來學習一下關於瀏覽器的知識,想着讓本身的知識體系更加系統一點的心態來學習一下進程和線程
什麼是進程?什麼是線程?都有啥用?咱們來參考Chrome瀏覽器的架構,去具體的理解這二者的關係和用途....

咱們先來看這樣一個頗有意思的狀況, 咱們僅僅打開一個頁面, 爲何出現了四個進程??? 這裏要注意, 這是四個進程!!!

image.png

咱們帶着這樣的思考,先來了解一個問題,什麼是並行處理???

答: 計算機中的並⾏處理就是同⼀時刻處理多個任務,⽐如咱們要計算下⾯這三個表達式的值,並顯⽰出結果。瀏覽器

A = 1+2
B = 20/5
C = 7\*8

在編寫代碼的時候,咱們能夠把這個過程拆分爲四個任務:安全

任務1 是計算A=1+2;
任務2 是計算B=20/5;
任務3 是計算C=7*8;
任務4 是顯⽰最後計算的結果。

正常狀況下程序可使⽤單線程來處理,也就是分四步按照順序分別執⾏這四個任務。網絡

多線程會怎麼處理呢? 就兩步:多線程

第一步: 同時執行任務1,2,3
第二部: 最後執行任務4

哇哦,這樣子會節省不少時間啊,大大滴提高了咱們的性能架構

哈哈哈,是的,多線程會大大滴提高性能,可是 線程不可能獨立存在,它是由進程來啓動管理的, 那進程是啥???性能

一個進程就是一個程序運行的實例。 就是啓動一個程序的時候, 操做系統會爲該程序建立一塊內存, 用來存放代碼、運⾏中的數據和⼀個執⾏任務的主線程, 咱們把這樣的運行環境,叫作進程學習

來看下面這張對比圖:

image.png
從圖中能夠看到,線程是依附於進程的,而進程中使用多線程並行處理能提高運算效率spa

總結來講吧,進程和線程有以下四個特色:
1. 進程中的任意一個線程執行出錯,都會致使整個進程崩潰操作系統

2. 線程之間共享進程中的數據
image.png插件

從上圖能夠看出,線程一、線程二、線程3分別把執行的結果寫⼊A、B、C中,而後線程2繼續從A、B、C中讀 取數據,用來顯示執行結果。

3. 當一個進程關閉以後,操做系統就會回收進程所佔用的內存

當一個進程退出的時候,操做系統就會回收該進程所申請的全部資源。好比,關閉Chrome瀏覽器的頁面,那該頁面所佔用的資源就會被系統回收

注意: 即便其中任意的線程由於操做的不當,從而致使內存泄漏,這些內存也會被回收

4. 進程之間的內容是相互隔離的
一個A進程與一個B進程,兩個進程是相互隔離,沒法訪問的,若是你須要進程之間進行數據通訊,這時候要使用進程間的通訊機制(IPC)

爲何要更改架構呢?以前的架構是什麼?


爲啥要改架構呢?確定是由於時代在進步啦....

你這不廢話, 額..., 那這麼說, 他更改架構確定是沒法知足一個階段內的用戶需求, 大家可能沒經歷過, 可是我經歷過, 不是Chrome瀏覽器, 是IE.....

當我打開許多頁面的時候, 其中的一個頁面崩潰了, 但是卻致使整個瀏覽器涼涼...., WTM.....心態炸了啊, 搞個球啊...., 哈哈哈, 那時候就是這樣------那時就是單進程瀏覽器時代

他把全部的進程模塊都運行在了一個進程裏面, 你想一想一下, 我打開了5個頁面, 這些頁面都是同一個進程, 那我一個頁面崩潰了, 確定帶動了其餘頁面啊, 那爲啥當時沒感受啥呢, 仍是能忍受, 唉, 一言難盡, 沒有對比就沒有傷害唄!!!

那咱們來根據以前的架構對比一下:

單進程瀏覽器所存在的問題:

問題1: 不穩定

很明顯,以前的瀏覽器非常不穩定,具體來講,以前的瀏覽器實現Web視頻、Wab遊戲等要藉助於插件來實現,插件這個東西自己就不穩定, 你還運行在瀏覽器裏, 一個插件崩潰了, 哦也....集體涼涼,對吧!!!

那就不會吧插件作穩定點啊, 好插件穩定了, 渲染引擎模塊也是不穩定的, 這...., 這點工資很難實現這個需求啊, 哈哈哈

問題2: 不流暢

咋會不流暢呢?很簡單,我寫了一個無限循環的腳本, 放進瀏覽器中, 哈哈哈 ,只要你打開了我這個頁面, 你瀏覽器就涼涼, 額..., 操做挺騷啊~~

除了這個,想一想一下, JS代碼運行在這個進程中之外, 還有插件...., 你保證你不遍歷了? 額....,TMD。哈哈哈,這時候開始心態就崩了?早了點!!TM還有啥? 頁面的內存泄漏

他咋會...., 有問題的頁面關了不就好了? 不行, 首先瀏覽器的內核很是複雜, 運行一個複雜點的頁面, 會存在內存不能徹底回收的狀況, 這個須要理解, 可是隨着使用時間越長, 內存佔用越高, 瀏覽器愈來愈慢,啊....上天,這東西能用???哈哈哈,別急,還有問題....沒結束呢!!!

問題3: 不安全

若是, 一個插件釋放了病毒, 或者一個頁面釋放了病毒, 竊取了你的帳號密碼,誒嘿,那你想一想,同一進程下的其它頁面吧..., 臥槽,我登陸的傳奇啊, 個人貪玩藍月啊, 咋一夜裝備都被賣了啊...., 哈哈哈,TMD...我想起被盜號的時候了...

多進程瀏覽器特色:

特色1: 解決不穩定性

進程是相互隔離的, 你的其中一個頁面進程崩潰, 誒?瀏覽器沒事,哈哈哈,這個頁面關閉,再打開就行

特色2: 解決不流暢

一個頁面死循環,千千萬個頁面沒咋地,哈哈哈, 那我這個頁面內存泄露了咋整? 別慌啊, 關閉這個頁面, 回傳都會被系統回收,nice,NB!!!

特色3: 安全問題

這裏有一個名詞, 你們應該聽過, 安全沙箱, 具備問題的地方,都會被放到沙箱裏面, 惡意程序沒法突破沙箱獲取系統權限,哦吼?盜號?不存在滴....

如今你應該明白了, 問啥打開一個Chrmoe頁面有四個進程了, 至少須要1個網絡進程, 1個瀏覽器進程, 1個GPU進程, 1個渲染進程; 若是運行了插件, 還會有1個插件進程

那如今的多進程架構就沒啥缺點?
想啥呢, 沒缺點還要需求幹嗎, 哈哈哈

缺點1: 更高的資源佔用

每一個進程都會包含公共基礎結構的副本(JS的運行環境), 這就意味着消耗更多的內存資源, 換個128G的內存,哈哈哈....

缺點2: 更復雜的體系架構

瀏覽器各模塊之間耦合性高, 擴展性差等問題, 這樣會致使如今的架構很難適應新的需求, 時代變化沒法預測呀, 開發人員也很不容易滴

爲了解決如上的問題, 在2016年,Chrome團隊使用面向服務架構, 我擦,2016年就這麼高大上了???

這樣就把原來的各類模塊從構成獨立的服務, 每一個服務都會在獨立的進程中運行, 訪問服務必須定義好接口, 經過IPC來通訊, 這樣就構建了一個更加內聚、鬆耦合、易於維護的擴展的系統

這裏就再也不多闡述了

總結:


  1. 咱們瞭解了什麼是進程,什麼是線程,以及他們的相互關係
  2. 咱們瞭解了爲何會出現多進程架構,以及他的好處,還有單進程架構的不足
  3. 咱們知道了Chrome瀏覽器將來發展的方向, 這將是一個不斷更新迭代的漫長過程, 也是咱們技術人員須要不斷了解研究的漫長過程

好啦, 就聊到這裏, 關注一下, 避免迷路, 每週不定時,不定量更新!!!

謝謝你們支持!!!