摘要:一瀏覽器的進(jìn)程和線程前端研發(fā)人員不要忘記了瀏覽器是安裝在電腦手機(jī)上的應(yīng)用。附錄中的事件系統(tǒng)環(huán)境中的事件系統(tǒng)多了兩個(gè)和案例四輸出結(jié)果
一、瀏覽器的進(jìn)程和線程
??????前端研發(fā)人員不要忘記了瀏覽器是安裝在PC電腦(手機(jī))上的應(yīng)用。既然是客戶端應(yīng)用,就免不了一個(gè)問題:線程和進(jìn)程。
一個(gè)程序可以有多個(gè)進(jìn)程;
一個(gè)進(jìn)程和多個(gè)線程;
多個(gè)進(jìn)程之間可以相互通信;
多個(gè)線程之間可以相互通信;
不同進(jìn)程之間的線程不能相互通信。
??????好,知道了這些基本的知識(shí),我們來看一下瀏覽器(以谷歌瀏覽器為例)這個(gè)最基本的應(yīng)用程序有哪些進(jìn)程,又有哪些線程。
Chrome的進(jìn)程:大家可以打開任務(wù)管理器看看,有哪些進(jìn)程
??????從圖中可以看到,在chrome中每打開一個(gè)標(biāo)簽頁,每一個(gè)擴(kuò)展程序都是一個(gè)進(jìn)程。
Chrome的線程:對于一個(gè)進(jìn)程來說,又有哪些線程呢?
GUI 渲染線程
JavaScript引擎線程
定時(shí)觸發(fā)器線程
事件觸發(fā)線程
異步http請求線程
??????那么當(dāng)你打開一個(gè)頁面,就啟動(dòng)了一個(gè)進(jìn)程,那么這個(gè)進(jìn)程有上面幾個(gè)線程。這幾個(gè)線程之間相互合作,但是GUI和JavaScript之間是相互獨(dú)立的,而且Javascript是單線程的。原因很簡單,涉及UI操作的不能同時(shí)處理,不然給用戶呈現(xiàn)的頁面會(huì)是什么樣子。
??????既然知道了,瀏覽器作為應(yīng)用程序具備的基本要素。那么我們想看看瀏覽器內(nèi)部具體的工作方式。
了解一個(gè)程序,首先了解程序的模塊劃分和工作流程。
瀏覽器主要?jiǎng)澐诌@幾個(gè)模塊瀏覽器部件:那么這幾個(gè)部件相互耦合,為用戶提供頁面。
1、用戶界面
2、瀏覽器引擎
3、渲染引擎
4、網(wǎng)絡(luò)
5、用戶界面后端
6、Javascript解釋器
7、數(shù)據(jù)持久化存儲(chǔ)
二、瀏覽器頁面渲染的方式(頁面初始化)我們重點(diǎn)來看一下瀏覽器的渲染是怎么操作的三、瀏覽器的事件系統(tǒng)(頁面操作)Macro和Micro
異步并不是不執(zhí)行,而是執(zhí)行放入隊(duì)列。
//案例一: setTimeout(() => { console.log(promise); console.log("settimeout1"); }, 0); let promise = new Promise(function(resolve, reject) { console.log("Promise"); setTimeout(()=>{ resolve("success"); },0); //resolve("success"); }).then((msg)=>{ console.log("resolved."+msg); }); setTimeout(() => { console.log(promise); console.log("settimeout2"); }, 0); console.log(promise); console.log("Hi!"); //輸出結(jié)果 Promise //Promise會(huì)立即執(zhí)行 Promise {} //此時(shí)promise狀態(tài)為pending Hi! //打印hi Promise { } settimeout1 //主線程執(zhí)行完畢,依次將三個(gè)settimeout放入macro隊(duì)列中,打印第一個(gè) Promise { } settimeout2 //打印第二個(gè) resolved.success //promise執(zhí)行成功 //案例二: 如果promise中直接resolve("success"),運(yùn)行結(jié)果是怎么樣? Promise Promise { } Hi! resolved.success Promise { undefined } settimeout1 Promise { undefined } settimeout2 //案例三: 如果在React中的事件系統(tǒng)是什么樣子的呢? class Father extends Component { render() { let promise = new Promise(function(resolve, reject) { resolve("success1"); }).then((msg)=>{ console.log("resolved."+msg); }); return ( ); } componentDidMount(){ console.log("Did Mount"); } componentWillMount(){ let promise = new Promise(function(resolve, reject) { resolve("success2"); }).then((msg)=>{ console.log("resolved."+msg); }); console.log("Will Mount"); } } //輸出結(jié)果 Will Mount Did Mount resolved.success2 resolved.success1 可以看到react并沒有將micro任務(wù)合并到渲染里面
為什么會(huì)提及React,因?yàn)镽eact 的處理方式和我們和瀏覽器的實(shí)現(xiàn)流程比較類似。
React初始化《======》瀏覽器初始加載
React更新 ??《======》瀏覽器的事件系統(tǒng)
所以React從很大程度上做了一層抽象,讓我們面向組件的函數(shù)編程,而不是面向?yàn)g覽器的編程。
node環(huán)境中的事件系統(tǒng)多了兩個(gè) process.nextTick和setImmediate
//案例四: setTimeout(() => { console.log(promise); console.log("settimeout1"); }, 0); let promise = new Promise(function(resolve, reject) { console.log("Promise"); /*setTimeout(()=>{ resolve("success"); },0);*/ resolve("success"); }).then((msg)=>{ console.log("resolved."+msg); }); setTimeout(() => { console.log(promise); console.log("settimeout2"); }, 0); console.log(promise); console.log("Hi!"); process.nextTick(()=>{console.log("nextTick")}); setImmediate(()=>{console.log("Immediate")}) ; //輸出結(jié)果 Promise Promise {} Hi! nextTick resolved.success Promise { undefined } settimeout1 Promise { undefined } settimeout2 Immediate
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96719.html
摘要:瀏覽器是多進(jìn)程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機(jī)制的文章深入前端徹底搞懂瀏覽器運(yùn)行機(jī)制瀏覽器每打開一個(gè)標(biāo)簽頁,就相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立的瀏覽器進(jìn)程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進(jìn)入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運(yùn)行機(jī)制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個(gè)總結(jié),參考文章鏈接見最后。本文博客地址 了解進(jìn)程和線程 進(jìn)程是應(yīng)用...
摘要:瀏覽器是多進(jìn)程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機(jī)制的文章深入前端徹底搞懂瀏覽器運(yùn)行機(jī)制瀏覽器每打開一個(gè)標(biāo)簽頁,就相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立的瀏覽器進(jìn)程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進(jìn)入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運(yùn)行機(jī)制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個(gè)總結(jié),參考文章鏈接見最后。本文博客地址 了解進(jìn)程和線程 進(jìn)程是應(yīng)用...
摘要:腳本執(zhí)行,事件處理等。引擎線程,也稱為內(nèi)核,負(fù)責(zé)處理腳本程序,例如引擎。事件觸發(fā)線程,用來控制事件循環(huán)可以理解為,引擎線程自己都忙不過來,需要瀏覽器另開線程協(xié)助。異步請求線程,也就是發(fā)出請求后,接收響應(yīng)檢測狀態(tài)變更等都是這個(gè)線程管理的。 一、進(jìn)程與線程 現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡單地說,就是操...
摘要:如果看完本文后,還對進(jìn)程線程傻傻分不清,不清楚瀏覽器多進(jìn)程瀏覽器內(nèi)核多線程單線程運(yùn)行機(jī)制的區(qū)別。因此準(zhǔn)備梳理這塊知識(shí)點(diǎn),結(jié)合已有的認(rèn)知,基于網(wǎng)上的大量參考資料,從瀏覽器多進(jìn)程到單線程,將引擎的運(yùn)行機(jī)制系統(tǒng)的梳理一遍。 前言 見解有限,如有描述不當(dāng)之處,請幫忙及時(shí)指出,如有錯(cuò)誤,會(huì)及時(shí)修正。 ----------超長文+多圖預(yù)警,需要花費(fèi)不少時(shí)間。---------- 如果看完本文后,還...
摘要:瀏覽器的渲染進(jìn)程是多線程的。因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置渲染線程與引擎為互斥的關(guān)系,當(dāng)引擎執(zhí)行時(shí)線程會(huì)被掛起,更新則會(huì)被保存在一個(gè)隊(duì)列中等到引擎線程空閑時(shí)立即被執(zhí)行。 本篇文章參考自撒網(wǎng)要見魚大佬的 僅供自己學(xué)習(xí)提升。 https://segmentfault.com/a/11... 區(qū)分線程和進(jìn)程 **- 什么是進(jìn)程** 狹義定義:進(jìn)程是正在運(yùn)行的程序的實(shí)例(a...
閱讀 2741·2023-04-26 02:02
閱讀 2621·2023-04-25 20:38
閱讀 4162·2021-09-26 09:47
閱讀 3150·2021-09-10 10:50
閱讀 3813·2021-09-07 09:58
閱讀 3359·2019-08-30 15:54
閱讀 2721·2019-08-30 15:54
閱讀 1941·2019-08-29 17:03