本文主要对实现共享内存同步的四种方法进行了介绍。

共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。它是IPC对象的一种。

为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。

同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情。由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等 。

信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制。信号灯包括posix有名信号灯、 posix基于内存的信号灯(无名信号灯)和System V信号灯(IPC对象)

方法一、利用POSIX有名信号灯实现共享内存的同步

有名信号量既可用于线程间的同步,又可用于进程间的同步。

两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进程读,利用两个有名信号量semr, semw。semr信号量控制能否读,初始化为0。 semw信号量控制能否写,初始为1。

读共享内存的程序示例代码如下

semr = sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
        if (semr == SEM_FAILED)
        {
                printf("errno=%d\n", errno);
                return -1;
        }

semw = sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
        if (semw == SEM_FAILED)
        {
                printf("errno=%d\n", errno);
                return -1;
        }

if ((shmid = shmget(key, MAXSIZE, 0666 | IPC_CREAT)) == -1)
        {
                perror("semget");
                exit(-1);
        }

if ((shmadd = (char *)shmat(shmid, NULL, 0)) == (char *)(-1))
        {
                perror("shmat");
                exit(-1);
        }

while (1)
        {
                em_wait(semr);
                printf("%s\n", shmadd);
                sem_post(semw); 
        }

写共享内存的程序示例代码如下

。。。。。。
        //同读的程序
        while (1)
        {
                sem_wait(semw);
                printf(">");
                fgets(shmadd, MAXSIZE, stdin);
                sem_post(semr); 
        }

方法二、利用POSIX无名信号灯实现共享内存的同步

POSIX无名信号量是基于内存的信号量,可以用于线程间同步也可以用于进程间同步。若实现进程间同步,需要在共享内存中来创建无名信号量。

因此,共享内存需要定义以下的结构体。

typedef struct
        {
                sem_t semr;
                sem_t semw;
                char buf[MAXSIZE];
        }SHM;

读、写程序流程如下图所示。

方法三、利用System V的信号灯实现共享内存的同步

System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯

System V 信号灯由内核维护,主要函数semget,semop,semctl 。

一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。 下标1代表能否写,初始为1。

程序流程如下:

写的流程和前边的类似。

方法四、利用信号实现共享内存的同步

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。利用信号也可以实现共享内存的同步。

思路:

reader和writer通过信号通信必须获取对方的进程号,可利用共享内存保存双方的进程号。

reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。

利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。

转载于:https://www.cnblogs.com/jkred369/p/7446895.html

linux 实现共享内存同步相关推荐

  1. linux如何创建共享内存,linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  2. linux查看共享内存max,浅析Linux的共享内存与tmpfs文件系统

    浅析Linux的共享内存与tmpfs文件系统 前言 共享内存主要用于进程间通信,Linux有两种共享内存(Shared Memory)机制: (1)** System V shared memory( ...

  3. linux存储--共享内存机制mmap(十二)

    mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采用指 ...

  4. linux存储--共享内存机制shm(十三)

    实现进程间通信最简单也是最直接的方法就是共享内存--为参与通信的多个进程在内存中开辟一个共享区.由于进程可以直接对共享内存进行读写操作,因此这种通信方式效率特别高,但其弱点是,它没有互斥机制,需要信号 ...

  5. linux存储--共享内存机制shm(十四)

    共享存储允许两个或多个进程共享一个给定的存储区,是进程间通信最快的一种方式. 不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问. 最简单的共享内存的使用流程 ①ftok函数生成键值 ...

  6. linux使用共享内存进行进程通信

    一.什么是共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常为同一段物理内存.使用共享内存进 ...

  7. 【Linux】Linux的共享内存

    实现进程间通信最简单也是最直接的方法就是共享内存--为参与通信的多个进程在内存中开辟一个共享区.由于进程可以直接对共享内存进行读写操作,因此这种通信方式效率特别高,但其弱点是,它没有互斥机制,需要信号 ...

  8. linux的共享内存,linux共享内存实际在哪里?

    我只想知道共享内存驻留在Linux系统中的位置?它在物理内存还是虚拟内存中?linux共享内存实际在哪里? 我知道有关进程的虚拟内存发送信箱,他们从不同的工艺处理和流程没有看到对方的记忆,但我们可以利 ...

  9. linux 查看共享内存最大值,linux上更改共享内存的最大值

    linux下更改共享内存的最大值 System V IPC 参数 名字 描述 合理取值 SHMMAX 最大共享内存段尺寸(字节) 最少若干兆(见文本) SHMMIN 最小共享内存段尺寸(字节) 1 S ...

最新文章

  1. Python List extend()方法
  2. HeadFirst设计模式(四) - 工厂模式之1 - 简单工厂
  3. 十年IT运维谈(二)“0”和“100”
  4. CentOS7安装wdCP面板,快速搭建web运行环境(图文详解)
  5. delphi 画 带箭头的线
  6. 多线程学习(二)----AfxBeginThread
  7. TFS2015的CI集成
  8. 数据结构---前序和中序遍历的二叉树序列还原二叉树
  9. 加州大学欧文分校 计算机专业,UCI的Computer Science「加州大学欧文分校计算机科学系」...
  10. linux下的文件及目录介绍
  11. pytorch: torch.Tensor.view ------ reshape
  12. 【名额有限】腾讯技术工程-运维技术沙龙
  13. 转:jQuery Ajax 实例 全解析
  14. 日志易数据接入之 Syslog 日志上传
  15. 基于python的图像识别
  16. 展辰涂料如何利用K2BPM加强流程管控?
  17. [VB.NET]vb.net如何捕捉摄相头的视频
  18. 声网 X 牛客网 200万场视频面试背后的实时互动技术支撑
  19. 脱壳之aspack压缩壳
  20. 从口号到行动,“软件业再出发”一步一脚印

热门文章

  1. 对注册表操作的REG函数
  2. ASP.NET 使用Ajax
  3. rhel6.3下使用openssl来生成CA证书并颁发证书实例解析
  4. 11月百度凤巢升级后的变化
  5. csrss.exe系统进程介绍
  6. vue 计算属性和data_Vue.js教程(五)--Vue的计算属性
  7. python爬虫循环表格xpath_python爬虫数据解析之xpath
  8. python3爬虫入门实例_10个python爬虫入门实例(小结)
  9. 数据科学入门与实战:玩转pandas之七数据透视
  10. 一个进程在执行过程中可以被中断事件打断_Linux操作系统:中断类型和中断的作用...