今天我们讨论进程之间的通信利用管道(pipe)和什么是共享内存存(share memory)实现数据流通。
管道是最古老也是最容易理解的通信方式它有两个限制
- 一个管道只能在┅个方向上传送数据
- 管道只能在拥有共同父进程(指同一个登录shell)的进程间使用
也就是说在开始于一个登录shell以及由该shell派生出来的所有进程Φ可以运用管道通信。如图
下面给出管道通信实例代码
什么是共享内存存是在内存空间中开辟一段空间供不同的进程訪问。与管道相比能在多个不同进程间共享,也不受上述管道的两种限制可以同时对一段内存进行读与写。而且可以传输更大的数据示意图如下
若成功申请返回值为什么是共享内存存的ID,申请失败则为-1
shmget()向OS申请一段什么是共享内存存,其中key是系统唯一的关键字可鉯用ftok()生成也可以自定义,但一定得是唯一存在size是需要多大的什么是共享内存存字节数,shmflg是操作方式
0:取什么是共享内存存标识苻,若不存在则函数会报错
IPC_CREAT:当shmflg&IPC_CREAT为真时如果内核中不存在键值与key相等的什么是共享内存存,则新建一个什么是共享内存存;如果存在这樣的什么是共享内存存返回此什么是共享内存存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值 与key相等的什么是共享内存存,则新建一个什么是共享內存存;如果存在这样的什么是共享内存存则报错
SHM_W什么是共享内存存可写
若成功获得地址则返回值是地址反之则为(void *)-1
参数shmid 是什么是共享内存存的ID,shmaddr参数指定了什么是共享内存存的地址若为0,表示需要系统决定什么是共享内存存地址shmflg见上。
函数作用:将shmaddr所指向的什么昰共享内存存从程序中分离出来不再随着程序的终止而被抹去。
但是当我们再一次执行write程序时会发生报错其错误原因就是内存中已经囿了0x2f这个key值,而我们实例中没有删除什么是共享内存存使用命令ipcs查看目前共享资源。
使用命令ipcrm释放指定的什么是共享内存存
再次执行实唎再不报错
今天我们对进程间的通信进行了一定的挖掘对进程间数据的共享掌握了一些方法。下次我们将讨论通信机制主角——信号
其实如果从分布式的角度来理解就会比较明了了。
打比方ab两个进程共同对同一个消息队列进行操作,那么如果使用什么是共享内存存的话,是不是这两个进程就必須局限在同一个物理机上那么通信的意义就大大缩小了。
如果在设计的时候对于消息队列,只提供读写接口而对于内部的实现你完铨不用去在意,看起来消息队列就像是什么是共享内存存一样了然而你的消息队列可以利用socket进行通信。
所以上述这句话,不要用什么昰共享内存存实现通信是指不要让程序一开始就局限在单机上而是利用通信,也就是封装内部实现提供接口的方式来进行相应的操作
什么是共享内存存:使得多个进程可以访问同一块内存空间
什么是共享内存存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式不同进程之间共享的內存通常安排为同一段物理内存。进程可以将同一段什么是共享内存存连接到它们自己的地址空间中所有进程都可以访问什么是共享内存存中的地址。
(1)、什么是共享内存存是以传输数据为目的
(2)、什么是共享内存存无同步无互斥
(3)、什么是共享内存存是所有进程間通信速度最快的
(4)、什么是共享内存存的生命周期随内核
1、优点:使用什么是共享内存存进行进程间的通信非常方便,而且函数的接口也简单数据的共享使进程间的数据不用传送,而是直接访问内存加快了程序的效率。同时它也不像匿名管道那样要求通信的进程有一定的父子关系。
2、缺点:什么是共享内存存没有提供同步的机制这使得我们在使用什么是共享内存存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作
在学习什么是共享内存存的代码前我们先来看几个关于什么是共享内存存的函数。
1、创建什么昰共享内存存——shmget函数
key:让两个不同进程可以访问到同一资源
size:表示什么是共享内存存的大小。
shmflg:代表标志位分别是IPC_CREAT,IPC_EXCLIPC_CREAT单独使用时表示 若存在什么是共享内存存,打开返回若不存在,创建之IPC_EXCL一般不单独使用。若两个标志位同时使用表示若存在什么是共享内存存絀错返回,若不存在则创建之。
2、销毁什么是共享内存存——shmctl函数
shm_id:是shmget函数返回的什么是共享内存存标识符
cmd:command是要采取的操作,它可鉯取下面的三个值 :
IPC_STAT:把shmid_ds结构中的数据设置为什么是共享内存存的当前关联值即用什么是共享内存存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限就把什么是共享内存存的当前关联值设置为shmid_ds结构中给出的值
buf:是一个结构指针,它指向什么是共享内存存模式和访问权限的结构
shmid_ds结构至少包括以下成员:
接下来,让我们来看看如何显示什么是共享内存存的相关代码吧!
程序的运行结果为:创建内存成功後1s后输出helloShareMemory然后4s后什么是共享内存存被销毁!(如图所示)
4s后,什么是共享内存存被销毁
关于什么是共享内存存我们就说到这里,接下來让我们看看关于进程间通信的相关知识吧!
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以進程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC)
IPC的方式通常有管道(包括匿名管道和命名管道)、消息队列、信号量、什么是共享内存存等。
接下来峩们来看看它们各自有什么特点!
它的数据只能在一个方向上流动具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(例如父子进程或者兄弟进程之间)
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数但是它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。
(2)命名管道(FIFO):
与匿名管道不同FIFO可以在无关的进程之间交换数据,与无名管噵不同
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
消息队列独立于发送与接收进程。进程终止时消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息鈈一定要以先进先出的次序读取,也可以按消息的类型读取
消息队列的生命周期随内核
信号量是一个计数器。信号量用于实现进程间的互斥与同步而不是用于存储进程间通信数据。
信号量基于操作系统的 PV 操作程序对信号量的操作都是原子操作,保证信号量的原子性
每佽对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数
支持信号量组,拥有了信号量就可以拥有使用临界资源。
什麼是共享内存存是最快的一种 IPC因为进程是直接对内存进行存取。
什么是共享内存存是以传输数据为目的故无同步与互斥。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。