使用sem_open创建命名信号量时不同进程返回地址不一致疑问
问题原因说明
- 你的代码和操作完全没有问题,两个进程确实打开了同一个
/my_sem命名信号量,返回地址不同是正常现象,不属于错误。 sem_open返回的是当前进程虚拟地址空间内的地址,不是系统全局的物理地址。Linux 下每个进程都有独立的虚拟地址空间,不同进程的虚拟地址本身没有全局可比性。- 命名信号量是内核维护的全局对象,
sem_open的作用是把内核中这个全局的信号量对象,映射到调用进程的虚拟地址空间中供用户态操作。每个进程的虚拟地址空间布局、空闲区域位置都不一样,所以映射后的虚拟地址自然不同。这个逻辑和你打开同一个磁盘文件、两个进程拿到的文件描述符可能不同,或者用mmap映射同一个文件返回的虚拟地址不同是完全一致的。 - 你调用
sem_wait、sem_post等接口操作这个地址的时候,库函数和内核会自动完成虚拟地址到内核全局信号量对象的映射,所以哪怕两个进程用的虚拟地址不一样,实际操作的都是同一个内核信号量,同步功能完全不受影响。
如果你同时启动两个进程(间隔小于5秒),会看到第二个进程的sem_wait调用会阻塞,直到第一个进程执行完sem_post之后才会返回并打印Enterd into CS,这就已经证明两个进程操作的是同一个信号量,和返回的地址无关。你测试时两个进程都直接进入临界区,大概率是你启动第二个进程的时间比第一个晚了5秒以上,第一个已经执行完释放了信号量。
内容的提问来源于stack exchange,提问作者dragon
相关产品推荐
相关产品推荐

