瀏覽器工作原理

  • 為什么js是單線程,web works是多線程?
  • 為什么js單線程卻擁有異步饭尝?
  • event loop募闲?
  • 為什么setTimeout時(shí)間時(shí)間不準(zhǔn)確

瀏覽器的主要功能就是向服務(wù)器發(fā)出請(qǐng)求,在瀏覽器窗口中展示您選擇的網(wǎng)絡(luò)資源罗捎。這里所說(shuō)的資源一般是指 HTML 文檔观谦,也可以是 PDF、圖片或其他的類型桨菜。資源的位置由用戶使用 URI(統(tǒng)一資源標(biāo)示符)指定豁状。

瀏覽器的高層結(jié)構(gòu)

用戶界面:地址欄,瀏覽器頁(yè)面前進(jìn)后退倒得,刷新和停止刷新按鈕泻红,書簽...
瀏覽器引擎:用戶界面與呈現(xiàn)引擎之間傳送指令
呈現(xiàn)引擎:顯示請(qǐng)求內(nèi)容,解析html&css
網(wǎng)絡(luò):網(wǎng)絡(luò)調(diào)用屎暇。
用戶界面后端:用戶繪制基本的小窗口部件
JS解釋器:用于解析和執(zhí)行js代碼
數(shù)據(jù)存儲(chǔ):瀏覽器在硬盤上保存的各種數(shù)據(jù)承桥。

瀏覽器是多進(jìn)程的

瀏覽器設(shè)置中可以找到瀏覽器的任務(wù)管理


任務(wù)管理器.png

可以看每個(gè)頁(yè)面都是獨(dú)立的進(jìn)程,


任務(wù)管理器1.png

進(jìn)程分一下幾種:
  • 主進(jìn)程:主進(jìn)程根悼,只有一個(gè)
  • 瀏覽器渲染進(jìn)程:進(jìn)程之間互不影響
  • 第三方插件進(jìn)程:使用時(shí)創(chuàng)建進(jìn)程
  • GPU進(jìn)程:用于3D繪制

瀏覽器輸入網(wǎng)頁(yè)之后發(fā)生了什么凶异?

呈現(xiàn)引擎示意圖(webkit舉例)


webkit.png
  • 呈現(xiàn)引擎解析html文檔,講標(biāo)記轉(zhuǎn)化成‘樹’挤巡,同時(shí)解析外包c(diǎn)ss文件剩彬。

  • 創(chuàng)建呈現(xiàn)樹,包含視覺屬性(顏色和尺寸)矿卑,排列順序就是屏幕展示順序

  • 呈現(xiàn)樹中每個(gè)節(jié)點(diǎn)應(yīng)該出現(xiàn)在屏幕的確切坐標(biāo)

  • 為了更好的用戶體驗(yàn)喉恋,引擎會(huì)力求盡快將內(nèi)容展示在屏幕上。

  • 解析器遇到<script>標(biāo)記時(shí)會(huì)立即解析腳本母廷,直到資源加載完成轻黑,也可以通過(guò)添加’defer‘,這樣不會(huì)停止文檔解析琴昆。

  • 網(wǎng)絡(luò)操作與以上同時(shí)進(jìn)行氓鄙。

  • js解析,由單獨(dú)的腳本引擎解析執(zhí)行业舍,通常狀態(tài)是動(dòng)態(tài)的改變dom樹抖拦,如果js是多線程升酣,當(dāng)兩個(gè)線程同時(shí)修改同一個(gè)dom節(jié)點(diǎn),下達(dá)兩個(gè)矛盾的命令時(shí)态罪,瀏覽器的執(zhí)行就成了問(wèn)題
    以上解決了為什么js是單線程噩茄,web works是多線程?

為什么js單線程卻擁有異步复颈?
單線程是指cpu一次只能做一件事绩聘,js在任務(wù)隊(duì)列中提取任務(wù)放到主任務(wù)中執(zhí)行,瀏覽器為異步任務(wù)單獨(dú)開辟線程耗啦。就不得不說(shuō)到Event Loop君纫。

