nuwa :线程分析,nuwa 如何产生,nuwa如何恢复线程?

版权声明:本文为博主打劫来的文章!!!未经允许可以随便转载。 May you do good and not evil. May you share freely, never taking more than you give. https://blog.csdn.net/hunter___/article/details/83105479

https://blog.csdn.net/hunter___/article/details/83016461

https://blog.csdn.net/hunter___/article/details/83022983

b2g 进程主线程b2g thread 经过b2g loader,保存或加载各必备资源,完成后。开始runprocess,即开始运行新的进程,开始fork操作(这里用了socket pair)。b2g 和 nuwa,fork的位置在比较前,所以,nuwa fork后只复制了必备且不影响b2g的部分(fork时子进程获得父进程数据空间、堆和栈的复制,所以变量的地址(当然是虚拟地址)也是一样的。)

也即是先复制了一个同b2g process 一样的进程(此时的b2g 还只是一个b2g单线程的进程),现在还不是nuwa ,暂且叫它preNuwa(前nuwa 进程,成为nuwa之前的进程)。

下面兵分两路:

1.b2g process

b2g 一路一波很猛的操作走下去,创建了各类核心线程。(在那部分创建的哪些线程)

做了一大波操作,XRE_mainStartup,XRE_InitCommandLine,NS_InitXPCOM2等等

NS_InitXPCOM2操作后,开始XRE_MainRun,cmdLine->Run()等各种看不明白的操作,(目前为止还没有b2g进程的其他线程露面,也不知是否在上面的那些操作中已经创建好了这些线程),也不知是否是在commandline这里通过命令行方式一个个启动的???

总之,commandline之后就开始出现b2g 新线程的身影了。如下的imgio ,线程id 666,创建最高层的window窗口,并也开始startupapp,runnuwaprocess.

同时发现,nuwa将其(imageio)标记为支持nuwa的线程.

接着contentparent做了重要的操作,目前也只是在b2g 线程中,b2g 开始请求launch subprocess,即启动子进程,并为其准备,好,下面来了一个新线程,

新线程是 b2g 进程下的Gecko_IOThread 线程,tid为579,以此推断,前面在某处已经启动了这一系列线程,根据tid大小推断。

以上Log表明它(gecko io thread 线程)创建通道,并请求lauchapp,LaunchAppProcLoader(这里的app是nuwa),接下来contentparent会RunNuwaProcess call -- nuwaProcess->Init();sendload,初始化nuwa进程,同时prenuwa 的b2g线程收到消息,神奇的操作出现了,要变身nuwa了

以上可看到,ipdl的sendload 和 recvload 开始配合,跨进程通信。往下继续prenuwa操作

b2g这些线程是怎么个启动起来的,怎么突然突然就一个冒出来。

2.nuwa process

prenuwa process 调ProcLoaderServiceRun初始化好IPC通道(chenel)的child端,messageloop,在此安静等待b2g "load nuwa"的命令。

ProcLoaderServiceRun     loaderChild->Open(transport, aPeerPid:180, iothread->message_loop())

话说prenuwa 收到b2g (sendload)的消息,recvload

以上可知,DoWork call -- int ret = content_process_main(argc:9, argv[]:/system/b2g/plugin-container);调用plugin-container进行XRE_SetProcessType,NuwaAddFinalConstructor(&InitializeBinder, nullptr)等

初始化子进程(nuwa 进程),初始化命令行,等

接着ContentProcess.cpp:122,Fun:Init call -- mContent.Init(IOThreadChild::message_loop(), ParentPid(), IOThreadChild::channel()); 初始化,同时新的线程出现了,nuwa又进行支持nuwa的标记。

这里有个操作,prenuwa 的b2g线程和b2g 进程的gecko iothread 线程的操作,貌似contentchild init,请求与b2g建立连接通道,接着GeckoChildProcessHost.cpp:1106,Fun:OnChannelConnected call -- OpenPrivilegedHandle(peer_pid: 514 );连接上了。同时发现一些新的b2g线程又露面了。还知ProcLoaderClientDeinit 将进程加载器客户端释放了。

prenuwa 要改名了,contentchild 改名InitProcessAttributes call -- SetProcessName(NS_LITERAL_STRING('(Nuwa)'), false); 设置进程名字为nuwa,nuwa还没真正成熟。

 

