一、瀏覽器的進程
在瀏覽器中打開一個網(wǎng)頁蘸泻,相當于新起一個進程琉苇,進程內(nèi)有自己的多線程。
如果是單線程悦施,那么某個tab頁奔潰了并扇,就影響整個瀏覽器,體驗差抡诞。所以瀏覽器是多線程的穷蛹。
二、瀏覽器的內(nèi)核(渲染進程)
頁面渲染昼汗、js的執(zhí)行肴熏、事件的循環(huán)都在這個進程進行。
瀏覽器的渲染進程是多線程的顷窒。
包含哪些線程呢蛙吏?
1、GUI渲染線程
? ? .?=>負責渲染瀏覽器界面鞋吉,解析HTML出刷、css、構(gòu)建dom樹和renderObject樹坯辩、布局馁龟、繪制等;
? ? .?=>當界面需要重繪(repaint)或由于某種操作引發(fā)回流(reflow)時漆魔,該線程就會執(zhí)行坷檩;
? ? .?=>GUI渲染線程與js引擎線程是互斥的:當js引擎執(zhí)行時却音,GUI線程會被掛起(相當于被凍結(jié)了),GUI更新會被保存在一個列隊中矢炼,等到js引擎空閑時立即被執(zhí)行
2系瓢、js引擎線程
? . => js內(nèi)核負責處理JavaScript腳本程序
? ??.=>js引擎線程負責解析JavaScript腳本,運行代碼
? ??.=>js引擎一直等待著任務列隊中任務的到來句灌,然后加以處理夷陋。一個tab頁(render進程)中無論什么時候都只有一個js線程運行js程序
? ? ?.=>同樣注意,CUI渲染線程與js引擎線程是互斥的胰锌。所以如果js執(zhí)行時間過長骗绕,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞资昧。
3酬土、事件觸發(fā)線程
? ? .?=>事件觸發(fā)線程歸屬于瀏覽器而不是js引擎。用來控制事件的循環(huán)格带〕方桑可以理解為:js引擎忙不過來,需要瀏覽器另開線程來協(xié)助叽唱。
? ? .?=>當js引擎執(zhí)行代碼如setTimeout時(也可來自瀏覽器內(nèi)核的其他線程屈呕,如鼠標點擊、ajax異步請求等)棺亭,將會對應任務添加到事件線程中虎眨。
? ? .?=>對對應的事件符合條件被觸發(fā)時,該線程會把事件添加到待處理隊列尾部侦铜,當代js引擎處理
? ? .?=>JS單線程關(guān)系,待處理隊列中的事件都是排隊钟鸵。等待js引擎處理js引起空閑才會去執(zhí)行
4钉稍、定時器觸發(fā)線程
? .?=>傳說中的setInerval 與 setTimeout 所在的線程
?? .?=> 瀏覽器定時器計數(shù)器并不是由js引擎計數(shù)的(因為js引擎是單線程的,如果處于阻塞狀態(tài)就會影響計時的準確性)
? .?=>因此棺耍,通過單線程來計時并觸發(fā)定時(計時完畢后添加到事件列隊中贡未,等待js引擎空閑后執(zhí)行)
? .?=>W3C在HTML標準中規(guī)定,需要setTimeout中低于4ms的時間間隔算為4ms