Webkit系列:第一回(先验内容)
一些关于浏览器的先验内容
2005年苹果开源了自家的safari浏览器内核webkit,2008年,谷歌改造webkit为blink,开发出了chromium,最终推出chrome。
chrome是一个典型的多进程的架构,即chrome这么个应用,是由多个子进程组成的,具体包括如下:
- 浏览器进程: 负责管理除了页面显示的其他区域,也就是及页面地址栏那些东西,当然还包括书签等。
- 渲染进程: 该进程又称为
内核,将请求资源转换为可视化(可听化)的图像结果,就是浏览器内核。渲染进程又有多个重要的子线程组成,GUI线程: 浏览器拿到请求资源后,有一步操作就是,根据html和css文件分别生成dom树和样式树,然后生成渲染树和布局树,这部分的工作,就是gui线程负责实现的。JS线程:又称为js主线程,就是执行js代码的。合成器线程:该线程获得布局树后,通过栅格化确定一帧的每个像素点数据,最终交由GPU进程处理。定时器线程: 如果当js主线程执行代码时,遇到settimeout和setInterval两定时器的时候,主线程会把定时器函数扔给定时器线程处理,自己继续往下执行。定时线程等待设定时间后,将定时器的回调函数交给事件触发线程,由事件触发线程负责将回调函数塞入任务队列。从这个过程能够得到前面疑问的答案。作为一个单线程语言,是怎么实现异步请求的?通过渲染进程的多线程架构实现的。定时器线程并不执行函数,只起到等待延时的作用。事件触发线程: 前面基本介绍了,主要任务就是将函数塞入主线程的任务队列。异步HTTP请求线程:负责处理异步的ajax请求,当请求完成后,他也会通知事件触发线程,然后事件触发线程将这个事件放入事件队列给主线程执行。
经由HTML解释器 、CSS解释器、 布局、 Javascript引擎、 绘图呈现页面。
划重点: js线程和gui线程时互斥的,因为js的操作可能会产生重排和重绘。因此当一方执行时,另一方会挂起。代码层面,就是线程切换。当然有个说法说js线程和gui线程就是同一个东西,暂时还没接触chrome底层,无法给出答案。
3. 网络进程:负责发起接受网络请求。
4. GPU进程:负责整个页面的渲染。
5. 插件进程: 用来管理所有如flash这样的插件,注意,不是浏览器的扩展插件。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
