Linux下共享内存同步方法 同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情。由于多 个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等 。 信号量(semaphore),它是不同进程间或一个给定进程内部不同线程间同步的机制。信号量包 括:posix有名信号量、 posix基于内存的信号量(无名信号量) 和 System V信号量(IPC对象)。【文章福利】小编推荐自己的Linux内核源码交流群:【】整理了一些个人觉得比较好的Linux相关学习书籍、Linux内核视频资料共享在群里面,有需要的可以自行添加哦!!!前50名可进群领取,并额外赠送一份价值600的内核资料包(含视频教程、电子书、实战项目及代码)!
Linux内核课程示例 学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 方法一:利用POSIX有名信号量实现共享内存的同步 有名信号量既可用于线程间的同步,又可用于进程间的同步。 两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进 程读,利用两个有名信号量“semr”, “semw”。semr信号量控制能否读,初始化为0。 semw信号量 控制能否写,初始为1。 “semr”加1后才会继续运行。而写程序,由于刚开始的写信号量初始化为1,此时写信号量“semw” 在执行“sem_wait”后会减1。因此会直接执行写操作后,给读信号量“semr”加1,出发读程序继续往 下进行。 读共享内存的程序示例代码如下: 写共享内存的程序示例代码如下: 方法二:利用POSIX无名信号量实现共享内存的同步 POSIX无名信号量是基于内存的信号量,可以用于线程间同步也可以用于进程间同步。若实 现进程间同步,需要在共享内存中来创建无名信号量。因此,共享内存需要定义以下的结构体。 即在互相访问共享内存中数据的时候,查询信号量的状态来进行同步。这种方法并不太方便 ,使用方式与下面介绍的利用互斥锁的机制差不多。 读、写程序流程如下图所示:
方法三:利用System V的信号灯实现共享内存的同步 System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号 灯。而Posix信号灯指的是单个计数信号灯。 System V 信号灯由内核维护,主要函数semget,semop,semctl 。 一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。 下 标1代表能否写,初始为1。 程序流程如下:
方法四:利用信号实现共享内存的同步 思路: reader和writer通过信号通信必须对方的进程号,可利用共享内存保存双方的进程号。reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。 利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。 方法五:利用互斥锁实现共享内存的同步 这种方法与方法二差不多,需要在访问共享内存中数据的时候,查询互斥锁的状态来进行同步。 sm_common.h文件 sm_server.c文件 sm_client.c文件 使用方法:打开终端1,运行服务端:https://zhuanlan.zhihu.com/p/sm_server打开终端2,运行客户端:https://zhuanlan.zhihu.com/p/sm_client在终端2输入字符串,在终端1可看到相应输出 精彩推荐: 好家伙!原来Linux内核中的硬中断就是这样的! 剖析块设备中的request层 浅谈块设备层——BIO层 Linux虚拟化KVM-Qemu分析——ioeventfd与irqfd 分析Linux内核对象——kobject和sysfs2022秋招提前批就业指导课|大厂面试|简历梳理|offer选择|技术方向指导_哔哩哔哩_bilibili 内核技术中文网 – 构建全国最权威的内核技术交流分享论坛 原文参考:Linux下共享内存同步方法 (版权归原作者所有,侵删)
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/55067.html