Linux进程间通讯方式(IPC)

InterProcess Communication,IPC

进程是什么

进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。
一个进程包括控制结构执行结构;控制结构是进程控制块PCB,执行结构包括程序以及需要操纵的数据集合

单CPU只能同时运行单个进程,多CPU可以同时运行多个进程。

注意区别于,我们常说的多线程中的线程,一个进程可以包含很多个线程。

进程通信的概念

进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。

进程通信的应用场景

数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。

共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。

进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程通信的方式

Linux进程间通讯方式(IPC)_第1张图片

1.管道

管道是一种古老的IPC通信形式。它有两个特点:

半双工:即不能同时在两个方向上传输数据。有的系统可能支持全双工。
只能在父子进程间:经典的形式就是管道由父进程创建,进程fork子进程之后,就可以在父子进程之间使用了。

2、FIFO

又称命名管道,与管道不同的是,不相关的进程也能够进行数据交换。

3.信号量

信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.。

它的主要流程如下:

  • 检查控制该资源的信号量
  • 如果信号量值大于0,则资源可用,并且将其减1,表示当前已被使用
  • 如果信号量值为0,则进程休眠直至信号量值大于0
  • 也就是说,它实际上是提供了一个不同进程或者进程的不同线程之间访问同步的手段

4.信号

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

5.消息队列

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.

6.共享内存

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

7.套接字

socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。

套接字的特性由3个属性确定,它们分别是:域、类型和协议。

可用于不同及其间的进程通信

你可能感兴趣的