浏览器工作原理

  • 为什么js是单线程,web works是多线程?
  • 为什么js单线程却拥有异步?
  • event loop?
  • 为什么setTimeout时间时间不准确

浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源。这里所说的资源一般是指 HTML 文档,也可以是 PDF、图片或其他的类型。资源的位置由用户使用 URI(统一资源标示符)指定。

浏览器的高层结构

用户界面:地址栏,浏览器页面前进后退,刷新和停止刷新按钮,书签...
浏览器引擎:用户界面与呈现引擎之间传送指令
呈现引擎:显示请求内容,解析html&css
网络:网络调用。
用户界面后端:用户绘制基本的小窗口部件
JS解释器:用于解析和执行js代码
数据存储:浏览器在硬盘上保存的各种数据。

浏览器是多进程的

浏览器设置中可以找到浏览器的任务管理


任务管理器.png

可以看每个页面都是独立的进程,


任务管理器1.png

进程分一下几种:
  • 主进程:主进程,只有一个
  • 浏览器渲染进程:进程之间互不影响
  • 第三方插件进程:使用时创建进程
  • GPU进程:用于3D绘制

浏览器输入网页之后发生了什么?

呈现引擎示意图(webkit举例)


webkit.png
  • 呈现引擎解析html文档,讲标记转化成‘树’,同时解析外包css文件。

  • 创建呈现树,包含视觉属性(颜色和尺寸),排列顺序就是屏幕展示顺序

  • 呈现树中每个节点应该出现在屏幕的确切坐标

  • 为了更好的用户体验,引擎会力求尽快将内容展示在屏幕上。

  • 解析器遇到<script>标记时会立即解析脚本,直到资源加载完成,也可以通过添加’defer‘,这样不会停止文档解析。

  • 网络操作与以上同时进行。

  • js解析,由单独的脚本引擎解析执行,通常状态是动态的改变dom树,如果js是多线程,当两个线程同时修改同一个dom节点,下达两个矛盾的命令时,浏览器的执行就成了问题
    以上解决了为什么js是单线程,web works是多线程?

为什么js单线程却拥有异步?
单线程是指cpu一次只能做一件事,js在任务队列中提取任务放到主任务中执行,浏览器为异步任务单独开辟线程。就不得不说到Event Loop。

Event Loop

JS是单线程的,当遇到大量任务或耗时任务时会卡死,线程大部分事件都在空等I/O的返回结果。这种方式称之为’同步‘。
Event Loop解决了此类问题,在程序中设置两个线程,一个主线程,负责程序本身的运行,一个另一个负责与其他线程之间的通信。
首先要了解常用宏任务,微任务
宏任务:

  • setTimeout
  • setInterval
    微任务
  • Promise
  • nextTick(node)
    Event Loop流程:
  • 执行全局同步代码,调用栈清空
  • 取出微任务队列首位任务,放入调用栈中。直到全部微任务执行完成。
  • 取出宏任务队列首位任务,放入调用栈中执行,其中产生的微任务放入微任务队列,宏任务同理。
  • 重复二三步操作,直到全部执行完成。
setTimeout(()=>{
    console.log('time1');
    Promise.resolve().then(()=>{
        console.log('p1')
    })
})
setTimeout(()=>{
    console.log('time2');
    Promise.resolve().then(()=>{
        console.log('p2')
    })
})

如图

event loop 网图

setTimeout时间时间不准确 :很多原因都会导致setTimeout 没有按时执行,原因之一异步执行setTimeout,将setTimeout放入宏任务栈队列,等执行到宏任务队列时,代码移出本轮事件循环,等到下一轮事件循环,再检查是否到了指定时间。所以会有一定程度的延迟。

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中没有设置时间,但还是延迟执行了一段时间。

在浏览器中,setTimeout()/setInterval() 的每调用一次定时器的最小间隔是4ms(摘自MDN),也会导致setTimeout没有按时执行

例如:

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);

如果每个间隔是4ms,输出应该是20,实际输出是16 17 ...,实践证明其实间隔不一定是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)

以上代码你觉得会输出什么?
实际输出 1 0 2 3 4,不同浏览器输出结果不同,每次输出结果也有可能不同。
是因为,setTimeout在宏任务队列中,主线程按顺序执行宏任务队列,发现没有可以执行的宏任务,遍历队伍有没有可以执行的任务,4ms时间还没到,每次挂起一个settimeout的时候都会循环一遍事件队列。1比0先执行是因为1先被挂起。

参考资料

浏览器的工作原理:新式网络浏览器幕后揭秘: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容