# 管道( pipe
):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) :
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) :
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory )
:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC
方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) :
套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
1,管道:根植于文件系统,管道一端读,一端写,只可以在父子进程间共享。父子进程有同一个文件标号(内核中file数组的下标),但是指向的file结构是不同的(file结构和具体的进程相关)。而file结构又指向一个dentry结构,这个dentry结构是同一个,dentry结构又指向一个inode结构(以上都是在内核中)。父进程发送消息,系统从用户态转到内核态,内核调用inode结构中的函数操作指针(具体的函数实现由虚拟文件系统下面的具体的文件系统实现),数据写入inode结构的缓存。内核在找到子进程的task_struct结构,添加标志告诉子进程有数据发送过来了,子进程由阻塞进度就绪。此时父进程进入就绪阶段。内核根据调度算法找到一个进程执行。不久,子进程被选择执行,同样的流程找到inode结构,读取缓存数据。这样,一个完整的进程通信完成了
2,命名管道:匿名管道是根据相同的文件fd找到对方,而命名管道是根据相同的文件名字。因此只要预定了文件名就可以通信,从找到file结构开始,过程都类似。都是根植于虚拟文件系统。不同于块文件和字符文件,命名管道是一种特殊的文件系统FIFO队列,因此不可以定位指针。
3,信号:信号时一种异步的通信方式。一个进程向另一个进程发送信号,系统从用户态进入内核态,内核根据接收进程的id找到其task_struct,把发送的信号放入接收进程队列。若干时刻过后,接收进程运行,运行一段时间后,接收进程需要用到内核服务,所以通过系统调用(异常或者中断)进入内核态,内核首先找到进程的信号队列,进入用户态,处理信号处理程序。处理完之后,再次进入内核态,找到信号处理前的指令,一切恢复正常,就好像没有信号处理一样。信号处理程序和主程序就好像是两个不同线程,共享进程的用户空间,却没有方法同步。信号处理程序不可能中断执行阻塞然后又转到主程序执行。信号处理程序的优先级高,但是指向条件苛刻。
4,共享内存:共享内存其实是不同进程的同一个物理页面,虽然虚拟内存地址不同。甲进程往共享内存写数据,乙进程也可以访问。共享内存可以不涉及内核操作,但是需要同步和通知控制。比如可以用信号来实现通知。
5,报文传递:不同于管道通信,每个进程都有一个报文队列,而每个报文都是一个有结构的数据。相对来说,管道只是一个字符流。管道通信缓冲区满之后,发送进程就会阻塞,报文不会。报文不是根植于文件系统。
6,信号量:很简单的通信方式,再访问一段内存的时候查看某一个信号是否可以访问,访问,关 闭,保证同一时刻只有一个进程访问这段内存。如此.....