资料介绍
8.5.1 共享内存概述
可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的复制,从而大大提高了效率。当然,由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等(请参考本章的共享内存实验)。其原理示意图如图8.8所示。
图8.8 共享内存原理示意图
8.5.2 共享内存的应用
1.函数说明
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域,第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。除此之外,当然还有撤销映射的操作,其函数为shmdt()。这里就主要介绍这3个函数。
2.函数格式
表8.20列举了shmget()函数的语法要点。
表8.20 shmget()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型int shmget(key_t key, int size, int shmflg)
函数传入值key:共享内存的键值,多个进程可以通过它访问同一个共享内存,其中有个特殊值IPC_PRIVATE。它用于创建当前进程的私有共享内存
size:共享内存区大小
shmflg:同open()函数的权限位,也可以用八进制表示法
函数返回值成功:共享内存段标识符
出错:-1
表8.21列举了shmat()函数的语法要点。
表8.21 shmat()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型char *shmat(int shmid, const void *shmaddr, int shmflg)
函数传入值shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(若为0则表示系统自动分配地址并把该段共享内存映射到调用进程的地址空间)
shmflg SHM_RDONLY:共享内存只读
默认0:共享内存可读写
函数返回值成功:被映射的段地址
出错:-1
表8.22列举了shmdt()函数的语法要点。
表8.22 shmdt()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型int shmdt(const void *shmaddr)
函数传入值shmaddr:被映射的共享内存段地址
函数返回值成功:0
出错:-1
3.使用实例
该实例说明如何使用基本的共享内存函数。首先是创建一个共享内存区(采用的共享内存的键值为IPC_PRIVATE,是因为本实例中创建的共享内存是父子进程之间的共用部分),之后创建子进程,在父子两个进程中将共享内存分别映射到各自的进程地址空间之中。
父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之后往共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程一直等到共享内存的头部字符串为“WROTE”,然后将共享内存的有效数据(在父进程中用户输入的字符串)在屏幕上打印。父子两个进程在完成以上工作之后,分别解除与共享内存的映射关系。
最后在子进程中删除共享内存。因为共享内存自身并不提供同步机制,所以应该额外实现不同进程之间的同步(例如:信号量)。为了简单起见,在本实例中用标志字符串来实现非常简单的父子进程之间的同步。
可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的复制,从而大大提高了效率。当然,由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等(请参考本章的共享内存实验)。其原理示意图如图8.8所示。
图8.8 共享内存原理示意图
8.5.2 共享内存的应用
1.函数说明
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域,第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。除此之外,当然还有撤销映射的操作,其函数为shmdt()。这里就主要介绍这3个函数。
2.函数格式
表8.20列举了shmget()函数的语法要点。
表8.20 shmget()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型int shmget(key_t key, int size, int shmflg)
函数传入值key:共享内存的键值,多个进程可以通过它访问同一个共享内存,其中有个特殊值IPC_PRIVATE。它用于创建当前进程的私有共享内存
size:共享内存区大小
shmflg:同open()函数的权限位,也可以用八进制表示法
函数返回值成功:共享内存段标识符
出错:-1
表8.21列举了shmat()函数的语法要点。
表8.21 shmat()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型char *shmat(int shmid, const void *shmaddr, int shmflg)
函数传入值shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(若为0则表示系统自动分配地址并把该段共享内存映射到调用进程的地址空间)
shmflg SHM_RDONLY:共享内存只读
默认0:共享内存可读写
函数返回值成功:被映射的段地址
出错:-1
表8.22列举了shmdt()函数的语法要点。
表8.22 shmdt()函数语法要点
所需头文件#include 《sys/types.h》
#include 《sys/ipc.h》
#include 《sys/shm.h》
函数原型int shmdt(const void *shmaddr)
函数传入值shmaddr:被映射的共享内存段地址
函数返回值成功:0
出错:-1
3.使用实例
该实例说明如何使用基本的共享内存函数。首先是创建一个共享内存区(采用的共享内存的键值为IPC_PRIVATE,是因为本实例中创建的共享内存是父子进程之间的共用部分),之后创建子进程,在父子两个进程中将共享内存分别映射到各自的进程地址空间之中。
父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之后往共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程一直等到共享内存的头部字符串为“WROTE”,然后将共享内存的有效数据(在父进程中用户输入的字符串)在屏幕上打印。父子两个进程在完成以上工作之后,分别解除与共享内存的映射关系。
最后在子进程中删除共享内存。因为共享内存自身并不提供同步机制,所以应该额外实现不同进程之间的同步(例如:信号量)。为了简单起见,在本实例中用标志字符串来实现非常简单的父子进程之间的同步。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 谈谈嵌入式系统中多进程设计与进程通信
- 嵌入式Linux进程 -进程间通信
- Glibc内存管理之Ptmalloc2源代码分析 23次下载
- 串口通信之读取与发送及LabView文件下载 179次下载
- 鸿蒙内核源码分析:进程是内核的资源管理单元 23次下载
- TD-SCDMA无线通信技术的演变进程与其他技术比较和系统结构介绍 21次下载
- 如何设置代码编写器Studio集成开发环境(IDE)来调试共享内存系统 1次下载
- 共享内存的无人车进程消息异步传输 0次下载
- linux操作系统下的进程通信 0次下载
- 进程间通信之Linux下进程间通信概述 0次下载
- 进程间通信之使用信号详解 0次下载
- 进程间通信之信号量浅析 0次下载
- 进程间通信之:管道 0次下载
- μClinux内存管理分析
- 理解并使用共享内存
- 内存共享原理解析 980次阅读
- 线程是什么的基本单位 进程与线程的本质区别 622次阅读
- EC SRAM映射到CPU Memory空间的共享内存设计 1231次阅读
- 使用Rust语言的WinAPI模块来实现共享内存 1672次阅读
- 程序中进程和线程的区别 519次阅读
- Linux应用开发之共享内存 336次阅读
- 虚拟内存的那点事儿 642次阅读
- 进程间通信的实现方式 696次阅读
- Linux进程间通信方法之管道 1820次阅读
- Linux进程的内存消耗和泄漏详解 2597次阅读
- Linux:测试进程占用的虚拟内存大小 2762次阅读
- 虚拟机:查看进程内存和CPU占用的方法 8242次阅读
- 共享内存IPC原理,Linux进程间如何共享内存? 8505次阅读
- 基于linux的进程通信设计方案 495次阅读
- 进程间与线程间的通信方式 8817次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多