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. 2020年最新消息中间件MQ与RabbitMQ面试题-copy

    为什么使用MQ?MQ的优点 简答 异步处理 - 相比于传统的串行.并行方式,提高了系统吞吐量. 应用解耦 - 系统间通过消息通信,不用关心其他系统的处理. 流量削锋 - 可以通过消息队列长度控制请求量 ...

  2. Kubernetes 深入学习

    目录 一.简介 1.Kubernetes 是什么 2.Kubernetes 特性 二.集群架构与组件 1.Master 2.Node 三.核心概念 四.集群搭建 -- 平台规划 1.生产环境 K8S ...

  3. Golang-接口7

    http://c.biancheng.net/golang/interface/ Go语言接口声明(定义) Go语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念 ...

  4. 《SpringBoot》自动装配原理(简单易懂)

    引入 先看SpringBoot的主配置类 @SpringBootApplication public class DemoApplication{ public static void main(St ...

  5. 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

    九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...

  6. EIP、VIP、RIP的区别

    本文分享自天翼云开发者社区<EIP.VIP.RIP的区别>,作者:魏****猛 EIP.VIP.RIP都是网络中经常使用的术语,但是它们的意义和使用场景是不同的. 首先,EIP(Elast ...

  7. 部署Palworld幻兽帕鲁服务器最佳实践(Ubuntu)

    本文为您介绍Ubuntu系统部署Palworld幻兽帕鲁服务器的最/佳实践. 1.登录云主机控制台,选择创建云主机的资源池,点击"创建云主机"按钮. 2.基础配置. CPU架构选择 ...

  8. pkill 踢出某个终端

    是ps命令和kill命令的结合,按照进程名来杀死指定进程 选项 -o:仅向找到的最小(起始)进程号发送信号: -n:仅向找到的最大(结束)进程号发送信号: -P:指定父进程号发送信号: -g:指定进程 ...

  9. Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]

    Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...

  10. 如何配置 maven 编译插件的 JDK 版本

    普通maven项目配置编译器版本 参考maven官方文档 Setting the -source and -target of the Java Compiler maven有2种方法设置编译JDK版 ...