为什么要进程隔离?
我们知道每个进程在运行的时候,都会需要一定的计算机内存空间,但是如果我们将每个程序都装进计算机的内存,那么就会导致计算机的利用率相当的低,而且不用进程在进入和退出内存的过程中,会造成效率非常的低。还有就是当不同的进程直接载入内存的时候,可能会出现A进程的地址内容被B进程修改,从而造成程序错误。
怎么样实现进程隔离?
为了实现进程的隔离,在实际中,我们使用了虚拟地址空间,它为每个进程分配4G的虚拟地址空间,其中1G为内核空间,其他的为用户空间如下图所示。内核空间的安全权限更高,不允许随便访问,只有许可的资源才能被访问。这样每个进程独享4G的虚拟地址空间,它们之间的数据时不共享的,那么,如果它们之间需要通信,就需要某种系统机制来完成。
如何访问内核空间?
上面我们提到内核空间是不允许随便访问的,但是我们的总会有需要去访问内核的资源啊!这个时候,我们就会利用我们经常听说的一个动词:系统调用。通过这个统一的接口,所有资源的访问都在内核的控制下执行,以免导致用户程序对系统资源的越权访问,从而来保证系统的安全性和稳定性。
进程之间通信方式?
通过系统调用,可以实现用户空间对内核空间的访问,那么两个进程之间的通信如何实现?Android的底层是基于Linux实现的,目前Linux支持的跨进程通信(IPC)包括传统的管道、System V IPC(消息队列/共享内存/信号量)、socket,其中socket是基于C/S模式的。但是我们在Android中常用的binder通信机制是传统的Linux系统不支持的,所以它并不是内核的一部分,那么如何实现内核的访问呢?Linux具有动态可加载内核模块机制,具体是指模块是具有独立功能的程序,它可以被单独编译,但是不能运行,它在运行的时候是被链接到内核作为内核的一部分在内核空间运行的。这样,Android系统就可以通过添加一个内核模块模块运行于内核空间&