第七八讲Linux环境编程_befine.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
共享内存通信 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。 共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去。所有进程都可以访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会立刻被有访问同一段共享内存的其他进程看到。 共享内存通信 一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序效率。 由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 POSIX共享内存 mmap函数: mmap函数把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间。使用该函数有三个目的: 1.使用普通文件以提供内存映射I/O 2.使用特殊文件以提供匿名内存映射。 3.使用shm_open以提供无亲缘关系进程间的Posix共享内存区。 mmap 函数原形: #include sys/mman.h void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); addr 指向映射存储区的起始地址,通常将其设置为NULL,这表示由系统选择该映射区的起始地址。 length 映射的字节 prot 对映射存储区的保护要求, 可将prot参数指定为PROT_NONE,或者是PROT_READ(映射区可读),PROT_WRITE(映射区可写),PROT_EXEC(映射区可执行)任意组合的按位或,也可以是PROT_NONE(映射区不可访问)。对指定映射存储区的保护要求不能超过文件open模式访问权限。 flags flags标志位响映射区的多种属性: MAP_FIXED 返回值必须等于addr.因为这不利于可移植性,所以不鼓励使用此标志。 MAP_SHARED 这一标志说明了本进程对映射区所进行的存储操作的配置。此标志指定存储操作修改映射文件。 MAP_PRIVATE 本标志导致对映射区建立一个该映射文件的一个私有副本。所有后来对该映射区的引用都是引用该副本,而不是原始文件。 要注意的是必须指定MAP_FIXED或MAP_PRIVATE标志其中的一个,指定前者是对存储映射文件本身的一个操作,而后者是对其副本进行操作。 mmap成功返回后,fd参数可以关闭。该操作对于由mmap建立的映射关系没有影响。 fd 要被映射文件的描述符,在映射该文件到一个地址空间之前,先要打开该文件。 offset 要映射字节在文件中的起始偏移量,通常设置为0 若成功则返回映射区的起始地址,若出错则返回MAP_FAILED munmap 为从某个进程的地址空间删除一个映射关系,我们调用munmap. 函数2. 名称:: munmap 功能: 解除存储映射 头文件: #include 函数原形: int munmap(caddr_t addr,size_t len); 参数: addr 指向映射存储区的起始地址 len 映射的字节 返回值: 若成功则返回0,若出错则返回-1 其中addr参数是由mmap返回的地址,len是映射区的大小。再次访问这些地址导致向调用进程产生一个SIGSEGV信号。 如果被映射区是使用MAP_PRIVATE标志映射的,那么调用进程对它所作的变动都被丢弃掉。 内核的虚存算法保持内存映射文件(一般在硬盘上)与内存映射区(在内存中)的同步(前提它是MAP_SHARED内存区)。这就是说,如果我们修改了内存映射到某个文件的内存区中某个位置的内容,那么内核将在稍后某个时刻相应地更新文件。 msync 然而有时候我们希望确信硬盘上的文件内容与内存映射区中的文件内容一致,于是调用msync来执行这种同步。 函数3. 名称:: msync 功能: 同步文件到存储器 头文件: #include 函数原形: int msync(void *addr,size_t len,int flags); 参数: addr 指向映射存储区的起始地址 len 映射的字节 prot flags 返回值: 若成功则返回0,若出错则返回-1 其中addr和len参数通常指代内存中的整个内存映射区,不过也可以指定该内存区的一个子集。flags参数为MS_ASYNC(执行异步写),MS_SYNC(执行同步写),MS

文档评论(0)

xingyuxiaxiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档