终于把共享内存和信号量集合的知识串联在一起了, 其中的操作的确有些复杂
共享内存若想实现进程之间的同步读写, 则需要配合信号量共同使用
- **共享内存**
- **共享内存的创建**
- 开辟共享内存区域, 使用 shmid_kernel 描述
- 通过 kvmalloc 在内核的直接映射区分配一个 shmid_kernel 结构体
- 将内存映射到文件
- 这个文件并非磁盘文件, **而是通过内存文件系统 shmem 创建的内存文件**
- 这么做的原因是因为**文件可以跨进程共享**
- 将这个 shmid_kernel 挂载到共享内存基树上, 返回对应的 id
- **共享内存的映射**
- 通过 id 在共享内存基树上找到对应的共享内存描述 shmid_kernel
- 创建一个 shm_file_data 指向共享内存的内存文件
- 创建一个 file 指向 shm_file_data
- 在用户空间找一块内存区域, 将这个 file 映射到用户地址空间
- 通过文件映射之后, 便可以在用户空间操作这块内存了
- **信号量集合**
- 信号量集合的创建
- 创建 sem_array 结构体, 用于描述信号量
- 将这个 sem_array 信号量添加到基树上, 返回对应的 id
- 信号量集合的初始化
- SETALL: 为所有信号量集合赋值
- SETVAL: 为指定信号量赋值
- 操作信号量集合
- 调用 **perform_atomic_semop** 尝试从操作队列中读取执行
- 若执行成功, 则说明无需等待
- 调用 do_smart_update, 看看这次操作能够激活等待队列中的哪些进程
- 调用 **wake_up_q** 唤醒因为信号量阻塞的进程
- 若需要等待
- 根据是操作信号量还是信号集合, 将其挂载到对应的 pending_alter 中
- 执行 looper 等待, 直到 timeout 或者被 wake_up_q 唤醒
- 若未设置 timeout, 则让出 CPU 资源
展开