Event Loop

JS是單線程的,當(dāng)遇到大量任務(wù)或耗時(shí)任務(wù)時(shí)會(huì)卡死芹彬,線程大部分事件都在空等I/O的返回結(jié)果蓄髓。這種方式稱之為’同步‘。
Event Loop解決了此類問(wèn)題舒帮,在程序中設(shè)置兩個(gè)線程会喝,一個(gè)主線程,負(fù)責(zé)程序本身的運(yùn)行玩郊,一個(gè)另一個(gè)負(fù)責(zé)與其他線程之間的通信肢执。
首先要了解常用宏任務(wù),微任務(wù)
宏任務(wù):

  • setTimeout
  • setInterval
    微任務(wù)
  • Promise
  • nextTick(node)
    Event Loop流程:
  • 執(zhí)行全局同步代碼译红,調(diào)用棧清空
  • 取出微任務(wù)隊(duì)列首位任務(wù)预茄,放入調(diào)用棧中。直到全部微任務(wù)執(zhí)行完成侦厚。
  • 取出宏任務(wù)隊(duì)列首位任務(wù)耻陕,放入調(diào)用棧中執(zhí)行,其中產(chǎn)生的微任務(wù)放入微任務(wù)隊(duì)列刨沦,宏任務(wù)同理诗宣。
  • 重復(fù)二三步操作,直到全部執(zhí)行完成想诅。
setTimeout(()=>{
    console.log('time1');
    Promise.resolve().then(()=>{
        console.log('p1')
    })
})
setTimeout(()=>{
    console.log('time2');
    Promise.resolve().then(()=>{
        console.log('p2')
    })
})

如圖

event loop 網(wǎng)圖

setTimeout時(shí)間時(shí)間不準(zhǔn)確 :很多原因都會(huì)導(dǎo)致setTimeout 沒(méi)有按時(shí)執(zhí)行召庞,原因之一異步執(zhí)行setTimeout,將setTimeout放入宏任務(wù)棧隊(duì)列来破,等執(zhí)行到宏任務(wù)隊(duì)列時(shí)篮灼,代碼移出本輪事件循環(huán),等到下一輪事件循環(huán)徘禁,再檢查是否到了指定時(shí)間诅诱。所以會(huì)有一定程度的延遲。

var date = new Date();
setTimeout(()=>{
  new Promise(
      function (resolve, reject) {
           setTimeout(resolve)
      }
    ).then(()=>{
        console.log(new Date()-date,'p');
    })
})
setTimeout(function(e) {
    console.log(new Date()-date,'s');
});

輸出1 "s" 3 'p'
雖然setTimeout中沒(méi)有設(shè)置時(shí)間晌坤,但還是延遲執(zhí)行了一段時(shí)間逢艘。

在瀏覽器中,setTimeout()/setInterval() 的每調(diào)用一次定時(shí)器的最小間隔是4ms(摘自MDN)骤菠,也會(huì)導(dǎo)致setTimeout沒(méi)有按時(shí)執(zhí)行

例如:

var date = new Date();
setTimeout(function() {
    setTimeout(function() {
        setTimeout(function() {
            setTimeout(function() {
                setTimeout(function() {
                    setTimeout(function() {
                        console.log(new Date()-date);
                    }, 0);
                }, 0);
            }, 0);
        }, 0);
    }, 0);
}, 0);

如果每個(gè)間隔是4ms它改,輸出應(yīng)該是20,實(shí)際輸出是16 17 ...商乎,實(shí)踐證明其實(shí)間隔不一定是4ms

setTimeout(function(){console.log('4');},4)
setTimeout(function(){console.log('3');},3)
setTimeout(function(){console.log('2');},2)
setTimeout(function(){console.log('1');},1)
setTimeout(function(){console.log('0');},0)

