浏览器的主要组成部分包括:用户界面——包括地址栏、前进/后退按钮、书签菜单等。用户请求的页面,显示的所有其他部分都属于用户界面。用户界面后端-用于绘制组合框和窗口等基本小部件。它公开了一个与Web应用程序无关的通用接口,但在底层使用了操作系统的用户界面方法。浏览器引擎-在用户界面和呈现引擎之间传递指令。渲染引擎——负责显示请求的内容。如果请求的内容是HTML,则解析HTML和CSS内容,并将解析后的内容显示在窗口上。网络-用于网络呼叫。比如http请求。其接口与Web应用无关,提供所有Web应用的底层实现。JavaScript解释器。用于解析和执行JavaScript代码,比如chrome的javascript解释器就是V8。数据存储。这是持久层。浏览器需要在硬盘上保存各种数据,比如cookies。新的HTML5规范定义了“WebDatabase”,它是一个完整的、轻量级的浏览器内数据库。值得注意的是,与大多数浏览器不同,chrome浏览器为每个标签页分配了自己的渲染引擎实例,每个标签页都是一个独立的进程(即每个标签页都在一个独立的“沙盒”中,同时改进安全,一个标签页崩溃不会导致其他标签关??闭)浏览器进程和线程进程是cpu资源分配的最小单位(它们可以拥有资源并独立运行的最小单位)线程是cpu调度的最小单位(线程是基于进程的程序运行单元,一个进程可以有多个线程)浏览器是多进程的,有一个master进程,每个tab页面都会开启一个新的进程(在某些情况下,多个选项卡会合并进程),浏览器进程如下:浏览器进程:浏览器主进程(负责协调和总控),只有一个第三方插件进程:每类in对应一个进程,只有使用插件时,才会创建一个GPU进程:最多一个,用于3D渲染。浏览器渲染进程(内核):默认每个tab页一个进程,相互独立,控制页面渲染,脚本执行,事件处理等(有时会优化,比如多个空白tab会合成一个进程)每个tab页可以算是一个浏览器内核进程,然后这个进程是多线程的,它有几类Thread:GUI线程注意:GUI渲染线程和js引擎线程是互斥的。当js引擎执行时,GUI线程会被挂起(相当于被冻结),GUI更新会保存在一个队列中,直到Js引擎空闲。立即执行JS引擎线程js引擎一直在任务队列中等待任务的到来,然后进行处理。任何时候一个标签页都只有一个js线程在运行。js程序事件触发定时器线程setInterval和setTimeout所在的线程。浏览器定时器计数器不被js引擎统计,(因为js引擎是单线程的,如果处于阻塞线程状态,会影响计时精度)所以,它是单线程定时触发的(计时完成后,添加到事件队列中,等待js引擎空闲)注意W3C在HTML标准中规定,setTimeout中低于4ms的时间间隔按4ms计算。网络请求线程XMLHttpRequest连接后,通过浏览器打开一个新的线程请求。当检测到状态改变时,如果设置了回调函数,异步线程会产生一个状态改变事件,然后将这个回调放入事件队列中。然后由JavaScript引擎执行。需要为每个网络请求创建一个单独的线程。例如,如果URL解析为http协议,则会创建一个新的网络线程来处理资源下载。因此,浏览器会根据解析出的协议开启一个网络线程,去进行请求资源进程之间的通信。五种通信方式总结:管道:速度慢,容量有限,只有父子进程可以通信FIFO:任何进程都可以通信,但是速度慢消息队列:容量受系统限制,需要注意第一次读取时,要考虑上次没有读取数据的问题。容量容易控制,速度快,但一定要保持同步。比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程类型的线程安全。当然,共享内存区也可以作为线程间的通信,但是没有这个必要,线程已经在统一进程中共享了一块内存。由于浏览器的每个标签页都是一个进程,所以页面之间的通信就是进程的通信。可选)子窗口句柄。声明新窗口的名称。如果名称已经存在,它将在指定的窗口中打开。只有同源或脚本打开的窗口,才可以指定窗口名称。Features(可选)声明要在新窗口中显示的标准浏览器功能(必须打开一个空白窗口)。Replace(optional)如果为true,将替换浏览历史中的当前条目(不能返回),如果默认为false,将创建一个新条目。渲染引擎渲染引擎也叫浏览器内核,主要是将请求的内容显示在浏览器窗口中,是每一个浏览器的核心部分。常见的浏览器渲染引擎有两种:一种是firefox使用的Gecko,它是Mozilla“自制”的渲染引擎。另外一个就是safari和chrome都使用了webkit。渲染过程:渲染引擎??最初会从网络层获取请求文档的内容,通常以8k块为单位。获取到文档内容后,渲染引擎就开始正式工作了。转化为dom节点树,同时会解析外部css文件和style标签中的样式数据。这些样式信息连同HTML中的可见内容,被用来构建另一棵树——渲染树(RenderTree)。渲染树由具有视觉属性(如颜色、大小等)的矩形组成,这些矩形将以正确的顺序出现在屏幕上。渲染树构建完成后,将进入“布局”处理阶段,即为每个节点分配一个屏幕坐标。接下来就是绘制,也就是遍历renderTree,使用UI后端层绘制每个节点。注意:此过程是逐步完成的。为了更好的用户体验,渲染引擎会尽早将内容呈现在屏幕上,而不会等到所有的Html都解析完才构建和布局renderTree。当它解析了一部分内容的时候,就显示了一部分内容,同时,它可能还在通过网络下载剩下的内容。
