我发现,在 Unix System V 中,事件被映射到内核空间中的地址,并且进程在这样的事件上休眠,并且中断使用该地址唤醒进程。
但这是如何工作的?它是如何实施的?
我仍然不明白他们的意思,“事件映射到地址”。对不起,如果这个问题很幼稚。
这是因为共享内存:
POSIX 为使用共享内存( POSIX Shared Memory)提供了一个标准化的 API 。这使用
shm_open
来自的函数sys/mman.h
。POSIX 进程间通信(POSIX:XSI 扩展的 一部分)包括共享内存函数shmat
、shmctl
和。UNIX System V 也为共享内存提供了一个 API。这使用来自. BSD 系统提供可以被多个进程使用的“匿名映射内存”。shmdt
shmget
shmget
sys/shm.h
open创建的共享内存
shm_
是持久的。它保留在系统中,直到被进程明确删除。这有一个缺点,如果进程崩溃并且无法清理共享内存,它将一直停留到系统关闭。为了避免这个问题mmap
,可以使用创建共享内存。两个通信进程应该打开一个同名的临时文件并mmap
对其进行操作以在内存中获取文件映射。因此,两个进程同时可以看到映射内存的变化。这些方法的优点是当两个进程都退出时,操作系统会自动关闭文件并删除共享内存。
有时,进程希望等待某个事件发生,例如设备初始化、I/O 完成或计时器到期。在这种情况下,该进程被称为在该事件上休眠。在共享内存多处理器上启用“休眠”进程是一个困难的问题,特别是如果该进程将被中断时间事件唤醒。