Android的进程间通信(一) 之 进程隔离简述

进程隔离简述

我们在了解进程间通信的之前,其实要先思考一个问题:“为什么要进程间通信?”
Android的进程间通信(一) 之 进程隔离简述_第1张图片
A进程无法访问B进程内存,B进程无法访问A进程的内存,进程和进程之前存在着进程间隔离。

我们按照这个思路往下,马上可以有另外一个问题,为什么要有进程间隔离?

Android的进程间通信(一) 之 进程隔离简述_第2张图片
进程间隔离,在维基百科上的主要介绍是:为了避免A进程写入B进程的情况发生。

我们可以举一个例子:当在Android系统上运行着微信,假如不存在进程间隔离,那么其他App可以直接访问微信的内存,那么会存在我们用着用着微信,突然发现发出的消息被改变了,用着用着突然弹出弹窗。这是一件可怕的事情。

所以到这里大家应该可以理解为什么要有进程间隔离了吧。那么我们可以再进一步思考:如何实现进程间隔离?
Android的进程间通信(一) 之 进程隔离简述_第3张图片
进程间的隔离采用了虚拟地址的技术。当进程A被创建的时候,系统会分配一段虚拟地址给到进程A,进程A只有操作这段内存的权限。B进程同理。

那么,虚拟地址到底是什么技术呢?

在电脑上,我们都会装上内存条,在2020普遍都是8G 到 16G这个大小,我们在这里称内存条为物理内存。虚拟内存是一种抽象的内存,在64位系统上,它最大可以到256TB。

虚拟内存会最终会映射到物理内存上,CPU操作的是虚拟内存,然后MMU(内存管理单元)会把虚拟内存翻译成物理内存。

那么虚拟内存有什么用处?①:为了内存的管理的方便。②:通过磁盘来拓展内存条。详细可以看图片哦。

虚拟内存里又分为用户内存和核心内存。
Android的进程间通信(一) 之 进程隔离简述_第4张图片
在32位的系统上,每个进程只能分配到4G。这4G里,有3G是用户空间,有1G是内核空间。

在64位的系统,每个进程可以分配到256TB,用户空间和内核空间分别占128TB。

在分配给进程的内核空间里,他们是连续并且可以相互通信的。在分配给进程的用户空间里,他们是相互独立,无法通信。所以,我们常说的进程间隔离,是指用户空间的内存之间无法相互访问。

我们刚刚上面说了,虚拟内存分为:用户空间和内核空间。内核空间运行着系统与驱动等一系列程序,用户空间运行着用户写的程序,所以他们之间需要API来进程通信的。
Android的进程间通信(一) 之 进程隔离简述_第5张图片
Linux系统中,存在着一句话,叫做一切皆文件。这里的文件是一个抽象的概念。意思是Linux的所有操作都抽象成对文件的操作。当我们打开一个Socket是打开文件,当我们与硬件交互时,也是打开文件。所以,这里文件可以理解成一个API。
Android的进程间通信(一) 之 进程隔离简述_第6张图片
所以,用户空间和内核空间的交互,是通过打开某一个文件。这个文件在内核空间的程序初始化时会定义好。当打开这个文件时,系统会调用到运行在内核空间的程序代码。用户空间往内核空间传输数据时,用户会先调用ioctl(API),然后会来到内核空间的相应的方法。内核空间会调用copy_from_user(),把数据拷贝过来。

总结

上面的分析,大致回答了五个问题,这五个问题我认为是理解进程通信的必要前提,不然后面学习进程间通信时,没有形成逻辑链的闭合,会处于迷茫的状态。

一、为什么需要进程间隔离?
二、如何实现进程间隔离?
三、什么是虚拟内存?
四、虚拟用户分为几种?
五、用户空间和内核空间如何通信?

你可能感兴趣的:(android,进程通信,linux,android,linux,进程通信)