我正在阅读Docker 的实际应用还有这样一句话:
Docker 默认为每个容器创建唯一的 IPC 命名空间。 Linux IPC 命名空间分区共享内存原语,例如命名共享内存块和信号量以及消息队列。
尽管有这些例子,我还是不明白背后的概念是什么内存原语,您能解释一下这个术语吗?
答案1
人命名空间有一节关于IPC命名空间。
IPC 命名空间隔离某些 IPC 资源,即 System V IPC 对象(请参阅超级会员(7))和(自 Linux 2.6.30 起)POSIX 消息队列(请参阅mq_概述(7))。这些 IPC 机制的共同特征是 IPC 对象由文件系统路径名以外的机制标识。
man svipc
说它有三种类型的对象;共享内存对象、消息队列和信号量集(信号量是信号量的更一般情况)互斥体)。每个对象都有一个数字 ID,而不是文件系统路径。
POSIX 消息队列由名称标识,类似于文件名。 (Linux 实现使用通过访问的虚拟文件/dev/mqueue/
)。
System V IPC 应被视为过时且难以使用。
- System V 共享内存对象可以用 POSIX SHM 替换,请参见男人 shm_概述。
- System V 信号量可以使用替换POSIX 共享内存中的 POSIX 互斥体。
- 您猜对了,System V 消息队列可以被 POSIX 消息队列取代。
请注意,Linux IPC 命名空间确实不是隔离 POSIX SHM。 Linux 实现通过 访问对象/dev/shm/
,这是一个tmpfs
虚拟文件系统。如果要隔离 POSIX SHM,可以使用挂载命名空间来更改挂载在 的文件系统/dev/shm/
。
答案2
机器问题将运用过程控制、信号管理、管道和共享内存的原语。 Unix 中的原语列出如下:
• Process Control
fork:
exec:
• Signal Management
sigset:
kill:
• Pipes and Files
pipe:
mknod:
unlink:
read/write:
• Shared Memory
shmget:
shmat:
• Semaphores (System V style)
semget:
semop:
• ipcs: This command reports on the status of inter-process communication facilities. Allows you to monitor the correct use and operation of the interprocess communication primitives in your program.
• ipcrm: Remove a message queue, semaphore set, or shared memory ID. This comes in handy if your program does not clean up things correctly.
• kill: Terminate or signal a process. Comes in handy to clean up your processes.
• ps: Report on process status. This at least lists all your processes.