进程间以及线程间的通信方式

进程通信和线程通信基本上是所有面试绕不过去的一道坎,之前一直关注的都是进程间的通信,没有怎么关注过线程之间的通信,突然有一天被问到两者的区别,感觉瞬间整个人都懵了,这里特意总结一下,本人主要专注于JAVA开发和Android开发方面的问题,所以这里也主要从这两方面分析。

首先说下进程和线程的差别

(1) 进程的话,每一个都是有自己独立的地址空间的,即使是两个进程地址相同,也是代表着不同的位置的。

(2) 在linux中,进程的创建是用fork()来实现的,而fork是一个一次调用,两个返回值的,这个也是有次面试突然提到的。而Android中的进程则是指不同的组件,以及不同的APPS了

(3) 而进程间的通信是需要通过操作系统的公共区进行的,叫做IPC(InterProcess Communication)。Android中有一个专门用来进行组件间通信的叫做Intent。

(4) 而线程的话,一般是在进程中创建的,同一个进程中的线程,其实是在同一个地址空间的,可以直接通信的。不同进程之间的线程,估计就没有必要进行通信吧

(5) 线程之间的通信,其实主要的问题就是资源的竞争问题了,因为共享进程的内存地址空间,因此特别需要注意的就是资源锁的问题了,也就是互斥访问

(6) 进程的创建时非常昂贵的,通信也是麻烦的。因此通常使用线程来提高程序的效率,不过线程的主要问题就是同步,异步和互斥的问题了。

1. 进程间通信

(1) 管道:管道的话是一种半双工的通信方式,通常只能在有亲缘关系(父子)的进程间使用,数据是单向流动的。当然也完全可以建立两条管道来进行通信。说到管道,还有一种有名管道,这个虽然依旧是半双工的通信方式,但可以在无亲缘关系的进程间通信。

(2) 信号:较为复杂的一种通信方式,主要是通知某个进程某个事件已经发生。

上面这两个(或者三个)属于传统的unix通信机制

 

(3) 信号量:本质其实是一个计数器,用来控制多个进程对共享资源的访问。(常见的P操作(占用一个资源)和V操作(释放一个资源),互斥信号量S=1;S<0代表等待资源的进程数)。

(4) 消息队列:一个消息链表,存放在内核中并由消息队列标识符标识。有点类似于Android中的looper,messageQueue和handle了。。。。

(5) 共享内存:一个进程映射一段内存,这段内存可以被多个进程访问。共享内存可以说是最快的IPC方式了,不过往往需要信号量的协助。这个方式其实有点类似于线程间通信了

上面三种是System V IPC,也就是系统5上发明的三种IPC方式

 

(6) 套接字:这个是unix编程的重点,不仅实现了同一台计算机中的IPC,而且可以跨网络来进行通信。

 

2. 线程间通信

线程间的通信其实主要问题就是解决同步的问题以及互斥的问题,因此锁和信号是经常被用到的

(1) 锁机制:读写锁,互斥锁,条件变量(本质还是锁嘛)

(2) 信号量机制:无名线程信号量以及命名线程信号量

(3) 信号机制:和进程间差不多

其实,线程被称为轻量级的进程,因此上述的几种方式和进程间通信还是很相似的,就不再赘述了。

posted @ 2017-09-03 20:17  东木刀纹  阅读(267)  评论(0编辑  收藏  举报