Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391755
  • 博文数量: 63
  • 博客积分: 3142
  • 博客等级: 中校
  • 技术积分: 838
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-06 13:35
文章分类

全部博文(63)

文章存档

2011年(2)

2010年(114)

2009年(3)

我的朋友

分类: LINUX

2010-02-09 17:26:41

POSIX 进程间通信

POSIX 进程间通信 (interprocess communication, IPC) 是 System V 进程间通信的变体。 它是在 Solaris 7 发行版中引入的。 与 System V 对象类似,POSIX IPC 对象的属主、属主的组以及其他用户具有读取和写入权限,但是没有执行权限。 POSIX IPC 对象的属主无法将对象分配给其他属主。 POSIX IPC 包括以下功能:

  • 消息允许进程将已格式化的数据流发送到任意进程。

  • 信号量允许进程同步执行。

  • 共享内存允许进程共享其部分虚拟地址空间。

与 System V IPC 接口不同,POSIX IPC 接口均为多线程安全接口。

POSIX 消息

下表中列出了 POSIX 消息队列接口。

表 6–2 POSIX 消息队列接口

接口名称 

目的 

连接到以及创建(可选)命名消息队列 

结束到开放式消息队列的连接 

结束到开放式消息队列的连接,并在最后一个进程关闭此队列时将其删除 

将消息放入队列 

在队列中接收(删除)最早且优先级最高的消息 

通知进程或线程消息已存在于队列中 

,

设置或获取消息队列属性 

POSIX 信号量

POSIX 信号量比 System V 信号量轻得多。 POSIX 信号量结构定义单个信号量,而不是定义最多包含 25 个信号量的数组。

POSIX 信号量接口如下所示。

连接到以及创建(可选)命名信号量

初始化信号量结构(在调用程序内部,因此不是命名信号量)

结束到打开信号量的连接

结束到打开信号量的连接,并在最后一个进程关闭此信号量时将其删除

销毁信号量结构(在调用程序内部,因此不是命名信号量)

将信号量的值复制到指定整数中

当其他进程拥有信号量时进行阻塞,或者当其他进程拥有信号量时返回错误

递增信号量计数

POSIX 共享内存

POSIX 共享内存实际上是映射内存的变体(请参见)。 二者的主要差异在于:

  • 打开共享内存对象应使用 ,而不是通过调用 。

  • 关闭和删除对象应使用 ,而不是通过调用 ,此调用不删除对象。

中的选项数实际上少于 中提供的选项数。

 

内存管理接口

应用程序通过多组接口使用虚拟内存功能。本节概述了这些接口,另外还提供了接口用法的示例。

创建和使用映射

可用于建立指定的文件系统对象到进程地址空间的映射。指定的文件系统对象也可部分映射到进程地址空间中。此基本内存管理接口非常简单。请使用 打开文件,接着使用 创建具有适当访问权限和共享选项的映射,随后再继续执行应用程序。

所建立的映射可针对指定的地址范围替换先前所有的映射。

标志 MAP_SHAREDMAP_PRIVATE 可指定映射的类型。必须指定一种映射类型。如果设置了 MAP_SHARED 标志,则写入操作会修改映射对象。无需对对象进一步执行任何操作即可进行更改。如果设置了 MAP_PRIVATE 标志,则首次对映射区域进行写入操作将创建一个页面副本。所有进一步的写入操作都会引用该副本。只有修改了的页面会被复制。

映射类型可以跨 保留。

通过 建立映射之后,将不再使用调用中所用的文件描述符。如果关闭文件,则映射在 将其撤消之前会一直保留。创建新映射可以替换现有映射。

通过 truncate 调用可以截短映射文件。尝试访问不再存在的文件区域会导致产生 SIGBUS 信号。

映射 /dev/zero 可为调用程序提供零填充的虚拟内存块。块的大小在调用 时指定。以下代码段说明了如何使用此技术在程序中创建零填充的存储块。块的地址由系统选择。

removed to fr.ch4/pl1.create.mapping.c

某些设备或文件仅当通过映射对其进行访问时才有用。用于支持位图显示的帧缓冲区设备便是此现象的一个示例。显示管理算法直接对显示地址执行操作时,实现这些算法会简单得多。

删除映射

可用于删除调用进程的指定地址范围内的所有页面映射。 对已映射的对象没有任何影响。

高速缓存控制

SunOS 中的虚拟内存系统是一个高速缓存系统,处理器内存可在其中缓冲文件系统对象中的数据。系统提供了一些接口,用于控制或询问高速缓存的状态。

使用 mincore

接口可确定内存页是否驻留在指定范围内的映射所涵盖的地址空间中。由于页面状态可能会在 mincore 检查页面之后和 mincore 返回数据之前发生更改,因此返回的信息可能会过时。只能保证将锁定的页面保留在内存中。

使用 mlockmunlock

会导致将指定地址范围内的页面锁定在物理内存中。在此进程或其他进程中引用锁定的页面不会导致需要 I/O 操作的页面错误。由于此 I/O 操作会干扰虚拟内存的正常操作,并且会降低其他进程的速度,因此仅有超级用户才能使用 mlock。内存中可锁定页数的限制取决于系统配置。如果超过此限制,则调用 mlock 将失败。

munlock 可用于释放对物理页的锁定。如果对单个映射的地址范围进行多次 mlock 调用,则一次 munlock 调用即可释放锁定。不过,如果 mlock 锁定了对相同页面的不同映射,则在释放对所有映射的锁定之前,不会解除对这些页面的锁定。

删除映射也会释放锁定,方法有两种:使用 操作替换或者通过 删除。

MAP_PRIVATE 映射关联的写复制事件会将对源页面的锁定传递到目标页面。这样,对包括 MAP_PRIVATE 映射的地址范围的锁定便会以透明方式与写复制重定向操作一起保留。有关此重定向操作的介绍,请参见。

使用 mlockallmunlockall

和 与 mlockmunlock 类似,但是 mlockallmunlockall 针对整个地址空间执行操作。mlockall 用于设置对地址空间中所有页面的锁定,munlockall 用于删除对该地址空间中所有页面的锁定,无论是通过 mlock 还是 mlockall 建立操作均如此。

使用 msync

会导致指定地址范围内的所有已修改的页面都刷新到这些地址所映射的对象。此命令与 类似,后者对文件执行操作。

阅读(2183) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~