WebKit资源加载和网络栈
webkit笔记,主要来自 朱永盛 《WebKit技术内幕》 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买
WebKit资源加载机制
HTML支持的资源主要包括:
HTML: HTML页面,包括各式各样的HTML元素
JavaScript: JavaScript代码,可以内嵌在HTML文件中,也可以单独的文件存在
CSS样式表: CSS样式资源,因为CSS代码除了可以内嵌在HTML文件之外,还可以以单独文件形式存在
图片: 各种编码格式的图片资源,包括 png、jpeg等。当然还有一些特殊的图片资源,例如 SVG 中所需要的图片资源
SVG : 用于绘制 SVG 的2D 矢量图形表示
CSS Shader: 支持 CSS Shader文件, 目前WebKit支持该功能
视频、音频和字幕: 多媒体资源及支持音视频的字幕文件( TextTrack )
字体文件: CSS支持自定义字体, CSS3 引入的自定义字体文件
XSL 样式表: 使用 XSLT语言编写的 XSLT代码文件
上面这些资源在 WebKit中均有不同的类表示它们,它们的公共基类是 CachedResource。
HTML 对应的类型为 MainResource类, 与其对应的资源类型叫 CachedRawResource 类
还有两个与资源密切关联的类:
CachedResourceClient: 监听资源加载状态信息的
CachedResourceLoader: 负责资源加载的策略
WebKit 资源缓存机制
WebKit利用MemoryCache和CachedResourceLoader来实现资源缓存机制,如下图所示
对于相同的URL,使用同一个 CacheResource
当资源占用的内存超过缓存空间的时候,使用 LRU机制释放缓存
资源加载器
Webkit 总共有三种类型的资源加载器
1,针对某种资源类型的特定加载器,仅加载某一种资源。 例如:对于 'image' 这个HTML元素,该元素需要图片资源,对应的特定资源加载器是 ImageLoader 类。对于 CSS 自定义字体,
它的特定资源加载器是 FontLoader类。这些资源加载器没有公共基类,其作用就是当需要请求资源时,由资源加载器负责加载并隐藏
背后的复杂逻辑。加载器属于它的调用者,如下图所示的图片加载器
2,资源缓存机制的资源加载器,特点:所有特定加载器都共享它来查找并插入缓存资源 --- CacheResourceLoader类。特定加载器 先 通过缓冲机制的资源加载器来查找是否有缓存资源
它属于 HTML 的文档对象, 如下图:
3,通用资源加载器 ----- ResourceLoader 类, 是在 WebKit需要从网络或者文件系统获取资源的时候使用该类 ,只负责获得资源的数据,因此被所有特定资源加载器所共享。
它属于 CachedResource 类,但它同 CacheResourceLoader 类没有继承关系,如下图所示:
之所以 WebKit这样设计加载器,主要还是因为 WebKit 想将其中的负载机制 逐渐简化为 若干简单步骤。
加载过程
加载过程如下图所示:
鉴于从网络获取资源时一个非常耗时的过程,通常一些资源的加载是异步执行的,也就是说资源的获取和加载不会阻碍 当前 WebKit的渲染过程,例如图片、CSS文件。当然,网页也存在某些特别的资源会阻碍主线程的渲染过程,例如 JavaScript 代码文件。这会严重影响 WebKit 下载资源的效率,因为后面可能还有许多需要下载的资源,WebKit会怎么做?
因为主线程被阻碍了,后面的解析工作没办法继续往下进行,所以对于 HTML 网页中后面使用的资源也没有办法知道并发送下载请求。
当遇到这种情况的时候,WebKit的做法是这样的:当前的主线程被阻碍时。WebKit会启动另外一个线程去遍历后面的HTML页面,收集需要的资源URL
,然后发送请求,这样就可以避免被阻碍。
与此同时,WebKit 能够并发下载这些资源,甚至并发下载 JavaScript 代码资源。
这种机制对于网页的加载提速很是明显。
WebKit资源加载和网络栈的更多相关文章
- Webkit之资源加载
一.webkit资源分类 webkit中有多种资源,大致分为以下几种: HTML文本 CSS样式文本 - CachedCSSStyleSheet 字体 - CachedFont 图片 - Cached ...
- 理解WebKit和Chromium: Chromium的多进程资源加载机制
转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移 ...
- 聊聊浏览器(webkit)资源加载机制
一些准备 在开始这个话题之前,我们有必要简单回顾一下 浏览器(webkit)的网页渲染过程(如果想要详细了解这个过程,可以戳我几年前写的一篇文章.): 我们知道,浏览器在渲染过程中,如遇到节点需要依赖 ...
- 【原】从一个bug浅谈YUI3组件的资源加载
篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...
- 【Chromium中文文档】多进程资源加载
多进程资源加载(需要更新) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture ...
- Chrome设计文档-多进程资源加载
原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...
- Chromium多进程资源加载
webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 多进程 资源的实际加 ...
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- 再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载
浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询.监听用户事件. 这些线程,根据浏览器自身特点以及web标准等等,有的会被浏览器特意的阻塞.两个很明 ...
随机推荐
- Spring的声明式事务----Annotation注解方式(2)
使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...
- Java的内存--内存溢出vs内存泄露(2)
系统上线后,经常会出现内存不足等错误out of memory,很是头疼,决定要一探究竟 内存溢出 1. 定义及原因 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使 ...
- shiro笔记-"Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - ylw, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should ext
在学习shiro过程中遇到这个错误,在网上找了好久资料也没找到解决办法,大概都是说和传入的值有问题.于是我试着耐心看我自己的报错信息,最终找到了原因并解决.每个人的问题可能都会有差异,所以建议大家耐心 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- 学习RUNOOB.COM进度一
了解MongoDB 由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. 特点 面向文档,操作简单容易 设置任何索引,实现更快排序 本地 ...
- ORA-12705: Cannot access NLS data files or invalid
RedHat7.1 Oracle11gr2 oracle 默认的编码方式如下:SQL> select userenv('language') from dual; USERENV('LANGUA ...
- ssrf小记
SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击 一.危害 1.对内网的端口和服务进行扫描,对主机本地 ...
- Scala学习笔记(二):运行脚本文件
在某个目录(如:F:\)下新建一个文本文件,命名为:hello.scala 其内容为: println("Hello World!") 那么这个时候该怎么运行这个脚本文件呢? 通过 ...
- Java测试工具和框架
个人目前只接触过JUnit以及Powermock,后续会关注更多有关测试这方面的东西 8个超实用的Java测试工具和框架_开发/数据库_IT专家网 http://database.ctocio.com ...
- jmeter设置全局变量的方法
需求: 同一个线程组内有两个http请求A.B,A请求的后置处理器中存储的有值,B请求中添加用户变量Va先要引用该值,然后B请求的前置处理器再引用用户变量va. 第一种方式: 1.A请求后置处理添加如 ...