什么是进程通信?
进程通信就是进程之间的信息交换
进程是资源管理的基本单位,因此各个进程拥有的内存地址空间相互独立
进程间的通信方式
为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法
通信方式—共享内存
1.两个或多个进程共享一个给定的存储区,通信速度最快,进程是直接对内存进行存取
2.两个进程对共享空间的访问必须是互斥的,当进程1向共享空间中写数据时,进程2不能访问共享空间
通信方式—管道通信
“管道”是指用于连接读写进程的一个共享文件。
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
- 各进程要互斥的访问管道。在下图中,进程1会一直向管道写数据,直到数据写满,进程2才会向外读数据,所有数据被读出后,进程1才会向管道读数据
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
匿名管道
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道
有名管道也是半双工的通信方式,以磁盘文件的方式存在,可以实现本机任意两个进程之间的通信。
高级管道
将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
通信方式—信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
通信方式—信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
通信方式—消息队列
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息队列起信箱作用,到了就挂在那里,需要的时候去取。消息队列提供了一种在两个不相关进程间传递数据的简单有效的方法。与命名管道相比:消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。
通信方式—套接字
套接字也是一种进程间通信机制,它主要用于客户端和服务端之间通过网络进行通信,套接字是支持TCP/IP的网络通信的基本操作单位,可以看作是不同主机之间的进程进行双向通信的端点,简单来说就是通信双方的一种约定,用套接字中的相关函数完成通信过程