- 浏览: 2044433 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
Chrome的进程间通信(五)
1. NPAPI
为了紧密的与各个开源浏览器团结起来,共同抗击IE的垄断,Chrome的插件,也遵循了NPAPI(Netscape Plugin Application Programming Interface)标准,支持这个标准的浏览器需要实现一组规定的API供插件调用,这组API形如NPN_XXX,比如NPN_GetURL,插件可以利用这些API进行二次开发。而NPAPI插件以一个Dll之类的作为物理载体(windows下dll,linux下是so...)进行提供,里面同样也实现了一组规定的API。形式包括NP_XXX和NPP_XXX,NP_XXX是系统需要默认调用的方法,用于认知这个插件,比如NP_Initialize, 而NPP_XXX是用于插件完成一些实际功能,比如NPP_New。。。
所有的插件dll都需要放置在指定目录下(根据操作系统的不同而不同...),每个插件可以处理一种或多种MIME格式的数据,比如application/pdf,说明该插件可以处理pdf相关的文档。在Chrome中键入about:plugins,可以查看当前Chrome中具有的插件信息。。。
NPAPI是一个很经典的插件方案,用dll进行注入,用协定的API进行通信,用字符串描述插件能力。插件宿主(在这里就是浏览器...),会根据能力描述,动态加载插件,并负责插件调用的流程和生命周期管理。而插件中,负责真实逻辑的处理,并可以构造UI与用户交流。以此类方式实现的插件系统,往往是处理的逻辑比较固定适用范围一般(用API写死了逻辑...),但可扩展性不错(用字符串描述能力,可无限扩展...)。。。
在Chrome中nphostapi.h中,定义了所有NPAPI相关的函数指针和结构,这个文件放置在glue目录下,如果看过前面碰过的文章就知道,在WebKit内肯定也有一套相同的东西;在npapi.h/.cc中,提供了Chrome浏览器端的NPN_XXX系列函数的实现;每一个插件物理实例,用PluginLib类来表示,而每一个插件的逻辑实例,用PluginInstance类来表示。这个概念牵强附会的可以用windows中的句柄来类比,当你想操作一个内核对象,你需要获得一个内核对象的句柄,每个进程中的句柄肯定不相同,但后面的内核对象却是同一个,内核对象的生命周期通过句柄的计数来控制,有人用则或,无人用则死(当然这个类比相当的牵强,主要是想说明引用计数和逻辑与物理的关系,但一个关键性的区别在于,PluginLib与PluginInstance都是在一个进程内的,不能跨越进程边界...)。在Chrome中,PluginLib负责加载和销毁一个dll,拿到所有导出函数的函数指针,PluginInstance对这些东西进行了封装,可以更好的来调用。。。
2. Chrome的多进程插件模型
Chrome的插件模型,与早先的浏览器的最大不同,是它采用了多进程的方式,每一个插件,都有一个单独的进程来承载(Shift + Esc打开Chrome进程管理器,可以看到现在已经加载的插件进程...)。当WebKit进行页面渲染的时候,发现了未知的MIME类型数据,它会告知给Browser进程,召唤它提供一个插件来解析。如果该插件还未加载,Browser会在指定目录中搜寻出具有此实力的插件(如果没有此类人才只能作罢...),并为它创建一个进程,让它负责所有的该插件相关的任务,然后建立起一个IPC通路,与它“保持通话”。这套流程一定不会太陌生,因为它与Render进程的创建大同小异换汤不换药。。。
Plugin进程与Render进程最大的区别在于,Render需要与Browser进程大量通信,因为它的HWND归Browser老大掌管着,相关所有内容都需要通信完成。但Plugin不需要与Browser频繁联系,它大部分的通信都是与Render进程发生的。如果Plugin与Render之间的通信,还需要走Browser中转一下,这就显得有些脱裤子放屁了,虽然Browser是大头,但不是冤大头,它不会干这种吃力不讨好的事情。他只是做了一回Render与Plugin间的媒婆而已。当Plugin与Browser建立好了IPC通路后,它会让Render建立一个新IPC通路,用以与Plugin通信,IPC的有名管道名,经由Browser通知给Plugin。完成名字协商后,Render与Plugin的通信关系就建立好了,它们之间就可以直接进行通信了。。。
整个通信模式,可以看这里。这是一个很标准的代理模式的应用,稍有了解的都可以跳过我后面会做的一段罗嗦的描述,一看官方文档中的图便能知晓。在Render进程端,WebPluginImpl是WebPlugin的一个子类,WebPlugin是供Webkit进行调用的一个接口,利用依赖倒置,实现了扩展。在Plugin进程端,实现了一个WebPluginDelegateImpl类,该类会调用PluginInstance的相关接口实现真实的插件功能。这样的话,只需要WebPluginImpl调用WebPluginDelegateImpl中的相应方法,就可以实现功能。但问题是WebPluginImpl与WebPluginDelegateImpl天各一方各处于一个进程,很显然,这里需要一个代理模式。这里沿用了COM的架构,Delegate + Stub + Proxy。WebPluginImpl调用代理WebPluginDelegateProxy,该代理会将调用转换成消息,通过IPC发送给Plugin进程,在Plugin端,通过WebPluginDelegateStub监听消息,并转换成对真实WebPluginDelegateImpl的调用,从而完成了跨进程的一个调用,反之亦然。。。
3. Chrome的可扩展性
总所周知,firefox通过三种方式进行自定义,插件、扩展和皮肤。其中,插件是使得浏览器能用,不会出现一大块一大块的无法显示的区域;扩展是使得浏览器好用,可以简单方便的进行功能的定制和个性化配置;皮肤是帮助浏览器变得好看,毕竟罗卜白菜,给有所爱。。。
与之对比,来看Chrome。Chrome有了插件,有了皮肤,但是没有扩展。这就意味着,你很难为Chrome定制一些特色的功能。目前,所有对Chrome的功能扩展,都是通过书签抑或是修改内核来实现的。前者能力太弱,后者开发起来太麻烦,容易出错不提,还必须要与时俱进,跟上版本的变化,并且还不能自由的选择或关闭。因此,这都不是长远之计,Chrome提供一套类似于firefox的扩展机制,也许才是正道。据传说,Chrome团队正在琢磨这件事,不知道最终会出来个怎么样的结果,是尽力接近firefox降低移植成本,还是另立门户特立独行,我想可以拭目以待一把。。。
在多进程模式下,Chrome的插件还有一个问题,前面提到过,就是关于UI控件的。由于NPAPI的标准,是允许插件创建HWND窗口的,这就使得当Plugin繁忙,且Browser进程发起HWND的同步的时候,主进程被挂起,这个浏览器停滞。在Render进程中,解决这个问题的思路是控制权限,不然Render创建HWND,到了Plugin中,这招不能使用,只能够使用另一招,就是监管。不停的检查Plugin是否太繁忙,无法响应,一旦发现,立即杀死该Plugin及其所处的页面。这就好比你想解决奶中有三氯氰胺的问题,要么控制奶源,不从奶站购买全部用自家的,要么加强监管,提高检查力度防止隐患。两种策略的优缺点一眼便知,依照不同环境采取不同策略即可。。。
总体说来,Chrome的可扩展性着实一般,不过Chrome还处于Beta中,我们可以继续期待。。。
发表评论
-
内存卡读不出来怎么办
2015-05-21 17:04 1399内存卡在生活中使用广泛,应用于手机作为扩展内存很普遍 ... -
对UTF8编码的初步认识
2011-06-07 15:10 1726在网络中有很多地方都有采用UTF8编码,由于要编写与邮件服务端 ... -
怎样煮小米粥?
2011-03-22 08:14 1828小米粥是健康食品,可单独煮熬,亦可添加大枣、红豆、红薯 ... -
如何清除svn保存的username用户名和paasword密码(windows和linux)
2010-12-23 15:33 2463windows下 方法1:对于TortoiseSVN软件 ... -
svn命令
2010-12-23 13:48 4764The Subversion Command-Line Cl ... -
Google Chrome 的内核引擎 WebKit 介绍
2010-06-28 10:22 2801Google Chrome 的内核引擎 WebKit ... -
I love you
2010-06-25 22:23 925让电脑替你说"I IOVE YOU":新建一个记事本,在里面输 ... -
for test zip file
2010-04-28 11:09 965for test zip file load -
FastCGI中文参考手册
2010-04-09 11:14 1159FastCGI中文参考手册 主题 FastCGI中文参考 ... -
详细设计说明书
2010-03-30 10:13 1275详细设计说明书 http://www.chinauni ... -
概要设计文档编写规范
2010-03-22 11:16 3368概要设计文档编写规 ... -
概要设计说明书
2010-03-22 11:13 2573概要设计说明书 一. 引言 1. ... -
Chrome的进程间通信(四)
2010-03-15 14:41 2066Chrome的进程间通信(四) 1. Chrome的窗口 ... -
Chrome的进程间通信(三)
2010-03-15 14:39 2221Chrome的进程间通信(三) 1. 基本的进程结构 ... -
Chrome的进程间通信(二)
2010-03-15 14:36 2008Chrome的进程间通信(二) 1. Chrome进程通 ... -
Chrome的多线程模型 (一)
2010-03-15 14:29 2816Chrome的多线程模型(一) ... -
Chrome源码剖析 序
2010-03-15 14:27 1894Chrome源码剖析 序 开源是口好东西,它让这个充斥 ... -
编码人员的误区
2009-09-10 16:22 974编码人员的误区 误区一:因为任务紧迫,所以没有时 ... -
软件军军规
2009-09-09 11:37 1046编码人员的误区 误区一:因为任务紧迫,所以没有时间想 有些人认 ... -
简单UDP服务器端和客户端(源代码)
2009-09-02 14:28 6808//客户端 #include <iostream ...
相关推荐
在这个“CEF:进程间通信 Demo(VS2013)”中,我们将探讨如何在Visual Studio 2013环境下利用CEF实现跨进程通信。 首先,让我们了解什么是进程间通信(IPC,Inter-Process Communication)。在多线程或多进程的...
通过对 Chrome 源码的剖析,我们可以了解到 Chrome 浏览器的架构设计、多进程模型、进程间通信机制、插件模型、UI 控件系统等方面的技术实现。 首先, Chrome 浏览器是一个开源的项目,它的源码开放式地呈现给了...
为了实现进程间的通信,可能需要用到命名管道、内存映射文件或者.NET的Remoting技术。 此外,为了模拟Chrome浏览器的功能,还需要实现以下关键技术点: 1. **渲染引擎**:负责解析HTML、CSS和JavaScript,生成渲染...
### 剥析Chrome源码:深入理解Chrome的进程间通信机制 #### 一、引言 在现代浏览器设计中,Chrome以其独特的架构和技术脱颖而出,成为业界标杆。Chrome的源码不仅庞大而且复杂,其中涉及的技术细节对于软件开发...
#### 二、Chrome的进程间通信(IPC) ##### 1. IPC的重要性 在Chrome中,各个进程之间需要相互通信才能完成一系列的任务,如页面加载、数据交换等。因此,建立一个高效且安全的进程间通信机制至关重要。Google为此...
- **IPC简介**:进程间通信(Inter-Process Communication, IPC)是多进程架构中的关键组件。Chrome采用了一种高效、安全的IPC机制,允许主进程与渲染进程之间进行数据交换。 - **消息传递机制**:Chrome中的IPC主要...
这种设计也带来了进程间通信(IPC)的挑战。Chrome 使用 IPC 实现进程间的协作,如数据传输和命令控制。同时,多进程架构增加了内存开销,但可以通过智能的进程管理和资源调度来优化性能。 2. **扩展能力和插件模型...
在源码中,你可以找到关于进程间通信(IPC)和沙盒环境的实现。 5. **网络堆栈**:Chrome的网络堆栈负责处理HTTP/HTTPS请求和响应,缓存机制,以及数据传输优化。这部分源码涉及到Quic协议(Google的快速UDP互联网...
学习源码可以了解如何实现进程间通信(IPC)和渲染进程与主进程之间的协作。 2. **Blink渲染引擎**:Blink负责解析HTML、CSS,布局页面并绘制到屏幕上。深入Blink源码有助于理解网页渲染流程,包括解析规则、布局...
源代码展示了如何有效地在不同进程间通信,如使用IPC(Inter-Process Communication)机制。 JavaScript引擎V8也是Chrome源代码中的重要部分,它负责解释和编译JavaScript代码,提供了高效的执行环境。V8的源码可以...
此外,还有各种库和框架,如WebKit(以前的渲染引擎)、 Mojo(进程间通信机制)和PPAPI(插件接口)等。 为了运行和测试你的修改,你可能需要设置一个本地开发服务器,安装必要的测试框架,并学习如何使用Chrome的...
- **切换**:用户在多个标签间切换,源码中应有处理这种事件的逻辑,切换时会激活相应的渲染进程。 - **拖放**:Chrome允许用户通过拖放来重新排列标签,这需要处理鼠标事件和UI更新。 - **多标签策略**:Chrome...
3. **Chromedriver**: Chromedriver是Chrome浏览器的驱动程序,它实现了WebDriver协议,使Selenium能与Chrome通信。为了运行多个浏览器实例,我们需要多个独立的Chromedriver实例。 4. **PhantomJS**: PhantomJS是...
同时,通过进程间通信(IPC)机制,它们协同工作,提供高效的网络请求、页面渲染和JavaScript执行。 对于开发者而言,理解Chrome的多进程架构有助于优化Web应用性能,排查问题,以及实现更安全的编程实践。例如,...
4. APIs:Chrome App提供了许多原生API,如Chrome Storage API用于持久化数据存储,Chrome Messaging API用于应用间的通信,以及System API获取设备信息等。这些API让Chrome App能更好地利用硬件资源和系统功能。 5...
#### 进程间通信 - **通信方式**: - 使用 named pipes/socket pair 作为 IPC (Inter-Process Communication) 通信通道。 - 主要采用异步通信方式,但也会在必要时使用少量的同步通信。 - 一些数据通过 Shared ...
11. **ipc**:进程间通信的基础库,Chrome的多进程架构依赖于它来实现高效的数据传输和跨进程通信。 12. **media**:包含多媒体处理代码,如音频和视频解码,确保Chrome能良好支持多媒体内容。 13. **native_...