1.多进程浏览器
chrome是多进程浏览器
chrome浏览器中,【每打开一个tab,就新起了一个进程】
如图所示:
chrome起了5个页面,在任务管理器中,共有1个主进程+5个页面进程
结束任何一个页面进程,对应的页面就会宕掉

同样的方法还可以验证edge浏览器也是多进程浏览器
多进程浏览器的优劣:
- 优势:避免一个页面崩溃而影响其他的页面应用(由于多进程,每个页面都有自己独立的GUI渲染引擎和Javascript渲染引擎,在Javascript引擎运行脚本时,GUI渲染线程处于挂起状态)
- 劣势:多进程的资源占用相对更多一些
2.单线程的JavaScript
JavaScript设计为单线程是使命使然,它就是【设计用来实现用户互动+渲染DOM】
为了避免多个JavaScript线程同时对一个页面元素做修改而产生冲突的情况,我们有两种选择:上锁的多线程或者直接单线程。如果选择多线程,有人调侃说:【一个程序员碰到了一个问题,他决定用多线程来解决。现在两个他问题了有…】显然最后一句是在调侃多线程下并不知道哪个线程先启动,同时线程同步又涉及到锁的设计。为了避免引入锁带来更大的复杂性,Javascript选择了单线程执行
因此,浏览器任何时候都有且只有一个JavaScript线程在运行,并且是【按顺序】执行
如何理解异步JavaScript:
JavaScript本身不可以异步,在单线程JavaScript的机制下,本质上任务只能一个接一个执行。这时,如果某段js代码需要长时间的运行,其他后面的js程序就要耗时等待,造成页面长时间无响应的假死现象。这非常破坏良好的交互性
举个例子,我们去麦当劳点餐,这个麦当劳只有一个员工,模拟单线程的JavaScript。如果需要等待前面的顾客彻底配餐完毕后面的顾客才能开始点餐,就会浪费大量的时间,也会造成“队伍怎么不动啊”“麦当劳效率好低啊”等等一系列的吐槽,产生“麦当劳工作低效”的现象,类似于浏览器的假死
那么,这个员工需要怎么做呢?
配餐是耗时的,而点餐是不耗时的。原则就是,不能让耗时的操作阻塞后面的不耗时操作,也就是不能让配餐阻塞点餐。因此,员工应该先给大家点好餐,将大家的订单按顺序记录下来,保证用户的交互(类似于避免浏览器的假死),然后再按照大家点餐的顺序,慢慢配餐,配好之后再通知取餐(类似回调)
我们看到,这里借助了一个【订单记录】将耗时的操作暂时记录下来,这实际上就是队列的使用。类似地,异步JavaScript的本质就是:JavaScript线程将不耗时事件触发的程序按顺序执行,而将耗时事件(如Ajax)的消息不断地加入到一个【消息队列】中,当JavaScript线程继续向下执行完毕后,再回头处理这个队列的事件响应
如图

网友评论