赞
踩
1. 它是如何利用多进程(其实也会有多线程一起)做并发的,又是如何解决多进程间的一些问题的,比如进程间通信,进程的开销;
2. 做为一个后来者,它的扩展能力如何,如何去权衡对原有插件的兼容,提供怎么样的一个插件模型;
3. 它的整体框架是怎样,有没有很NB的架构思想;
4. 它如何实现跨平台的UI控件系统;
5. 传说中的V8,为啥那么快。
|
图1 Chrome的线程和进程模型 |
Chrome的进程模型
|
闲话并发
在第二种场合下,我们会自然而然的关注数据的分离,从而很好的利用上多CPU的能力;而在第一种场合,我们习惯了单CPU的模式,往往不注重数据与行为的对应关系,导致在多CPU的场景下,性能不升反降。。。 |
|
图2 Chrome的消息循环 |
MessagePumpDefault | MessagePumpForIO | MessagePumpForUI | |
是否需要处理系统消息 | 否 | 是 | 是 |
是否需要处理Task | 是 | 是 | 是 |
是否需要处理Watcher | 否 | 是 | 否 |
是否阻塞在信号量上 | 否 | 是 | 是 |
|
图3 Task的执行模型 |
Command模式 |
|
图4 Chrome的一种异步执行的解决方案 |
设计者的职责 |
管道名字的协商 |
|
图5 Chrome的IPC处理流程图 |
温柔的消息循环 |
|
图6 Chrome的IPC消息格式 |
消息的序列化 |
class SomeMessage
: public IPC::Message{public:enum { ID = ...; }
SomeMessage(SomeType & data): IPC::Message(MSG_ROUTING_CONTROL, ID, ToString(data)){...}
...};
enum SomeChannel_MsgType
{SomeChannelStart = 5 << 12,SomeChannelPreStart = (5 << 12) - 1,Msg1,Msg2,Msg3,...MsgN,SomeChannelEnd};
IPC_BEGIN_MESSAGES(PluginProcess, 3)IPC_MESSAGE_CONTROL2(PluginProcessMsg_CreateChannel,int /* process_id */,HANDLE /* renderer handle */)
IPC_MESSAGE_CONTROL1(PluginProcessMsg_ShutdownResponse,bool /* ok to shutdown */)
IPC_MESSAGE_CONTROL1(PluginProcessMsg_PluginMessage,std::vector<uint8> /* opaque data */)
IPC_MESSAGE_CONTROL0(PluginProcessMsg_BrowserShutdown)
IPC_END_MESSAGES(PluginProcess)
多次展开宏的技巧 |
IPC_BEGIN_MESSAGE_MAP_EX(RenderProcessHost, msg, msg_is_ok)
IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats,OnUpdatedCacheStats)IPC_MESSAGE_UNHANDLED_ERROR()IPC_END_MESSAGE_MAP_EX()
苦力的宏和模板 |
进程的优先级 |
重用 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。