一、进程和线程的区别:
- 一个进程下有多个线程;
- 单一线程的出错可以导致整个进程的崩溃;
- 线程间可以共享进程的数据;
- 进程之间是互相隔离的,单一进程崩溃后被挂起,不会影响其他进程,进程之间的沟通使用IPC通讯机制;
- 进程关闭后,内存会被操作系统回收。
二、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
— 未完 —
参考文献: