人的一生犹如负重致远,不可急躁。 以不自由为常事,则不觉不足。 心生欲望时,应回顾贫困之日。 心怀宽恕,视怒如敌,则能无视长久。 只知胜而不知敗,必害其身。 责人不如责己,不及胜于过之。
分类: LINUX
2017-02-21 22:45:55
进程间通信
1 进程通信简介
进程间通信(IPC,Interprocess communication)就是在不同进程之间传播或交换信息,进程间通信也是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。
进程是转入内存并准备执行的程序,每个程序都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道)组成多进程/多线程是windows操作系统的一基本特征。Linux系统一般都统称为进程。
由于不同的进程运行在各自不同的内存空间中,其中一个进程对于变量的修改另一方是无法感知的,因此,进程之间的消息传递不能通过变量或其他数据结构直接进行,只能通过进程间通信来完成。进程间通信是指不同进程间进行数据共享和数据交换。
1.1 进程通信的分类
根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:控制信息的通信低级通信和大批数据信息的通信高级通信。
低级通信主要用于进程之间的同步、互斥、终止和挂起等控制信息的传递。
高级通信主要用于进程间数据块数据的交换和共享,常见的高级通信有管道、消息队列、共享内存等。
1.2 进程通信的目的
1、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
2、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
3、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
4、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
5、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
2 进程通信方式
1、文件和记录锁定
为避免两个进程间同时要求访问同一资源而引起访问和操作的混乱,在进程对共享资源进行访问前必须对其锁定,该进程访问完后再释放。这是为共享资源提供的互斥性保障。
2、管道
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系一般指的是父子关系。管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
3、有名管道
有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4、FIFO
FIFO是一种先进先出的队列,它类似于一个管道,只允许数据的单向流动,每个FIFO都有一个名字,允许你不相关的进程访问同一个FIFO,因此也成为命名管。
5、信号量
信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。
6、信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7、消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。消息队列是不同进程之间可实现共享资源的一种机制,允许不同进程将格式化的数据流以消息队列形式发送给任意进程。对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制。通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序。
8、共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其他通信机制, 如信号量,配合使用, 来实现进程间的同步与通信。
9、套接字(socket)
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同进程及其间进程的通信。
3 进程间通信方式的优缺点
如果用户传递的信息较少或是需要通过信号来触发某些行为信号机制不失为一种简捷有效的进程间通信方式。
若是进程间要求传递的信息量比较大或者进程间存在交换数据的要求,那就需要考虑别的通信方式了。
无名管道简单方便,但局限于单向通信的工作方式,并且只能在创建它的进程及其子孙进程之间实现管道的共享。
有名管道虽然可以提供给任意关系的进程使用,但是由于其长期存在于系统之中,使用不当容易出错,所以普通用户一般不建议使用。
消息缓冲可以不再局限于父子进程,而允许任意进程通过共享消息队列来实现进程间通信。并由系统调用函数来实现消息发送和接收之间的同步。从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题,使用方便,但是消息队列中信息的复制需要额外消耗CPU的时间。不适宜于信息量大或操作频繁的场合。
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点,但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的 虚拟地址空间中来实现的。因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统中的诸进程共享,不方便网络通信 。
不同的进程通信方式有不同的优点和缺点。因此,对于不同的应用问题,要根据问题本身的情况来选择进程间的通信方式。