https://blog.csdn.net/sunxiaopengsun/article/details/79869115

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

共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。它是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等函数可以实现该程序(流程和前边类似)。

linux 实现共享内存同步

本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.它是IPC对象的一种. 为了在多个进程间交换信息,内核专门留出了 ...

linux下查看mysql版本的四种方法

Linux查看MySQL版本的四种方法 1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select vers ...

关于windows线程同步的四种方法

#include "stdafx.h" #include "iostream" #include "list" #include &quot ...

Linux测试端口的连通性的四种方法

目录 1.telnet 2.ssh 3.crul 4.wget 方法一.telnet telnet为用户提供了在本地计算机上完成远程主机工作的能力,因此可以通过telnet来测试端口的连通性,具体用法 ...

Linux进程间通信—共享内存

五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...

linux 下共享内存

一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要 ...

【Linux】多线程同步的四种方式

背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include #include ...

linux下实现web数据同步的四种方式(性能比较)

实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享2.rsync +inotify实现web数据同步3.rsyn ...

实现web数据同步的四种方式

http://www.admin10000.com/document/6067.html 实现web数据同步的四种方式 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 ...

随机推荐

SharePoint 2013技巧分享系列 - 隐藏Blog和Apps左侧导航菜单

企业内部网中,不需要员工创建Blog或者创建,安装SharePoint应用,因此需要在员工个人Web页面需要隐藏Blog或者Apps导航菜单, 其步骤设置如下: 该技巧适合SharePoint 201 ...

一次更愚蠢的NOIP模拟赛

都可以从COGS上找到 纵横字谜(krizaljka) 时间限制: 1 Sec  内存限制: 32 MB 题目描述 给出两个单词,找到第一个相同的字母,然后第一个单词横数输出,第二个竖着输出形成十字形 ...

解决pageControl页面设置无效问题

废话不多说,先上代码 1.添加pageViewControl - (void)addPageControl { UIPageControl *pageControl = [[UIPageControl ...

Git基础 - git blame

当想知道一段代码历史上有哪些人修改时,可以使用git blame查看,正如其名,当你看到那段让你抓狂的代码时,一定想找出是谁写的来一顿blame吧 : ) 使用方法 icebug@localhost: ...

sublimetext3 安装php语法检测

打开控制台,install package 搜 sublimelinter 先安装sublimelinter本体 安装完以后再搜索一下,安装sublimelinter-php 接下来,打开prefer ...

DevExpress BarManager 部分用法

1.创建一个BarManager会默认产生三个菜单.BarManager右键ShowDesignTime enhancements会显示[add]按钮,可对菜单进行编辑. 2.其中比较有用的属性: 选 ...

Fedora20 编译安装qemu-system

安装简介: 1.1. 本次编译安装所有的操作都在Fedora 20 x86-64上,内核版本为: 3.14.4-200.fc20.x86_64.如果在其他系统编译安装,请看其他文章. 2.安装准备: ...

PostgreSQL的 initdb 源代码分析之十一

继续分析: /* Top level PG_VERSION is checked by bootstrapper, so make it first */ write_version_file(NUL ...

centos SSH配置详解

基本概念  linux自带的ssh为OpenSSH ssh协议提供两种用户认证方式  1. 基于口令的安全认证:使用用户名.密码的方式对登录用户进行认证 2. 基于密钥的安全认证:使用公钥和私钥对的方 ...

最近采用Instruments

最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

linux如何创建共享内存,linux实现共享内存同步的四种方法相关推荐

  1. 使用计算机的方法视频,怎么直接把电脑的视频共享给电视?巧用当贝市场,四种方法供你选...

    怎么直接把电脑的视频共享给电视?巧用当贝市场,四种方法供你选 2021年03月22日 21:13作者:网络编辑:王动 分享 近日,有用户问到如何直接把电脑的视频共享给电视?今天,小编就给大家带来了全网 ...

  2. linux怎么看mysql地址端口通不通_linux 测试端口通不通(四种方法)

    针对Linux系统:有1.2.3.4四种方法 针对Windows系统:有2.5两种通用方法 一般情况下使用"telnet ip port"判断端口通不通,其实测试方法不止这一种,还 ...

  3. linux 测试端口通不通(四种方法)

    针对Linux系统:有1.2.3.4四种方法 针对Windows系统:有2.5两种通用方法 一般情况下使用"telnet ip port"判断端口通不通,其实测试方法不止这一种,还 ...

  4. 测试windows到linux的端口,linux系统/Windows系统——测试端口通不通(四种方法)

    针对Linux系统:有1.2.3.4四种方法 针对Windows系统:有1.5两种通用方法 目录 针对Linux系统:有1.2.3.4四种方法针对Windows系统:有1.5两种通用方法 1.使用te ...

  5. Linux C++多线程同步的四种方式

    目录 一.互斥锁 二.条件变量 三.读写锁 原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通 ...

  6. photon四种同步方式_【Linux】多线程同步的四种方式

    背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include #include#include#include#include#include us ...

  7. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx

    linux下实现web数据同步的四种方式(性能比较)教程 实现web数据同步的四种方式=======================================1.nfs实现web数据共享2.rs ...

  8. linux下实现web数据同步的四种方式(性能比较)

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  9. linux:线程同步的5种方法

    linux:线程同步的5种方法 一.为什么要使用线程: 二.线程同步的5种方法 2.1 互斥量 2.2 读写锁 2.3 条件变量 2.4 自旋锁 2.5 屏障 一.为什么要使用线程: <1> ...

最新文章

  1. [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)
  2. 那些赞助世界杯的金主,正在变成赌徒
  3. Redis常用命令之操作Hash类型
  4. C 中的static关键字
  5. Fibonacci数列的幂和
  6. 移植opencv3.20到3556AV100
  7. 正反案例介绍SOLID原则
  8. 将Java 8流解析为SQL
  9. 【转】c#数字图像处理(一)Bitmap类、 Bitmapdata类和 Graphics类
  10. SQL SERVER 只有MDF文件的恢复
  11. Python模拟Linux/Mac OS工具grep和Windows工具findstr
  12. 广义表的存储结构算法c语言,广义表(一)
  13. EFK家族---Fluentd日志收集
  14. vue3子组件调用父组件的方法
  15. JBoss、Geronimo及Tomcat比较分析
  16. CCF-分蛋糕-Java
  17. 黑苹果 10G 网卡(intel Aquantia)解决方案及big sur 11.x 下驱动方式
  18. AKM的AK09918调试驱动过
  19. 位置在此计算机上运行程序灰色,Win10电脑中定位服务按钮灰色无法开启的2种解决方法...
  20. 微型计算机只要性能指标,微型计算机的主要性能指标运算速度.ppt

热门文章

  1. python与matlab比较_python和matlab如何选择?
  2. bzoj1041 [HAOI2008]圆上的整点 gcd
  3. 2017.3.18 每日小记
  4. python3 xpath_Python3使用xpath解析
  5. Unity Shader: Shader粒子广告牌
  6. android 四周发散阴影,view 添加四周阴影效果
  7. 在 Win10 中配置 Linux 开发环境
  8. 如和用Python获取今日头条上面三千美女图,且看教程
  9. 简单理解JSONP的定义及其实现
  10. 国内主流Android安卓应用市场简介