首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

进程间通信—管道,共享内存,消息队列,信号量

进程间通信的本质就是让不同的进程能够看到同一份资源。常见的system V结构的通信方式有如下几种:共享内存、消息队列、信号量。...保护该共享资源的代码叫做临界区,该被保护的共享资源叫做临界资源,信号量就是用来保护临界资源信号量模型信号量结构体struct semaphore{ int value; pointer_PCB queue...ipc_perm类型的结构体,这点与共享内存和消息队列无差异信号量集函数semget函数用于创建和访问⼀个信号量集函数原型如下:int semget(key_t key, int nsems, int...semflg);第一个参数key与共享内存的key一样,由ftok函数返回给出,用于标定唯一性第二个参数nsems表示创建信号量的个数第三个参数semflg和共享内存那里的使用无差别返回值:调用成功时,...V系列进程间通信的学习,可以发现共享内存、消息队列以及信号量,虽然它们内部的属性差别很大,但是维护它们的数据结构的第一个成员确实一样的,都是ipc_perm类型的成员变量。

2K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    简明linux系统编程--共享内存&消息队列&信号量

    1.父子进程共享内存 1.1基本说明 共享进程就是多个进程都可以使用的,但是为了不影响进程的连续性,我们的系统会把这个共享的内存映射到每一个独立的进程空间里面去; 按照下面的这个图进行理解,我们的这个共享内存会映射到这个...AB里面各一份,AB是两个各自独立的进程,这个时候,AB对于映射到自己进程的这个小的空间进行操作就是相当于对于这个大的共享内存进行操作; 1.2主要步骤 其实整个列成只需要4个步骤: 建立共享内存, 把共享内存映射到...就是指的当我们创建共享内存单元的时候,如果这个共享内存单元不存在,我们就创建,已经存在的话,我们就尝试去访问打开这个共享内存; 1.4函数返回值 返回的就是应用层的共享内存的描述符,就是上面说到的这个identifier...就是一个进程等待; 2.非亲缘关系的进程的共享内存通信 2.1和上面的区别 上面的这个是父子进程,两个是有亲缘关系的,但是这个时候我们的两个进程是完全独立运行的,两个之间没有任何的关系; 2.2如何通信...共享内存和消息队列都是进行这个数据的传输的,一个资源想要被多个进程访问,就是进行同步,信号量就是进行任务之间的同步; 信号量就是一个整数值,A访问资源的时候,检查信号量是不是大于0,B进程也想要访问这个内存

    9710

    【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    3.如何进行通信? 1. 如何进行进程间通信这个问题不是我们要考虑的,而是十多年前的大佬们需要考虑的问题,我们能够做的就是站在巨人的肩膀上学习。 2....,他还有许许多多的模块,比如终端处理,以及我们现在所学的通信模块,如果提供的是一大块内存,我们称之为共享内存通信机制,如果是一个计数器,我们称为信号量的机制,如果是一个队列,我们称为消息队列的机制。...命名管道是如何实现IPC的呢?...实现进程间通信的第一个前提就是如何让不同的进程看到同一份资源,匿名管道我们是通过子进程继承父进程打开的资源,命名管道是通过两个进程都打开具有唯一性标识的命名管道文件,而共享内存其实是通过OS创建一块shm...下面我们再说一下,如何查看IPC资源,通过ipcs -m/q/s就可以看到共享内存,消息队列,信号量等IPC资源的使用情况了,如果要删除某一申请的资源,可以通过指令ipcrm -m/q/s +上层用的id

    1.5K40

    nginx共享内存:共享内存的实现

    nginx中, 作者为我们提供了方便共享内存的使用的接口,关于共享内存的使用在我之前的文章中有介绍。这次我们来研究一下nginx是如何实现的。...而ngx_shared_memory_add不会马上创建一个共享内存,它是先登记一下共享内存的使用信息,比如名称、大小等,然后在进程初始化的时候再进行共享内存的创建与初始化。...,就会创建共享内存了,我们来看看它是如何做的,初始化工作是在ngx_init_cycle这个函数里面做的,这里我们只看进行共享内存初始化的代码: ngx_cycle_t * ngx_init_cycle...我们看到,在对每一个共享内存,先调用ngx_shm_alloc创建共享内存,然后调用ngx_init_zone_pool对共享内存进行初始化,然后调用我们自己添加的共享内存init函数。...ngx_init_zone_pool函数会对共享内存进行slab的初始化,之后,我们就可以通过slab进行共享内存的管理了。

    4.6K30

    【Linux】system V进程间通信——共享内存、消息队列、信号量

    system V IPC提供的通信方式有三种: 共享内存、消息队列、信号量;并且生命周期是随OS的,而不是随进程的,这是所有System V进程间通信的共性` 一、共享内存 1.共享内存的基本原理...共享内存让不同的进程看到同一份的资源就是在物理内存上申请一块内存空间,如何将创建好的内存分别与各个进程的页表之间建立映射,然后在虚拟地址空间中将虚拟地址填充到各自页表的对应位置,建立起物理地址与虚拟地址的联系...OS申请的,自然要做管理,共享内存也是如此,如何管理:先描述,在组织。所以共享内存=物理内存块+共享内存的相关属性。...nsems:表示创建信号量的个数 第三个参数,与创建共享内存时使用的shmget函数的第三个参数相同。...OS如何管理:先描述,在组织,对相关资源的内核数据结构做管理,对于共享内存、消息队列、信号量的第一个成员都是ipc_perm: struct ipc_perm {

    36420

    【说站】php信号量和共享内存分别是什么

    php信号量和共享内存分别是什么 说明 1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作。 一个过程获得一个信号,必须被过程释放。...2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问。 在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号。...实例 echo "parent progress pid:{$parentPid}\n"; $childList = array();   // 创建共享内存,创建信号量,定义共享key $shm_id...childPid = pcntl_wait($status);     if ($childPid > 0){         unset($childList[$childPid]);     } } // 释放共享内存与信号量...\n"; 以上就是php信号量和共享内存的介绍,希望对大家有所帮助。更多php学习指路:php教程 推荐操作系统:windows7系统、PHP5.6、DELL G3电脑 收藏 | 0点赞 | 0打赏

    35920

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    共享内存不是简单的一段内存空间,它也要有描述并管理共享内存的数据结构和匹配算法。 共享内存函数 shmget 函数 该函数是系统调用,操作系统提供系统调用,让我们创建共享内存。...共享内存的释放 共享内存不随着进程的结束而自动释放,需要我们手动释放(指令或者其他系统调用),否则会一直存在,直到系统重启。 共享内存的生命周期随内核,文件的生命周期随进程。 如何释放?...:共享内存不提供对共享内存的任何保护机制。...如果要发消息队列的数据,用 如果要接收数据,用 要查消息队列就用 ipcs -q ,它的指令跟共享内存就一字之差 system V信号量 信号量主要用于同步和互斥的。...看电影时,只要有了票,位置就一定是你的,而不是谁先坐到就是谁的。 所以成功申请了信号量,即使不访问共享资源,也会留着一部分资源给你。 这里的信号量也叫多元信号量。

    22810

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    共享内存区是最快的IPC形式。...共享内存不是简单的一段内存空间,它也要有描述并管理共享内存的数据结构和匹配算法。 共享内存函数 shmget 函数 该函数是系统调用,操作系统提供系统调用,让我们创建共享内存。...共享内存的释放 共享内存不随着进程的结束而自动释放,需要我们手动释放(指令或者其他系统调用),否则会一直存在,直到系统重启。 共享内存的生命周期随内核,文件的生命周期随进程。...可以获取共享内存的属性,传IPC_RMID可以删除共享内存。...如果要发消息队列的数据,用: 如果要接收数据,用: 要查消息队列就用 ipcs -q ,它的指令跟共享内存就一字之差 system V信号量 信号量主要用于同步和互斥的。

    18210

    php共享内存,php共享内存的使用

    (1).基本的写入(a.php)//(1.1).创建一个IPC通信专用的KEY$shm_key = ftok(__FILE__, 't');//(1.2).创建或者打开共享内存块,创建1KB$shmop...$shmop) {    throw new Exception('创建共享内存失败');}//(1.3).向内存写入数据$text = 'A:大家好,我是A进程,我创建的内存空间啊,欢迎大家一起来耍啊...)shmop_close($shmop);//(1.5).输出共享内存块的系统ID,我的是1948581891,php打印的是int值,底层用的16进制echo dechex($shm_key) . ...PHP_EOL;//(2.3).删除共享内存.不需要close.直接删除shmop_delete($shmop);(3).注意事项通过ipcs -m 命令可以查看已经创建的共享内存通过ipcrm -M...key 命令可以删除通过shm_key创建的共享内存共享内存不会因为进程退出而丢失,会一直存在系统中,除非删除它

    95630

    【Linux】进程间通信>管道&&共享内存&&消息队列&&信号量详解

    System V IPC System V 消息队列 System V 共享内存 System V 信号量 1.3.3 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量...共享内存区是最快的IPC形式。...一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 3.1 共享内存示意图 3.2 共享内存数据结构 struct...:由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值) buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值:成功返回0;失败返回-1 3.4...在进程中涉及到互斥资源的程序段叫临界区 特性方面 IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 7.OS管理 操作系统如何把共享内存,消息队列,信号量统一管理起来

    18410

    Linux 进程间如何共享内存?

    导读 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。...共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: ?...共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。...); 共享内存在父子进程间遵循的约定 1.使用 fork() 函数创建一个子进程后,该进程继承父亲进程挂载的共享内存。...2.如果调用 exec() 执行一个新的程序,则所有挂载的共享内存将被自动卸载。 3.如果在某个进程中调用了 exit() 函数,所有挂载的共享内存将与当前进程脱离关系。

    8.4K21

    Linux之进程间通信——system V(共享内存、消息队列、信号量等)

    size:共享内存的大小 key:共享内存的唯一性标识,保证进程看到同一份共享内存。如何形成key?用ftok。...多进程访问一份临界资源的情况属于少数情况,大部分情况下进程都是申请自己独立的资源,不访问公共资源的代码就是非临界区。 为了避免数据不一致的问题,我们需要对公共资源进行保护,那么该如何保护呢?...4.信号量的相关函数 semget:申请信号量 参数 key:使用ftok函数生成的key值,可以唯一表示共享内存; nsems:表示创建信号量的个数; semflg:与穿个件共享内存时使用的shmget...semctl:信号量的删除 semop:信号量的操作 六、总结 我们发现:共享内存、消息队列、信号量的接口相似度都很高(参数很多都是相同的),获取和删除都是system V标准的进程间通信的操作。...OS的管理本质都是 先描述,再组织,对于共享内存、消息队列、信号量等的第一个成员都是结构体ipc_perm的变量。

    35120

    Linux之进程间通信——system V(共享内存、消息队列、信号量等)

    size:共享内存的大小 key:共享内存的唯一性标识,保证进程看到同一份共享内存。如何形成key?用ftok。...多进程访问一份临界资源的情况属于少数情况,大部分情况下进程都是申请自己独立的资源,不访问公共资源的代码就是非临界区。 为了避免数据不一致的问题,我们需要对公共资源进行保护,那么该如何保护呢?...4.信号量的相关函数 semget:申请信号量 参数 key:使用ftok函数生成的key值,可以唯一表示共享内存; nsems:表示创建信号量的个数; semflg:与穿个件共享内存时使用的shmget...semctl:信号量的删除 semop:信号量的操作 六、总结 我们发现:共享内存、消息队列、信号量的接口相似度都很高(参数很多都是相同的),获取和删除都是system V标准的进程间通信的操作。...OS的管理本质都是 先描述,再组织,对于共享内存、消息队列、信号量等的第一个成员都是结构体ipc_perm的变量。

    56320

    Postgresql源码(91)POSIX匿名信号量初始化与使用流程总结

    总结 Postgresql使用匿名信号量完成进程间的一些同步操作。 匿名信号量由父进程创建在mmap的共享内存内,通过血缘关系继承给子进程,子进程从共享内存中获取信号量数据结构直接使用即可。...Postgresql的信号量分配比较简单,每一个进程拥有一个自己的信号量。初始化后值为1,表示未锁定状态。 加锁后信号量=0。 解锁后信号量=1。...Postgresql的信号量初始化使用的是POSIX接口(SYSTEM V)中的匿名信号量(命名信号量)。 struct PGPROC { ... PGSemaphore sem; ......| -------- 是否共享,如果是需要在共享内存中获取newsem }; | | v v v----...将一个 POSIX 未命名信号量与动态分配的内存对象关联起来更加简单:只需要将信号量嵌入到对象中即可。

    42420

    如何解决node进程间共享内存

    : 映射一段可以被不同内存访问的地址块 为何采用shared memory帮助node共享内存 分析我们的业务场景,其实就是某一进程得到数据缓存到内存,然后其他进程可以无视跨进程读取缓存的数据块,说一shared...memory是最适合的实用场景 如何使用shared memory 快速解决问题 node本身是不支持shared memeory这种底层操作的,我必须借助底层语言的能力去实现,然后通过ffi调用。...为了避免自己实现原剩代码操作内存,我们需要借助一些三方成熟的包 所以我们需要完成以下三个事情 选择一门系统语言 寻找一个成熟的三方包共享内存 寻找ffi工具快速完成 这里系统语言我选择rust,...进行共享内存 采用成熟的neon进行ffi模块编写 项目实施 使用neon脚手架搭建项目 neon new cache-machine ---》 创建项目 neon build ---》编译项目 node...多线程安全的共享内存 TODO

    2.8K10

    共享内存删除的陷阱

    当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。...但是共享段内存依然存在,只有 shm_attch 为 0 后,即没有任何进程再使用该共享内存区,共享内存区才在内核中被删除。一般来说,当一个进程终止时,它所附加的共享内存区都会自动脱离。...IPC_SET 如果进程有相应的权限,将与共享内存相关联的值设置为shmid_ds数据结构中所提供的值。 IPC_RMID 删除共享内存段。...如果共享内存已经与所有访问它的进程断开了连接,则调用IPC_RMID子命令后,系统将立即删除共享内存的标识符,并删除该共享内存区,以及所有相关的数据结构; 如果仍有别的进程与该共享内存保持连接,则调用IPC_RMID...需要说明的是:一旦通过shmctl对共享内存进行了删除操作,则该共享内存将不能再接受任何新的连接,即使它依然存在于系统中!

    1.4K20

    linux 编程常用的进程间通信方式:互斥锁和条件变量、共享内存和信号量

    本文介绍常见的进程间通信方式,分为互斥锁和条件变量,共享内存和信号量两部分,并分别给出样例使用方式和运行结果: 一、互斥锁和条件变量 1....共享内存和信号量的使用有以下几点需要注意: 无论是共享内存还是信号量,创建与初始化都遵循同样流程,通过ftok得到key,通过xxxget创建对象并 生成id; 生产者和消费者都通过shmat将共享内存映射到各自的内存空间...,在不同的进程里面映射的位置不同; 为了访问共享内存,需要信号量进行保护,信号量需要通过semctl初始化为某个值; 接下来生产者和消费者要通过semop(-1)来竞争信号量,如果生产者抢到信号量则写入...producer中让用户输入几个整数,并将输入的整数保存到共享内存中,然后consumer从共享内存中读取整数相加产生结果。这里的信号量只设定为1,起到了互斥锁的作用。...实际运行结果如下: image.png 使用ipcs命令可以查看到我们创建的共享内存和信号量: image.png 三、在使用锁时,需要注意不要产生死锁 1.

    2.5K80

    Linux的内存初始化

    看了很多关于linux内存管理的文章还是云里雾里,听了很多关于linux内存管理的课程还是一头雾水。...本着对内存深度剖析的态度,希望以版本kernel-4.14,架构AARCH64为专题做个内存管理的架构性整理。 这篇文章我们先来看下linux在启动过程中的初始化。...注意:如果想要在伙伴系统初始化之前进行设备寄存器的访问,那么可以考虑early IO remap机制。 至此我们已经知道dtb和early ioremap都是在fixmap区的,如下图: ?...系统内存的布局: 完成dtb的map之后,内核可以访问这一段的内存了,通过解析dtb中的内容,内核可以勾勒出整个内存布局的情况,为后续内存管理初始化奠定基础。...完成: 通过上面的一系列操作,需要动态管理的内存已经被放到了memory type和reserved type这两个region中了,现在内存已经被memblock模块所管理了,这只是启动后的第一步,后续内存才会加入到伙伴系统去管理

    2.9K21
    领券