Chromium进程间的通信机制浅析(android版本)(二)
一、 初始化流程每一个RenderProcessHostImpl(RenderProcessImpl)都会ChannelProxy(SyncChannel)—>ChannelProxy::Context—>Channel—>ChannelImpl—>ChannelReader依次初始化下去。并且将this指针传递给下一个类,这样发送消息时层层
一、 初始化流程
每一个RenderProcessHostImpl(RenderProcessImpl)都会ChannelProxy(SyncChannel)—>ChannelProxy::Context—>Channel—>ChannelImpl—>ChannelReader依次初始化下去。并且将this指针传递给下一个类,这样发送消息时层层向下传递。接收消息时则逆向传递。
网络连接建立过程:
主要对象初始化流程:
过滤器初始化流程:
二、 通信机制
1. 异步消息通信机制
异步消息机制相对来说比较简单,实际产生消息的线程将消息抛给IO线程任务队列后立即返回。IO线程发送消息。对端IO线程接收消息后放入本线程任务队列。最终在本线程执行,或者抛入其他线程的任务队列。
2. 同步消息通信机制
同步消息机制比较复杂,产生消息的线程A将消息抛给IO线程的任务队列后,会阻塞在一个条件变量上,等待IO线程返回同步消息应答将其唤醒。
SyncContext维护了一个线程安全的队列,用于监听来自I/O线程的同步消息应答。当应答来到,并且匹配到某一消息ID,其就会唤醒阻塞的原线程。
在原线程阻塞期间,同样有可能有消息到来,异步消息被放入任务队列并等待解除阻塞之后进行处理。而同步消息必须以可重入的方式进行处理,以避免死锁。
ReceivedSyncMsgQueue类专门用来处理此时收到的同步消息。此类是处理同步消息的关键。当阻塞在Send()时,我们必须立即处理同步消息,以防止其阻塞应答。。。。。。好复杂。。。。晕了。。。。
总的来说,同步消息会使线程阻塞等待应答。此时若收到应答则解除阻塞,若收到异步消息则放入任务队列,收到同步消息则进行某种处理。。。。。。此时为了避免使用复杂的互斥锁和条件变量,就有一个WaitableEvent类作为线程同步工具,来等待处理某事件。。。。更多推荐
所有评论(0)