前言
进程间的通信要解决的问题的是进程之间信息的交流,信息的交流量可大可小。按交换信息的大小,可把进程间的通信分成低级通信和高级通信。
在低级通信中,进程之间只传递状态和整数值,信号量机制属于低级通信方式。其优点是传递信息的速度快,缺点是传递的信息量少,通信效率低。
在高级通信中,进程间可以传送任意数量的数据,传递的信息量大,操作系统隐藏了进程间通信的细节,简化了写代码的复杂性。
高级通信
高级通信机制分为三类,分别为共享存储系统、消息传递系统和管道通信。
共享存储系统
在共享存储系统中,相互通信的进程共享某些数据结构或存储区域,进程之间通过共享的区域进行通信。
共享区域:将同一块物理地址映射到不同的进程和虚拟地址空间中,实现不同进程对同一资源的共享,其通信方式最快。
特点:
- 不用从用户态到内核态频繁的切换和拷贝数据,直接从内存中读取就可以。
- 共享内存是临界资源,所有操作要保证其原子性。使用信号量或互斥锁。
- 生命周期随内核
常用函数:
//创建共享内存
int shmget(key_t key,size_t size,int shmlg);
//key_t key:共享内存名字
//size_t size:共享内存大小
//shmflg:权限标志,等同于创建文件时的权限标志
//返回值:成功返回非负整数,失败返回-1
//将共享内存端连接到进程地址空间
void shmat(int shmid,const void *shmaddr,int shmlg);
//int shmid:由shmget返回的共享内存标识
//const void *shmaddr:连接地址
//shmflg:权限标志,等同于创建文件时的权限标志
//返回值:成功返回一个指针指向共享内存第一个节点,失败返回-1
//用于控制共享内存
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
//int shmid:由shmget返回的共享内存标识