进程通信-共享内存 共享内存 共享内存允许两个或多个进程共享一给定的存储 因为数据不需要来回复制, 区,因为数据不需要来回复制,所以是最快的一 种进程间通信机制。( 。(对于像管道和消息队列等 种进程间通信机制。(对于像管道和消息队列等 通信方式, 通信方式,则需要在内核和用户空间进行四次的 数据拷贝,而共享内存则只拷贝两次数据: 数据拷贝,而共享内存则只拷贝两次数据:一次 从输入文件到共享内存区, 从输入文件到共享内存区,另一次从共享内存区 到输出文件。) 到输出文件。) 进程间需要共享的数据被放在一个叫做IPC共享 进程间需要共享的数据被放在一个叫做IPC共享 内存区域的地方, 内存区域的地方,所有需要访问该共享区域的进 程都要把该共享区域映射到本进程的地址空间中 去。 共享内存 进程之间在共享内存时, 进程之间在共享内存时,并不总是读写少量数据后就 解除映射,有新的通信时, 解除映射,有新的通信时,再重新建立共享内存区域 而是保持共享区域,直到通信完毕为止,这样, 。而是保持共享区域,直到通信完毕为止,这样,数 据内容一直保存在共享内存中,并没有写回文件。共 据内容一直保存在共享内存中,并没有写回文件。 享内存中的内容往往是在解除映射时才写回文件的。 享内存中的内容往往是在解除映射时才写回文件的。 因此,采用共享内存的通信方式效率是非常高的。 因此,采用共享内存的通信方式效率是非常高的。 由于多个进程共享同一块内存区域,必然需要某种同 由于多个进程共享同一块内存区域, 步机制,互斥锁和信号量都可以( 步机制,互斥锁和信号量都可以(进程使用临界资源 需要同步) 需要同步)。 共享内存 System V要使用共享内存,应该有如下步骤: 要使用共享内存, 要使用共享内存 应该有如下步骤: 1.开辟一块共享内存 shmget() 开辟一块共享内存 2.允许本进程使用某块共享内存 shmat() 允许本进程使用某块共享内存 3.数据写入 读出 数据写入/读出 数据写入 4.禁止本进程使用这块共享内存 shmdt() 禁止本进程使用这块共享内存 5.删除这块共享内存 shmctl()或者命令行 删除这块共享内存 或者命令行 下ipcrm。 。 相关系统调用: 相关系统调用: 需要的头文件: 需要的头文件: #include #include (1)函数原型: )函数原型: int shmget( key_t shmkey , int shmsiz , int flag ); 作用: 是用来开辟/指向一块共享内存的函数 作用:shmget()是用来开辟 指向一块共享内存的函数 是用来开辟 。 参数定义如下: 参数定义如下: key_t shmkey 是这块共享内存的标识符。