在Binder通信机制里,客户端与服务端之间的通信是在专门的IPC通信线程中进行的。这些线程构成一个线程池。线程的创建和销毁是在用户空间进行的,而对线程的控制是在驱动层进行的,即驱动控制线程池中线程的生命,而线程本身则是运行在用户空间的。驱动层是通过BR_SPAWN_LOOPER向用户空间发送创建新线程的命令。
线程池的大小可以设置, 如果没有主动去设置这个大小,则默认大小为15,如下代码所示:
在ProcessSate.cpp在构造函数里,会调用open_driver函数,里面会进行线程池默认大小的设置:
static int open_driver()
{
int fd = open("/dev/binder", O_RDWR);
if (fd >= 0) {
...
size_t maxThreads = 15;
result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
if (result == -1) {
ALOGE("Binder ioctl to set max threads failed: %s", strerror(errno));
}
} else {
ALOGW("Opening '/dev/binder' failed: %s\n", strerror(errno));
}
return fd;
}
与线程池相关的几个变量设置在