10.1 System V IPC介绍

进程间通信(IPC:Inter-Process Communication)是指多个进程之间互相通信,交换信息的方法。Linux支持的IPC包括最初的UNIX的IPC(信号和管道),还包括信号量、共享内存、消息队列和套接字(Socket)网络通信。其中信号量、共享内存、消息队列有两个版本,一个是System V(AT&T开发),另一个是POSIX(IEEE开发).

3种IPC资源在System V中有一些相似的属性和使用方法:

  1. IPC资源只能在本机通信时使用,不能跨网络;
  2. IPC资源生存期和内核相同,系统重启后所有IPC资源消失
  3. 每个IPC资源都有一个关键字key,每个IPC资源都有一个唯一的整数标识符id,用户根据关键字key创建一个IPC资源,IPC资源创建后时,会得到一个资源的id
  4. 每个IPC资源都有一个结构体Xid_ds记录其属性,X可以为sem(信号量),shm(共享内存),msg(消息队列)

该结构体中有一个表示该资源访问权限的ipc_perm结构和其他描述资源的信息。ipc_perm用于记录该ipc资源的访问权限,包括该ipc资源的创建者、所有者id、访问权限等。
e. 可使用ipcs显示状态ipcrm删除对象
f. 访问权限:读,写,没有执行。
g. 3种IPC资源都有类似的系统调用
所有的IPC资源都有Xget和Xctl系统调用。Xget系统调用用于创建IPC资源;Xctl系统调用用于对IPC资源进行控制。其中X可以是sem(信号量)、shm(共享内存)、msg(消息队列)。
image.png
当用户访问文件时,首先根据文件名通过执行系统调用open来打开和创建该文件,成功后得到一个文件描述符fd,接下来用户通过该文件描述符来访问文件。同时,系统还有一个内存inode,用于记录该文件的各种属性信息。
System V IPC资源的访问也是类似,用户根据资源的key通过执行系统调用Xget来打开或创建一个IPC资源,执行成功时得到一个资源的id,接下来用户通过该id来访问资源。同时系统中还有一个结构体Xid_ds来记录资源的属性。

image.png

image.png

image.png

10.2 System V信号量

image.png

image.png

image.png
image.png

semop用于信号量操作,System V信号量通过向semop传递不同的参数来完成wait和signal操作。如果信号量的值大于0,则wait操作将信号量的值减1;如果信号量的值等于1(???应该等于0),则执行wait操作的进程被阻塞。

10.3 System V共享内存

共享内存是最快的一种IPC方式,它使得多个内存能够访问一段指定的内存区(物理内存)。需要注意的是,进程在访问共享内存时要同步,通常使用信号量实现共享内存的同步。
进程间通信本质是让两个进程看到同一块资源,对于管道我们借助了pipe文件的文件内存缓冲区,那么共享内存就是绕过文件,直接在物理内存开辟一段空间,通过某种映射,让两个进程与这段空间关联起来,这样一个进程修改,另一个进程就能直接看见他,因为这段空间是两者共享的。

image.png

image.png
image.png
image.png

  • 共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存
  • 不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。
  • 如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
  • 这是最快的进程间通信方式,但是不提供同步功能(需要我们信号量实现)

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

10.4 消息队列

操作系统提供消息队列,有权限的进程可以把消息发送到消息队列中,消息一直存放在消息队列中,直到另一个进程将其取走。消息由两部分组成:

  • 可固定的消息首部
  • 可变长度的消息正文

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png