System V信号量 vs. POSIX信号量:核心区别与选型指南

最近在学习linux系统编程的章节,接触到了两种信号量,所以专门研究了二者的区别,将二者的对比记录于此。

在Linux多线程/进程开发中,信号量是解决同步问题的核心工具之一。System V和POSIX是两种主流的实现方式,它们的区别直接影响开发效率和性能。以下是两者的关键差异总结:


一、底层实现机制

特性 System V信号量 POSIX信号量
内核依赖 由内核维护,生命周期与进程无关 分为两种:
• 有名信号量(内核维护,文件关联)
• 无名信号量(进程内存维护)
持久性 显式删除前永久存在(需semctl(IPC_RMID) 无名信号量随进程消亡;有名信号量需手动删除

二、API设计对比

操作类型 System V函数 POSIX函数
初始化 semget() + semctl(SETVAL) 两步操作 无名:sem_init()
有名:sem_open()
PV操作 semop()(支持原子批量操作) sem_wait()(阻塞)
sem_post()(释放)
错误处理 通过全局变量errno判断 函数直接返回错误码(如EAGAIN

三、适用场景差异

场景 推荐方案 原因
跨进程复杂同步 System V信号量集(支持多信号量原子操作) 可同时操作多个信号量,避免死锁
线程间轻量级同步 POSIX无名信号量(sem_init 基于内存,无内核开销,性能更高
简单进程间同步 POSIX有名信号量(sem_open API更简洁,兼容现代编程规范

四、功能特性对比

特性 System V POSIX
信号量集合 ️ 支持多信号量集合(如semget( ,5) 仅支持单个信号量操作
超时机制 需自定义实现 sem_timedwait()支持超时等待
信号量值范围 无明确限制(内核参数约束) 无名信号量通常限制为32位整数

五、性能实测数据(参考)

  • 10万次PV操作耗时(i7-12700H,Ubuntu 22.04):

    • System V信号量:~85ms(需频繁内核切换)
    • POSIX无名信号量:~12ms(用户态原子操作)
    • POSIX有名信号量:~45ms(涉及文件系统路径解析)

六、选型建议

  1. 优先POSIX的场景:

    • 需要兼容C++11以上标准(如std::counting_semaphore
    • 线程间同步或简单进程同步(如共享内存计数器)
    • 对性能要求苛刻(如高频交易系统)
  2. 坚持System V的场景:

    • 需要同时操作多个信号量(如银行转账需原子锁账户和余额)
    • 旧系统兼容性要求(如CentOS 6遗留系统)

附:典型代码片段

System V信号量集初始化

key_t key = ftok("/tmp", 'S');
int semid = semget(key, 3, 0666 | IPC_CREAT); // 创建3个信号量
union semun arg;
arg.array = (unsigned short[]){1, 1, 1};
semctl(semid, 0, SETALL, arg); // 全部初始化为1

POSIX有名信号量

sem_t *sem = sem_open("/mysem", O_CREAT, 0666, 1);
sem_wait(sem); // P操作
// 临界区操作
sem_post(sem); // V操作
sem_close(sem);
sem_unlink("/mysem"); // 删除内核对象

总结:POSIX信号量是现代开发的首选,但System V在复杂进程同步中仍有不可替代性。选择时需权衡性能、功能需求及系统兼容性。

System V信号量 vs. POSIX信号量:核心区别与选型指南的更多相关文章

  1. system V信号量和Posix信号量

    一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...

  2. 五十一、进程间通信——System V IPC 之进程信号量

    51.1 进程信号量 51.1.1 信号量 本质上就是共享资源的数目,用来控制对共享资源的访问 用于进程间的互斥和同步 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对所有信 ...

  3. system v共享内存与信号量综合

    ipc.h #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include < ...

  4. 第三十三章 System V共享内存与信号量综合

    用信号量解决生产者.消费者问题 实现shmfifo ip.h #ifndef _IPC_H #define _IPC_H #include <unistd.h> #include < ...

  5. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  6. Linux进程通信 之 信号灯(semphore)(System V && POSIX)

    一. 信号灯简介 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制. 相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程 也可以修改该标志.除了用于访 ...

  7. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  8. linux Posix 信号量 二

    一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共 ...

  9. 多线程编程之Apue3rd_Chapter15.10之posix信号量

    看了APUE的chapter15,只重点看了15.10,学习了posix信号量.Posix信号量比起xsi信号量的优点是性能更好,在Linux3.2.0平台上性能提升很大.其中命名信号量使用方法如下. ...

  10. System V IPC

    1.概述 System V IPC共有三种类型:System V消息队列.System V 信号量.System V 共享内存区. System V IPC操作函数如下: 2.key_t键和ftok函 ...

随机推荐

  1. WPF Play Image slider animation using Storyboard

    using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...

  2. UML的9种常用图与建模工具详解

    UML即Unified Model Language,是一种建模语言,也是标准建模语言.在软件开发中,当系统规模比较复杂时,需要用图形抽象地来表达复杂的概念,让整个软件设计更具有可读性,可理解性,以便 ...

  3. biancheng-Spring MVC-HandlerMapping

    一.HandlerMapping 作用是根据当前请求的找到对应的 Handler,并将 Handler(执行程序)与一堆 HandlerInterceptor(拦截器)封装到 HandlerExecu ...

  4. Loadrunner11压测场景时最多跑5000个Vuser的问题解决办法

    当我在用Loadrunner11压测场景时,设置Start Vusers是10000个.但实际运行是发现大约跑到5000个左右,后面的基本都是异常.如图: 查看Vusers运行详情: Error... ...

  5. 第11章 其他 XML 技术

    第11章 其他 XML 技术 概述 System.Xml 命名空间由以下命名空间和核心类型构成: ​System.Xml.*​ ​XmlReader​ 和 XmlWriter​:高性能.前向读写的 X ...

  6. DeepSeek 不再卡顿,从此告别服务器繁忙,请稍后再试(建议收藏!)

    大家好,我是六哥. 由于DeepSeek真的太火了,也许你也跟我一样,常会遇到这样的情况: 真的让人抓狂,10条回复里常常有9条是"服务器blabla,请稍后重试",看到这话,就问 ...

  7. Deepseek学习随笔(7)--- 构建私人知识库(附网盘链接)

    Step 1:创建知识库 入口定位 登录 DeepSeek 控制台 → 左侧导航栏点击「知识库」→ 点击「新建知识库」按钮 基础设置 知识库名称:建议使用「领域+用途」命名法,如「医疗-糖尿病文献库」 ...

  8. Linux - centos6忘记root密码怎么办?

    Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下 1.开机按esc   2 ...

  9. 机器学习 | 强化学习(4) | 无模型控制(Model-Free Control)

    无模型控制(Model-Free Control) 无模型预测概论 上一节课: 无模型预测 用于估计一个未知马尔科夫决策过程的价值函数 这节课 无模型控制 最优化一个未知马尔科夫决策过程的价值函数 一 ...

  10. form-create-designer中怎么扩展自定义组件

    form-create-designer中怎么扩展自定义组件 form-create-designer 是基于 @form-create/element-ui实现的表单设计器组件.可以通过拖拽的方式快 ...