- 管道通信或叫做匿名管道通信(pipeInputStream、pipeOutputStream):管道是指连接一个读进程和写进程来实现双方之间通信的一个共享文件,叫pipe文件。pipe文件只存在内存中,所以通信的数据量较小。匿名管道只能用于父子进程或者兄弟进程之间,并且传输的是无结构的字节流。管道具有互斥、同步的能力。一个进程对pipe文件读写操作,别的进程必须等待。若pipe文件数据超过分配的内存值,则写进程阻塞,若pipe文件为空,则读进程阻塞。
- 有名管道:匿名管道只能用于父子进程或是兄弟进程间通信,为了解决这个缺点,提出有名管道。有名管道提供一个路径名与自己关联,将路径名以磁盘文件的形式存储在磁盘上,pipe文件内容仍存放在内存中。本机中的另外进程只要能访问该路径就可以通过有名管道和创建管道的进程进行通信。(另外进程<---->创建管道的进程)
- 共享内存:使得多个进程可以直接读写同一内存空间,是最快的IPC形式,针对其它通信机制效率低设计的。在内核中专门留出一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间中(实质:通过映射函数传递地址!)。进程可以直接读写这一块内存而不需要拷贝共享内存区中的数据,大大提高效率。
- 信号:信号是Linux系统中用于进程间通信的一种机制。信号一般由内核进程产生,来通知用户空间的进程发生哪些系统事件,比如用户输入Ctrl+c退出,其它进程调用kill函数杀死目标进程。信号由某个进程产生,并设置此信号的传递对象,然后将其传递给操作系统,操作系统根据接收进程是否阻塞来选择性地发送给接收者。接收进程收到信号根据信号进行相应地处理。
- 消息队列:消息队列是消息地链表,主要是System V消息队列。有足够权限的进程可以向队列添加消息,被赋予读权限的进程可以读走队列中的消息。消息队列克服了信号传递信号量过小和管道只能传递无结构的字节流以及共享内存内存区大小受限的缺点。
- 信号量:信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。值>0表示当前可用资源的数量,值<0表示,其绝对值表示等待使用该资源的进程数。信号量的值仅能由PV操作来改变。使用PV操作信号量来实现进程同步和互斥。信号量意图在于进程间同步。
- Socket:它可以让不在同一台计算机但通过网络连接的计算机上的进程进行通信。每一个socket由ip和端口号表示。
进程间通信(IPC)的几种方式
最新推荐文章于 2021-09-06 20:11:21 发布