semaphore & ipc_message posix message queue & ipc_shared Memory

本文介绍了信号量(semaphore)的内部实现原理,包括用户级和内核级的区别,以及如何通过SEM_UNDO标志实现进程异常终止时信号量的回滚。此外,还探讨了POSIX消息队列和System V消息队列的实现机制,特别是前者如何通过mqueue文件系统进行消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

semaphore

每个semaphore用一个sem_array来代表,每个sem_array里包含一个或者多个sem结构,sem代表一个原子信号量,用户使用的semaphore跟内核使用的semaphore有个很大的区别在于,用户的semaphore可以包含多个信号值,每个信号值用sem来代表。如果进程使用semop()操作时带上了SEM_UNDO标志,那么进程对信号量的操作将会被一个sem_undo结构记录,这样当进程因为错误而终止时,系统可以使用sem_undo结构将信号量的值恢复到进程未使用的状态。

ipc_message & posix message queue

每个message用一个msg_queue结构来进行代表,queue里的信息使用msg_msg来表示。posix message queue的实现方式跟ipc_message(system v)是不同的,它使用一个特殊文件系统mqueue来实现的,这个文件系统可以被挂载到文件系统中。每个队列使用一个mqueue_inode_info来表示的,它跟一个mqueue文件系统的inode进行关联,也是通过address_space使用page cache来使用内存的。

ipc_sharedMemory

一个共享的内存用一个shmid_kernel结构来进行表示,它里面有个field指向file结构,file指向shm特殊文件系统的inode结构,共享的内存page frame使用的是page cache,通过address_space结构跟inode进行关联。这样的做的原因有2点:

1.可以使用vfs系统接口,也就是文件操作接口来进行操作

2.可以利用vfs的实现结构,从而实现代码重用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值