10.1 System V IPC介绍
进程间通信(IPC:Inter-Process Communication)是指多个进程之间互相通信,交换信息的方法。Linux支持的IPC包括最初的UNIX的IPC(信号和管道),还包括信号量、共享内存、消息队列和套接字(Socket)网络通信。其中信号量、共享内存、消息队列有两个版本,一个是System V(AT&T开发),另一个是POSIX(IEEE开发).
3种IPC资源在System V中有一些相似的属性和使用方法:
- IPC资源只能在本机通信时使用,不能跨网络;
- IPC资源生存期和内核相同,系统重启后所有IPC资源消失
- 每个IPC资源都有一个关键字key,每个IPC资源都有一个唯一的整数标识符id,用户根据关键字key创建一个IPC资源,IPC资源创建后时,会得到一个资源的id
- 每个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(消息队列)。
当用户访问文件时,首先根据文件名通过执行系统调用open来打开和创建该文件,成功后得到一个文件描述符fd,接下来用户通过该文件描述符来访问文件。同时,系统还有一个内存inode,用于记录该文件的各种属性信息。
System V IPC资源的访问也是类似,用户根据资源的key通过执行系统调用Xget来打开或创建一个IPC资源,执行成功时得到一个资源的id,接下来用户通过该id来访问资源。同时系统中还有一个结构体Xid_ds来记录资源的属性。
10.2 System V信号量
semop用于信号量操作,System V信号量通过向semop传递不同的参数来完成wait和signal操作。如果信号量的值大于0,则wait操作将信号量的值减1;如果信号量的值等于1(???应该等于0),则执行wait操作的进程被阻塞。
10.3 System V共享内存
共享内存是最快的一种IPC方式,它使得多个内存能够访问一段指定的内存区(物理内存)。需要注意的是,进程在访问共享内存时要同步,通常使用信号量实现共享内存的同步。
进程间通信本质是让两个进程看到同一块资源,对于管道我们借助了pipe文件的文件内存缓冲区,那么共享内存就是绕过文件,直接在物理内存开辟一段空间,通过某种映射,让两个进程与这段空间关联起来,这样一个进程修改,另一个进程就能直接看见他,因为这段空间是两者共享的。
- 共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存
- 不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。
- 如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
- 这是最快的进程间通信方式,但是不提供同步功能(需要我们信号量实现)
10.4 消息队列
操作系统提供消息队列,有权限的进程可以把消息发送到消息队列中,消息一直存放在消息队列中,直到另一个进程将其取走。消息由两部分组成:
- 可固定的消息首部
- 可变长度的消息正文