【Unix】进程间通信

来源:互联网 发布:人工智能软件下载 编辑:程序博客网 时间:2024/03/29 08:58

一、进程间通信的几种技术

管道(半双工)、FIFOs(命名管道)

流管道(全双工)、命名流管道

消息队列、信号量、共享存储

套接口、流     --可支持不同主机上的各个进程间IPC

 

二、共享存储

1、共享存储允许两个或多个进程共享一给定的存储区。

2、因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。

3、使用共享存储的唯一窍门是多个进程之间对一给定存储区的同步存取,通常,信号量被用来实现对共享存储存取的同步。

4、内核为每个共享存储段设置了一个shmid_ds结构。

5、shmget函数,获得一个共享存储标识符

6、shmctl函数对共享存储段执行多种操作

7、一旦创建了一个共享存储段,进程就可以调用shmat将其连接到它的地址空间中。

8、当对共享存储段的操作已经结束时,则调用shmdt脱接该段。注意:这并不从系统中删除其标识符以及其数据结构。该标识符依然存在,

直至某个进程调用shmctl特地删除它。

 

三、mmap

1、mmap函数把一个文件或一个POSIX共享内存区对象映射到调用进程的地址空间。使用此函数有三个目的:

使用普通文件以提供内存映射IO

使用特殊文件以提供匿名内存映射

使用shm_open以提供无亲缘关系进程间的Posix共享内存区

2、父子进程之间共享内存区的方法之一是:父进程在调用fork前先制定MAP_sHARED调用mmap。

3、为从某个进程的地址空间删除一个映射关系,我们调用munmap。

4、有时候我们希望确信硬盘上的文件内容与内存映射区中的内容一致,可以调用msync。

5、mmap的另一个用途是在无亲缘关系的进程间提供共享的内存区。

 

四、父子进程间的共享内存区的例子

使用内存映射文件

使用4.4BSD匿名内存映射

使用/dev/zero匿名内存映射

 

五、无亲缘关系进程间共享内存

1、Posix.1提供了无亲缘关系进程间共享内存区的两种方法:

内存映射文件:由open函数打开,由mmap函数进行映射

共享内存区对象:由shm_open打开一个Posix.1IPC名字,所返回的描述字游mmap函数映射到当前进程的地址空间。

2、Posix共享内存区涉及的两个步骤要求:

指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象

调用mmap把这个共享内存区映射到调用进程的地址空间。

3、shm_unlink函数删除一个共享内存区对象的名字。

4、处理mmap的时候,普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。

5、当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。

 

六、总结

共享内存利用了虚拟存储器的实现,可以更加方便快速的对文件进行操作,同时也做到了各个进程的数据共享,不管在Windows还是

在Unix上,都是使用最广泛,最为快速的进程间通信方式。

 

 

原创粉丝点击