首先,对于一个32位的处理器, 在Linux系统中,其虚拟地址为32位,因此其虚拟地址空间的范围为
一个可执行文件运行起来的话它就变成了进程,系统会给每个进程分配一个4G大小的虚拟地址空间。如果一个Android设备是8g内存,给每个进程分配4g实际内存是不可能的。
Linux系统将虚拟地址空间按3:1比例划分,其中用户空间(user space)占3GB,内核空间(kernel space)占1GB。
https://blog.csdn.net/czc1997/article/details/81159126
其中前3G内存是用户空间,最后1G是内核空间。所有的进程有各自的用户空间,但所有的进程都共享一个内核空间。
出处:Android系统中的进程管理:进程的创建
在Android系统中,进程可以大致分为系统进程和应用进程两大类。
系统进程是系统内置的(例如:init,zygote,system_server进程),属于操作系统必不可少的一部分。
应用进程是指应用程序运行的进程。这些应用程序可能是系统出厂自带的(例如Launcher,电话,短信等应用),也可能是用户自己安装的(例如:微信,支付宝等)。
下面我们只看应用进程。
一般情况下来说,一个app,对应一个进程,系统会分配给这个进程分配一个4g(处理器是32位的情况下)的虚拟空间,如下所示。
但是,对于系统应用很常用的一个属性就是android:sharedUserId。
android:sharedUserId的作用是多个应用程序,可以共享同一进程中的用户空间(如android.uid.phone或android.uid.system),例如下面的AndroidManifest,分别是3个应用中的AndroidManifest。
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
package="com.android.phone"
coreApp="true"
android:sharedUserId="android.uid.phone"
android:sharedUserLabel="@string/phoneAppLabel"
>
package="com.android.simmelock"
android:sharedUserId="android.uid.phone">
package="com.android.stk"
android:sharedUserId="android.uid.phone">
phone,simmelock以及stk这3个app,使用的sharedUserId都是android.uid.phone,因此这3个应用程序,在实际运行中,这种情况下app之间可以数据共享,因为都是运行在同一用户空间中。
虚拟空间如下所示。