首页 > 代码库 > chromium的RenderProcess的启动
chromium的RenderProcess的启动
RenderProcess与Browser进程中的RenerProcessHost对应,RenderProcess在RenderProcessHostImpl的Init函数中被创建。
Init函数主要进行以下几个工作:
1、建立与RenderProcess进行通信的管道,管道的名称为channel_id。
2、将管道名称channel_id作为子进程启动的参数,调用ChildProcessLauncher启动子进程,子进程可以通过channel_id对应的管道与RenderProcessHost进行通信
3、ChildProcessLauncher经过一系列的调用启动子进程。
- ChildProcessLauncher实例化一个Context对象context_,调用context_的Launch函数。
- Launch函数,Post一个Task到PROCESS_LAUNCHER线程,在该线程中执行Context::LaunchInternal
- LaunchInternal函数,根据是否需要在SandBox中运行子进程,调用LaunchElevatedProcess或者StartSandboxedProcess函数启动子进程
- 启动的子进程是过程和Browser进程的类似,但是这次它带了参数kProcessType,在执行ContentMainRunner::RunNamedProcessTypeMain的时候进入RenderProcess的主函数RendererMain。
Render进程的入口RendererMain在content/render/render_main.cc,它的初始化过程比较简单,主要有以下几个步骤:
1、初始化主消息循环
base::MessageLoop main_message_loop;2、初始化RenderProcessImp。
RenderProcessImpl render_process;3、初始化RenderThreadImpl。
new RenderThreadImpl();4、运行主消息循环
base::MessageLoop::current()->Run();MessageLoop、RenderProcessImpl、RenderThreadImpl它们都是便用单例模式的,通过current()接口就能拿到当前线程中的实例。
其中RenderProcessImpl和RenderThreadImpl的关系图如下:
RenderProcessImpl继承自RenderProcess,而RenderProcess继承于ChildProcess,ChildProcess会包含一个用于处理消息的实例ChildThread,ChildThread继承了Sender和Listener接口,可以用于发收和处理接收到的消息,同时ChildProcess还有一个IO线程,用于IO事件的处理,它其实就是ChildThread中管道channel_所使用的IO线程。
RenderProcess接收到的消息首先会调用ChildThread::OnMessageReceived进行处理
一些控制消息会交给RenderThreadImpl::OnControlMessageReceived函数进行处理,比如新建一个RenderView的消息ViewMsg_New,它会接着调用RenderThreadImpl::OnCreateNewView函数完成RenderView的创建。
chromium的RenderProcess的启动