本文以瀏覽器的進程和線程為切入點,以開源的Chromium為例,記錄了前端中的事件迴圈。同時記錄了一些面試題。關鍵詞:隊列,非同步。 ...
事件迴圈與瀏覽器有關,需要先瞭解其進程模型。
瀏覽器的進程模型
進程
程式運行需要其專屬的記憶體空間,用於存儲變數、執行函數等操作,可以將這塊記憶體空間簡單地理解為進程。
每個應用至少有一個進程,進程之間相互獨立,即使要通信,也需要雙方同意。
線程
有了進程後,就可以運行程式的代碼了,由線程運行代碼。
一個進程至少有一個線程,在進程開啟後會自動創建一個線程來執行代碼,稱為主線程。
如果主線程結束了,那麼進程就結束了。
如果程式需要同時執行多塊代碼,主線程就會啟動更多的線程來執行代碼,所以一個進程中可以包含多個線程。
瀏覽器的進程和線程
瀏覽器是一個多進程多線程的應用程式。
為了避免相互影響,為了減少連環崩潰的幾率,當啟動瀏覽器後,它會自動啟動多個進程。
現代瀏覽器已經非常複雜了,複雜程度在向操作系統靠近。
啟動chrome瀏覽器,打開其任務管理器:
可以發現儘管沒有訪問任何網頁,也有一些進程是自動啟動的。
打開一個新的標簽頁,這裡打開了百度,可以發現不同的標簽頁屬於不同的進程。
其中,最主要的進程有:
-
瀏覽器進程
瀏覽器進程是最先啟動的進程,其它進程由它啟動。
主要負責界面顯示、用戶交互、子進程管理等。瀏覽器進程內部會啟動多個線程處理不同的任務。
這裡的界面顯示不是指網頁的內容渲染,而是指瀏覽器的界面,比如瀏覽器的頭部:
用戶交互是指用戶在瀏覽器上的點擊、鍵盤、滾輪等操作,瀏覽器需要監聽這些用戶交互操作。
子進程管理包含網路進程、渲染進程等等。
-
網路進程
負責載入網路資源。網路進程內部會啟動多個線程來處理不同的網路任務。
-
渲染進程
渲染進程啟動後,會開啟一個渲染主線程,主線程負責執行HTML、CSS、JS代碼。
預設情況下,瀏覽器會為每個標簽頁開啟一個新的渲染進程,以保證不同的標簽頁之間不相互影響。
這種模式可能會在以後的版本被替換掉,因為每個標簽頁都開啟一個新渲染進程會導致chrome成為“記憶體殺手”。——2023.10
Chromium Docs - Process Model and Site Isolation (googlesource.com)