目录
一:共享内存
1.1定义
内核管理一片物理内存,允许不同的进程同时映射(访问),多个进程可以映射同一块内存。被多个进程同时映射的物理内存:即共享内存。(允许多进 程同步访问给定的储存区域)。
映射物理内存-》挂接 ; 用完之后解除映射-》脱接。
1.2优缺点
1.2.1 优点
因为数据不需要在客户进程和服务器进程之间复制,所以这是一种最快的IPC。
1.2.2缺点
内核没有提供对共享内存的互斥访问。(信号量,互斥量等)
1.3共享内存结构维护
内核为每个共享内存都维护相关信息:
//共享内存的维护信息
struct shmid_ds{
struct ipc_perm shm_perm; //权限控制
size_t shm_segsz; //size of segement in bytes 字节数
pid_t shm_lpid; //pid of last shomp() 最后执行shomp()的进程ID
pid_t shm_cpid; //创建该共享内存的ID
shmatt_t shm_nattch; //number of current attaches,现有连接数
time_t shm_time; //最后被连接时间
time_t shm_dtime; //最后删除连接的时间
time_t shm_ctime; //最后修改时间
.
.
}
1.4共享内存的通信原理
Linux,中每个进程都有自己的PCB(进程控制块)和Addr Space(地址空间),该虚拟地址空间通过多级页表(这里以一级页表为例)和物理地址空间进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这个块区域即:共享内存。
对于一个共享内存,实现采用的是引用计数的原理,当进程脱接共享储存区后,计数器减一;挂接则加一,直至计数器变为0,该共享内存才被删除。当进程终止的时间,它所附加的共享储存区都会自动脱离。
这里还可以解决一个问题:为什么共享内存速度最快?
上图中:Proc A进程在给共享区域写数据,Proc B 进程从其中读取数据,再次其中一共发生了两次数据的复制:
(1):Prco A 到共享内存 (2) : 共享内存到 Prec B
因为直接在内存上操作,所以共享内存的速度也就提高了。