Chinaunix首页 | 论坛 | 博客
  • 博客访问: 971048
  • 博文数量: 109
  • 博客积分: 1751
  • 博客等级: 上尉
  • 技术积分: 1817
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-31 22:37
文章分类

全部博文(109)

文章存档

2014年(9)

2013年(21)

2012年(48)

2011年(31)

分类: Android平台

2014-04-08 14:55:08

6.2.2 独一无二的ProcessState

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

[-->Main_MediaServer.cpp]

  1. //①获得一个ProcessState实例。  
  2. sp<ProcessState> proc(ProcessState::self());  
  3. 下面来进一步分析这个独一无二的ProcessState。  
  4. 1. 单例的ProcessState  
  5. ProcessState的代码如下所示:  
  6. [-->ProcessState.cpp]  
  7. sp<ProcessState> ProcessState::self()  
  8. {  
  9.    //gProcess是在Static.cpp中定义的一个全局变量。  
  10.    //程序刚开始执行,gProcess一定为空。  
  11.     if (gProcess != NULL) return gProcess;  
  12.         AutoMutex _l(gProcessMutex);  
  13.      //创建一个ProcessState对象,并赋值给gProcess。  
  14.     if (gProcess == NULL) gProcess = new ProcessState;  
  15.  
  16.      return gProcess;  


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

2. ProcessState的构造

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

[-->ProcessState.cpp]

  1. ProcessState::ProcessState()  
  2.    // Android中有很多代码都是这么写的,稍不留神 就容易忽略这里调用了一个很重要的函数。  
  3.     : mDriverFD(open_driver())  
  4.     , mVMStart(MAP_FAILED)//映射内存的起始地址。  
  5.     , mManagesContexts(false)  
  6.     , mBinderContextCheckFunc(NULL)  
  7.     , mBinderContextUserData(NULL)  
  8.     , mThreadPoolStarted(false)  
  9.     , mThreadPoolSeq(1)  
  10. {  
  11.   if (mDriverFD >= 0) {  
  12.   /*  
  13.    BIDNER_VM_SIZE定义为(1*1024*1024) - (4096 *2) = 1M-8K  
  14.       mmap的用法希望读者man一下,不过这个函数真 正的实现和驱动有关系,而Binder驱动会分配一块  
  15.    内存来接收数据。  
  16. */  
  17.   mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ,  MAP_PRIVATE | MAP_NORESERVE,  
  18.                      mDriverFD, 0);  
  19.     }  
  20.     ......  


3.打开binder设备

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

[-->ProcessState.cpp]

  1. static int open_driver()  
  2. {  
  3.     int fd = open(“/dev/binder”, O_RDWR);//打开/dev/binder设备。  
  4.     if (fd >= 0) {  
  5.     ......  
  6.         size_t maxThreads = 15;  
  7.        //通过ioctl方式告诉binder驱动,这个fd支持的最大线程数是15个。  
  8.         result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);  
  9.    }  
  10.    return fd;  
  11.    ......  

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

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

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

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

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

阅读(2867) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~