首页 > 代码库 > 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的启动