IPC机制

最近在读《Android开发艺术探索》这本书,读到了《IPC机制》这一章,很有感触,故在这里做笔记,用作自己记录之用。

简介

IPCInter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。进程间通信的方式有:Bundle、文件共享、AIDL、Messenger、ContentProvider和Socket等。

线程是CPU调度的最小单元,同时线程是一种有限的系统资源。

进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。

一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。最简单的情况下,一个进程中只可以有一个线程,即主线程,也叫UI线程。

IPC不是Android中所独有的,任何一个操作系统都需要相应的IPC机制,比如Windows上可以通过剪贴板等来进行进程间通信。Android是一种基于Linux内核的移动操作系统,它的进程间通信方式并不能完全继承自Linux,相反,它有自己的进程间通信方式。在Android中最有特色的进程间通信方式就是Binder了。

Android中的多进程模式

通过给四大组件指定android:process属性,我们可以轻易地开启多进程模式。但是多进程也会带来很多负面影响,有时候我们通过多进程得到的好处甚至都不足以弥补使用多进程所带来的代码层面的负面影响。

1.开启多进程模式
首先,在Android中使用多进程只有一种方法,那就是四大组件指定android:process。除此之外没有其它办法,也就是我们无法给一个线程或者一个实体类指定其运行时所在的进程。(详见P37)
android:process属性为”:remote”,也有可能是”com.ci.remote”,这两种方法是有明显区别的。(P38)第一方面,”:”的含义是指要在当前的进程名前附加上当前的包名,这是一种简写的方法,而”com.ci.remote”就是完整的命名信息。第二方面,进程名以”:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中;而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

2.多进程模式的运行机制
在P39页有一个例子,就是静态变量在多个进程中可能不再是同一个“它自己”了(详见P39)。在一个进程中改变一个静态变量的值之后,可能在另一个进程中打印我们的静态变量还是原来的值,并没有发生改变。在Android中,每个进程都被分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
综合来说,使用多进程会造成如下几方面的问题:
(1)静态成员和单例模式完全失效。
(2)线程同步机制完全失效。
(3)SharedPreferences的可靠性下降。
(4)Application会多次创建。

IPC基础概念介绍

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。

1.Serializable接口(代码详见P42)
Serializable是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。具体的描述在P42,在这里我就是写一个提纲,并不细述了。

2.Parcelable接口
Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以了实现序列化并可以通过Intent和Binder传递。(详情见P46)

两者的区别是:Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,它的缺点是使用起来稍微有点麻烦,但是它的效率很高,这是Android推荐的序列化方式,因此我们首选Parcelable。

以上就是我对于IPC的一些基础知识所列的提纲,具体的代码只是标记了页数,以供自己查阅。并且任玉刚大神的代码也是存放在他的Github上的,如果看见了可以去他的主页查阅。通过阅读和做笔记,我对于IPC有了一个基本的认识,后面就是对于Binder的认识以及具体的IPC方式。如果有时间的话,我也会把自己的体会通过笔记记录下来。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux IPC(进程间通信)机制是Linux操作系统中用于进程间通信的一组方法和工具。其中包括三种主要的IPC机制:消息队列、信号量和共享内存。下面是每种IPC机制的简要介绍: 1. 消息队列:消息队列是一种进程间通信机制,它允许一个或多个进程向队列中添加消息,并允许其他进程从队列中读取消息。消息队列通常用于在不同进程之间传递数据,例如在客户端和服务器之间传递请求和响应数据。 2. 信号量:信号量是一种用于进程同步和互斥的机制。它允许多个进程共享一个资源,并确保每个进程都能够安全地访问该资源。信号量通常用于控制对共享资源的访问,例如在多个进程之间共享打印机或磁盘驱动器。 3. 共享内存:共享内存是一种允许多个进程共享同一块物理内存的机制。这种机制通常比其他IPC机制更快,因为它避免了数据复制的开销。共享内存通常用于在多个进程之间共享大量数据,例如在图像处理或数据库应用程序中。 下面是每种IPC机制的一个简单示例: 1. 消息队列: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #define MSG_SIZE 1024 struct msg_buffer { long msg_type; char msg_text[MSG_SIZE]; } message; int main() { key_t key; int msg_id; // 创建消息队列 key = ftok("progfile", 65); msg_id = msgget(key, 0666 | IPC_CREAT); // 发送消息 message.msg_type = 1; strcpy(message.msg_text, "Hello World!"); msgsnd(msg_id, &message, sizeof(message), 0); // 接收消息 msgrcv(msg_id, &message, sizeof(message), 1, 0); printf("Received message: %s\n", message.msg_text); // 删除消息队列 msgctl(msg_id, IPC_RMID, NULL); return 0; } ``` 2. 信号量: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h> int main() { key_t key; int sem_id; struct sembuf sem_op; // 创建信号量 key = ftok("progfile", 66); sem_id = semget(key, 1, 0666 | IPC_CREAT); // 初始化信号量 semctl(sem_id, 0, SETVAL, 1); // 进程同步 sem_op.sem_num = 0; sem_op.sem_op = -1; sem_op.sem_flg = 0; semop(sem_id, &sem_op, 1); printf("Critical section\n"); sleep(5); sem_op.sem_num = 0; sem_op.sem_op = 1; sem_op.sem_flg = 0; semop(sem_id, &sem_op, 1); // 删除信号量 semctl(sem_id, 0, IPC_RMID); return 0; } ``` 3. 共享内存: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> #define SHM_SIZE 1024 int main() { key_t key; int shm_id; char *shm_addr; // 创建共享内存 key = ftok("progfile", 67); shm_id = shmget(key, SHM_SIZE, 0666 | IPC_CREAT); // 连接共享内存 shm_addr = shmat(shm_id, NULL, 0); // 写入共享内存 strcpy(shm_addr, "Hello World!"); // 从共享内存中读取数据 printf("Shared memory data: %s\n", shm_addr); // 分离共享内存 shmdt(shm_addr); // 删除共享内存 shmctl(shm_id, IPC_RMID, NULL); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值