进程通信的本质就是不同进程能访问同一个内存区
IPC命名空间
- 在 Linux 中,IPC(Inter-Process Communication)命名空间用于隔离进程间通信的资源,包括共享内存、信号量和消息队列。IPC 命名空间是 Linux命名空间的一种类型,它允许在同一主机上创建多个隔离的 IPC 实例,每个实例都有自己的 IPC 资源。
- 通过 IPC 命名空间的隔离,不同的进程可以在各自的命名空间中创建和使用 IPC资源,而不会相互干扰。这对于容器化应用和虚拟化环境非常有用,因为它们可以在同一主机上运行多个隔离的进程,并且每个进程可以拥有自己的 IPC资源。
- 如果两个进程的IPC命名空间相同,那么这两个进程可以访问这个命名空间的内存空间。
无名管道
无名管道:适用于亲缘进程间的通信,半双工模式,单向传输,字节传输。
为什么没有亲缘关系的进程不能用无名管道?
无法找到写file和读file


命名管道
命令管道允许不相关进程读写相同文件,依赖于名称进行识别和引用,而不仅仅看文件描述符。


命名管道也是半双工的,所以需要多个命名管道实现全双工。
int fifo_read(){
int ret=mkfifo("./temp/test",0644);
if(ret==-1&&errno!=EEIXST){
perror("mkfifo failed");
return -1;
}
int fd=open("./temp/test",O_RDONLY);
if(fd==-1){
perror("fail");
return -1;
}
while(1){
char buf[1024]={0};
read(fd,buf,1024);
printf(buf);
}
}
int fifo_write(const char *buf){
int ret=mkfifo("./temp/test",0644);
if(ret==-1&&errno!=EEIXST){
perror("mkfifo failed");
return -1;
}
int fd=open("./temp/test",O_WRONLY);
if(fd==-1){
perror("fail");
return -1;
}
while(1){
write(fd,buf,strlen(buf));
sleep(1);
}
}
System V消息队列


System V信号量


内存映射
通过mmap将文件或者设备使用到的物理地址映射到进程的虚拟地址空间,通过返回的指针即可直接操作物理地址上的数据。底层是通过页表来实现虚拟地址到物理地址的映射,每个进程都有自己的页表,来管理地址的映射。
进程的虚拟地址空间的内核空间都映射到同一块物理内存上,并且通过MMU来管理,所以进程虚拟地址空间用户空间独立,内核空间共享。

在 Linux 操作系统中,内存映射(Memory Mapping)通过 mmap 系统调用实现。内存映射允许将文件或设备的内容映射到进程的地址空间,使得应用程序可以通过内存访问方式进行文件 I/O 或设备交互。以下是 Linux 上内存映射的实现原理和机制。
内存映射的基本原理
虚拟内存:
Linux 使用虚拟内存管理机制,每个进程都有自己的虚拟地址空间。内存映射通过将文件或设备内容映射到进程的虚拟地址空间,使得进程可以通过内存访问方式读取或修改数据。
页表和页帧:
内存映射通过修改页表,将虚拟地址映射到物理内存中的页帧。当进程访问映射区域时,操作系统会根据页表将访问请求转换为对物理内存的访问。
按需调入:
内存映射通常是按需调入的(demand paging),即只有在进程实际访问某个页面时,操作系统才将对应的文件或设备内容加载到内存中。
mmap 是在 Linux 中实现内存映射的主要系统调用。它允许程序将文件或设备的内容映射到进程的地址空间。
System V共享内存


POSIX消息队列
POSIX消息队列底层为mqueue inode节点,该节点基于红黑树保存信息。
当进程用mq_open 打开文件名,就会找到对应的mqueue inode 。

POSIX信号量
无名信号量:常用于线程同步和互斥操作,因为线程之间共享同一个内存区
有名信号量:在文件系统中创建一个特殊文件,多个进程可以访问同一个命名信号量,并且可以通过信号量名称进行识别,用于进程同步和互斥。

POSIX共享内存

4673

被折叠的 条评论
为什么被折叠?



