原文process models 网站更像一个应用而不是文档,所以浏览器要向操作系统一样有更高的安全性和鲁棒性。
进程模型
- 每个网站的一个实例对应一个进程 默认
- 每个网站对应一个进程 --process-per-site
- 每个tab页对应一个进程 --process-per-tab
- 单进程模型 --single-process
- 渲染进程运行在沙箱内
- 每个插件单独一个进程
- 网页跳转不能切换进程(将来会改进)
- 网页的frame在同一进程中(将来会改进)
- 进程数有限制
原文process models 网站更像一个应用而不是文档,所以浏览器要向操作系统一样有更高的安全性和鲁棒性。
原文display a web page in chrome
render process browser process | | +--+--------------+ +---------------------+ | \ / \ render thread main thread I/O(IPC) thread Main browser(UI) thread | | | | webkit | | | | | | | renderWidget::SetCursor | | | | | | | renderView::Send() | | | | | | | RenderThead::Send() | | | | IPC::SyncChannel | | | |-----IPC----| | | | IPC::ChannelProxy | | | | | | | ResourceMessageFilter | | | | | | | | RenderProcessHost::OnMessageReceived | | | | | | | RenderViewHost::OnMessageReceived | | | | | | | RenderViewHost::OnMessageReceived | | | | | | | RenderWidgetHost::OnMsgSetCursor | | | |
render process browser process | | +--+------------------------+ +---------------------+ | \ / \ render thread main thread I/O(IPC) thread Main browser(UI) thread | | | | | | | RenderWidgetHost:ForwardMouseEventToRenderer | | | | | | | WebMouseEvent | | | | | | | RenderWidgetHost::ForwardInputEvent | | | | | | | RenderWidgetHost::Send | | IPC::ChannelProxy | | |----IPC-----| | | IPC::Channel | | RenderView::OnMessageReceived | | | | | | | RenderViewHost::OnMessageReceived | | | | | | | RenderWidgetHost::OnMsgSetCursor | | | | | | |
浏览器绝不可能不崩溃,也没有绝对的安全。 所以,为了像现代操作系统一样具有更强的鲁棒性,chromium采取多进程架构。
+---------------browser--------------+ +----------render------------+ |RenderProcessHost+---RenderViewHost-|-|-RenderView--+-RenderProcess| | \ | | / | | +-RenderViewHost-|-|-RenderView/ | | | +----------------------------+ | | + ----------render-----------+ |RenderProcessHost----RenderViewHost-|-|-RenderView---RenderProcess | +------------------------------------+ +----------------------------+
gclient
gclient config http://src.chromium.org/svn/trunk/src gclient sync --force
set GYP_MSVS_VERSION=2013 set GYP_GENERATORS=msvs-ninja,ninja gclient runhooks --force
debug版,不设置GYP_DEFINES link时会出错
set GYP_DEFINES=component=shared_library ninja -C out\Debug chrome
release版
ninja -C out\Release chrome.exe
Chromium building with nanja or najia+vs2013
chromium源码基于r274914(35.0.1916.153)
scope大法好,lock保平安,new在做,weakptr在看,不信factory留隐患,refcount不对自身灭。
chromium代码都是多个类按照一个模式进行组合,要按功能以模式为单位多个类放在一起理解。
用C++的OO写的代码,不管是好代码和烂代码都一样的不易读。好代码和烂代码唯一的区别就是读完了好代码结构比较清晰,而烂代码还是一样的烂。 继承给调试带来了无尽的痛苦,因为你跟到基类的方法不知道这个到底是基类实例化的对象还是子类实例化的对象。
一入chromium深似海,从此美剧是路人。
+--答案不正确-----+ | \ V \ 提出问题->假设答案-+->静态走读代码印证答案--->调试代码确认答案-+->整理关系 \ | ^ \ 没有思路 | | +->整理时序 \ V / +->查找相关资料------------+
~note.txt +----> ~issuse.txt | +----> archive.md * 每日知识点,心得,问题记录在~note.txt中。 * 整理note内容,知识点和心得的归档为markdown格式的文档,问题归入issuse中, 未整理好的继续保留在note中。 * 使用有道词典管理chromium文档或源码中的词汇,每日复习词汇。
略读 - 总结 | 保存 | 文中引用链接添加至~links.txt中 | 找到作者其他相关的文档添加至~link.txt中
0开头为笔记和总结 1开头的为base模块相关的源码分析