6.2.2 独一无二的ProcessState

我们在main函数的开始处便碰见了ProcessState。由于每个进程只有一个ProcessState,所以它是独一无二的。它的调用方式如下面的代码所示:


[—>Main_MediaServer.cpp]

//①获得一个ProcessState实例。

sp<ProcessState>proc(ProcessState:self());


下面来进一步分析这个独一无二的ProcessState。

1.单例的ProcessState

ProcessState的代码如下所示:


[—>ProcessState.cpp]

sp<ProcessState>ProcessState:self()

{

//gProcess是在Static.cpp中定义的一个全局变量。

//程序刚开始执行,gProcess一定为空。

if(gProcess!=NULL)return gProcess;

AutoMutex_l(gProcessMutex);

//创建一个ProcessState对象,并赋值给gProcess。

if(gProcess==NULL)gProcess=new ProcessState;

return gProcess;

}


self函数采用了单例模式,根据这个以及Process State的名字这很明确地告诉了我们一个信息:每个进程只有一个ProcessState对象。这一点,从它的命名中也可看出些端倪。

2.ProcessState的构造

再来看ProcessState的构造函数。这个函数非常重要,它悄悄地打开了Binder设备。代码如下所示:


[—>ProcessState.cpp]

ProcessState:ProcessState()

//Android中有很多代码都是这么写的,稍不留神就容易忽略这里调用了一个很重要的函数。

:mDriverFD(open_driver())

,mVMStart(MAP_FAILED)//映射内存的起始地址。

,mManagesContexts(false)

,mBinderContextCheckFunc(NULL)

,mBinderContextUserData(NULL)

,mThreadPoolStarted(false)

,mThreadPoolSeq(1)

{

if(mDriverFD>=0){

/*

BIDNER_VM_SIZE定义为(110241024)-(4096*2)=1M-8K

mmap的用法希望读者man一下,不过这个函数真正的实现和驱动有关系,而Binder驱动会分配一块内存来接收数据。

*/

mVMStart=mmap(0,BINDER_VM_SIZE,PROT_READ,MAP_PRIVATE|MAP_NORESERVE,

mDriverFD,0);

}

……

}


3.打开binder设备

open_driver的作用就是打开/dev/binder这个设备,它是Android在内核中为完成进程间通信而专门设置的一个虚拟设备,具体实现如下所示:


[—>ProcessState.cpp]

static int open_driver()

{

int fd=open(“/dev/binder”,O_RDWR);//打开/dev/binder设备。

if(fd>=0){

……

size_t maxThreads=15;

//通过ioctl方式告诉binder驱动,这个fd支持的最大线程数是15个。

result=ioctl(fd,BINDER_SET_MAX_THREADS,&maxThreads);

}

return fd;

……

}


至此,Process:self函数就分析完了。它到底干了什么呢?总结如下:

打开/dev/binder设备,这就相当于与内核的Binder驱动有了交互的通道。

对返回的fd使用mmap,这样Binder驱动就会分配一块内存来接收数据。

由于ProcessState具有唯一性,因此一个进程只打开设备一次。

分析完ProcessState,接下来将要分析第二个关键函数defaultServiceManager。