Toc
  1. EventLoop
Toc
0 results found
bbcfive
前端与进程、线程

一、进程和线程的区别:

  1. 一个进程下有多个线程;
  2. 单一线程的出错可以导致整个进程的崩溃;
  3. 线程间可以共享进程的数据;
  4. 进程之间是互相隔离的,单一进程崩溃后被挂起,不会影响其他进程,进程之间的沟通使用IPC通讯机制;
  5. 进程关闭后,内存会被操作系统回收。

二、Chrome的多进程架构
浏览器存在单进程架构和多进程架构,单进程架构具有不稳定、不流畅和不安全的特点。
Chrome通过多进程架构改善了浏览器性能:Chrome架构官方文档
Chrome的浏览器进程有:

  • 浏览器进程(Browser Process),这个是浏览器的主进程,主要负责包括地址栏、前进后退按钮、处理网络访问、文件访问等。
  • 渲染进程(Renderer Process),控制显示网站的选项卡内的所有内容。例如Chrome的Tab限制了对系统文件的读写能力, 但是多进程的浏览器有一个缺点,就是进程的内存占用相对更多,但是Chrome为了节省内存,会限制被启动的进程数,当进程数到达界限后,会将访问同一个网站的tab都放在一个进程里运行。
  • 插件进程(Plugin Process),控制网站使用的所有插件。
  • GPU(GPU Process),与其他进程隔离处理GPU任务,由于GPU处理来自多个应用程序的请求并将它们绘制在同一表面上,因此将其分为不同的过程。UI进程
  • 网络进程(NetWork Process),负责页面的网络资源加载,之前是放在浏览器进程中的一个线程运行,现在独立出来。http、tcp处理

简单梳理下浏览器各个进程之间的工作和流程 Chrome浏览器地址栏输入一个URL后发生了什么?
三、Js是为什么是单线程的?Js怎么实现异步?
问题一:多线程的js操作同一个DOM,会造成浏览器的执行冲突(比如:一个删除,一个修改)。
问题二:通过事件循环机制(EventLoop)实现异步;

EventLoop

JS是单线程的,主线程拥有一个执行栈和执行队列。主线程自上而下依次执行代码,并判断函数是同步的还是异步的,同步的函数直接在主线程中执行,异步函数塞入执行队列。当主线程的函数执行完毕后,再将异步函数从执行队列中出栈,直到执行完毕。

macrotasks:

  • setTimeout
  • setInterval
  • setImmediate
  • requestAnimationFrame
  • I/O
  • UI rendering

microtasks:

  • process.nextTick
  • Promises
  • Object.observe
  • MutationObserver

macrotasks和microtasks的区别:https://stackoverflow.com/questions/25915634/difference-between-microtask-and-macrotask-within-an-event-loop-context

– 未完 –

  1. Event loop: microtasks and macrotasks

参考文献:

  1. Chrome浏览器为什么是多进程而不是多线程
  2. JS执行机制
  3. 任务队列、事件循环与定时器
本文作者:bbcfive
版权声明:本文首发于bbcfive的博客,转载请注明出处!