以上代碼你覺得會(huì)輸出什么央拖?
實(shí)際輸出 1 0 2 3 4,不同瀏覽器輸出結(jié)果不同鹉戚,每次輸出結(jié)果也有可能不同鲜戒。
是因?yàn)椋瑂etTimeout在宏任務(wù)隊(duì)列中抹凳,主線程按順序執(zhí)行宏任務(wù)隊(duì)列遏餐,發(fā)現(xiàn)沒(méi)有可以執(zhí)行的宏任務(wù),遍歷隊(duì)伍有沒(méi)有可以執(zhí)行的任務(wù)赢底,4ms時(shí)間還沒(méi)到失都,每次掛起一個(gè)settimeout的時(shí)候都會(huì)循環(huán)一遍事件隊(duì)列。1比0先執(zhí)行是因?yàn)?先被掛起幸冻。

參考資料

瀏覽器的工作原理:新式網(wǎng)絡(luò)瀏覽器幕后揭秘:https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#Event_loop
什么是 Event Loop粹庞?阮一峰
http://www.ruanyifeng.com/blog/2013/10/event_loop.html
MDN:
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洽损,隨后出現(xiàn)的幾起案子庞溜,更是在濱河造成了極大的恐慌,老刑警劉巖碑定,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流码,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡延刘,警方通過(guò)查閱死者的電腦和手機(jī)旅掂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)访娶,“玉大人商虐,你說(shuō)我怎么就攤上這事⊙掳蹋” “怎么了秘车?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劫哼。 經(jīng)常有香客問(wèn)我叮趴,道長(zhǎng),這世上最難降的妖魔是什么权烧? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任眯亦,我火速辦了婚禮伤溉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妻率。我一直安慰自己乱顾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布宫静。 她就那樣靜靜地躺著走净,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孤里。 梳的紋絲不亂的頭發(fā)上伏伯,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音捌袜,去河邊找鬼说搅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虏等,可吹牛的內(nèi)容都是我干的蜓堕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼博其,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼套才!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起慕淡,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤背伴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后峰髓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傻寂,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年携兵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疾掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徐紧,死狀恐怖静檬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情并级,我是刑警寧澤拂檩,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嘲碧,受9級(jí)特大地震影響稻励,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愈涩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一望抽、第九天 我趴在偏房一處隱蔽的房頂上張望加矛。 院中可真熱鬧,春花似錦煤篙、人聲如沸斟览。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狸棍,卻和暖如春身害,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背草戈。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工塌鸯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唐片。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓丙猬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親费韭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茧球,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Q:從輸入網(wǎng)址到頁(yè)面呈現(xiàn),發(fā)生了什么星持? 參考鏈接:從輸入U(xiǎn)RL到頁(yè)面呈現(xiàn)發(fā)生了什么抢埋? 由此梳理自己的前端知識(shí)體系...
    喵喵喵不吃小魚干閱讀 855評(píng)論 0 1
  • 1、輸入地址 在瀏覽器中輸入網(wǎng)址的時(shí)督暂,瀏覽器其實(shí)就已經(jīng)在智能的匹配可能的 url 了揪垄,他會(huì)從歷史記錄、書簽等地方逻翁,...
    杰哥長(zhǎng)得帥閱讀 911評(píng)論 0 0
  • 1 瀏覽器的工作原理 1.1 多進(jìn)程的瀏覽器(原地址) 1.1.1 進(jìn)程和線程的區(qū)別 ?① 進(jìn)程是CPU資源分配的...
    RingoD閱讀 545評(píng)論 0 1
  • 簡(jiǎn)介 編碼問(wèn)題一直是個(gè)痛點(diǎn)饥努,尤其是當(dāng)我們對(duì)XSS攻擊原理不是很熟悉的話,防護(hù)起來(lái)很容易造成遺漏八回。要想很好的防護(hù)住X...
    ShadowHorse閱讀 6,181評(píng)論 0 5
  • 從url到頁(yè)面發(fā)生了什么?對(duì)這個(gè)經(jīng)典問(wèn)題酷愧,在搜索引擎中能找到無(wú)數(shù)個(gè)答案這篇文章也是我對(duì)這個(gè)問(wèn)題的一個(gè)階段性總結(jié)寫博...
    cccccchenyuhao閱讀 281評(píng)論 0 1