下面是对nuwa 进程进行一些设置,开始调NS_InitXPCOM2进行一些线程的设置或初始化。(创建主线程),创建组件管理器等Create the Component/Service Manage,(!JS_Init()),call JS_Init()等,nsComponentManager.cpp:472,Fun:Init call -- cl->location.Init(greOmnijar, 'chrome.manifest');RereadChromeManifests。自动注册所有被列举的组件,

After autoreg, but before we actually instantiate any components, // add any services listed in the 'xpcom-directory-providers' category // to the directory service.  --->

js helper,closing service,socket thread 等线程出现,并被标记为支持nuwa.以便被后面孵化preallocated process 用。

接着发现b2g的ipdl backgroud 线程出现

contentchild 又发消息,被content parent 收到(当然是ipdl那套了)

nuwa的主线程承担了较多工作,这里是在干嘛?初始化nuwa,并标记哪些是nuwa支持线程,创建preallocated process?同时对各线程进行标记?

Nuwa进程又出现几个新线程,并将其标记为支持Nuwa进程,

b2g 进程出现network worker,DOM worker等线程,而且b2g线程的message loop 始终在后台运行,nuwa的timer线程出现了,并被标记为支持Nuwa。

这才开始是完整的Nuwa,

MakeNuwaProcess call -- // Make current process as a Nuwa process.  --

nuwa 进程执行 NuwaChild.cpp:268,Fun:OnNuwaProcessReady,这将告诉b2g ,我Nuwa已经成功创建了,Nuwa准备好 了。nuwa此时才完整。

 contentparent 和contentchild ,nuwa child 和nuwaparent

下面就是开始fork新进程,preallocated proc

PreallocatedProcessManager.cpp:420,Fun:OnNuwaReady call -- NuwaFork(); --->

Nuwa.cpp:1928,Fun:NuwaSpawn call -- * Spawn a new process. If not ready for spawn (still waiting for some threads * to freeze), postpone the spawn request until ready.  * * @return the pid of the new process, or 0 if not ready.  --->


nuwaspawn才是真正孵化进程的地方,这是为app 进程准备的进程

NuwaSpawnPrepare call -- * Prepare for spawning a new process. Called on the IPC thread.

:NuwaSpawn call -- pid = ForkIPCProcess(); --->在nuwa主线程上进行fork

新进程preallocated process被创建出来之后:

对其进行相关属性设置,它现在与nuwa主线程一模一样?设置各种id ,替换及重新创建线程,替换ipc 等,

Nuwa.cpp:1608,Fun:RecreateThreads call -- * Recreate all threads in a process forked from an Nuwa process.  --->

ContentChild.cpp:620,Fun:ResetTransports -重置传输通道

b2g 收到添加新进程(谁发给它),并准备启动,

b2g 的Gecko_IOThread],tid:579,创建通道,打开,,,

GeckoChildProcessHost.cpp:1205,Fun:InitializeChannel call -- CreateChannel(mExistingFileDescriptor); --->

GeckoChildProcessHost.cpp:1192,Fun:PerformAsyncLaunch call --OpenPrivilegedHandle(base::GetProcId(mExistingProcessHandle)); --->

ContentParent.cpp:2554,Fun:ContentParent call -- Open(mSubprocess->GetChannel(), base::GetProcId(mSubprocess->GetChildProcessHandle())); --->

b2g的线程连接通道,并打开,

ContentParent.cpp:2554,Fun:ContentParent call -- Open(mSubprocess->GetChannel(), base::GetProcId(mSubprocess->GetChildProcessHandle())); ,

b2g的Gecko_IOThread],tid:579,,GeckoChildProcessHost.cpp:1106,Fun:OnChannelConnected call -- OpenPrivilegedHandle(peer_pid: 750 ); --->

b2g的各线程进行操作,不知道干了什么.

好,新进程已经被创建了,对此进程进行初始化,

然后设置进程名为preallocated,

从nuwa变成preallocated 

preallocated 接收到appinfo,设置app名字为default home sc

创建app

gecko/widget/gonk/nsAppShell.cpp:1009,Fun:Observe 用于接收app创建的请求,

preallocted 被命名为home sc 后,那么home sc 自己特殊的那些线程是在哪里创建的???

然后b2g 进程不知道为何又开始获得fork新进程的请求,b2g在新进程创建好后收到创建新进程的请求,它将这个消息发送给nuwa.

应该是具体进程被设置进preallocated 之后,会返回值,让b2g开始创新的preallocated proc,代码在哪?

接着就是重复了,

这块app 名字不知哪里来的,突然就设置好了,需要再打Log,

猜你喜欢

转载自blog.csdn.net/hunter___/article/details/83105479