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 查找大小相同文件/图片

    假设文件大小一样就表示文件一模一样,是重复文件 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  2. 一点区块链资料-copy

    1. 场景描述 (1)今天找资料,无意中看到15年底-16年初弄的关于区块链的资料,当时写了个交流汇报区块链的ppt,感觉挺好的,共享下,希望能帮助朋友们理解区块链. (2)背景:15年底,老板从朋友 ...

  3. Redis的高可用?(主从、哨兵、集群)

    高可用有两个含义:一是数据尽量不丢失,二是保证服务尽可能可用. AOF 和 RDB 数据持久化保证了数据尽量不丢失,那么多节点来保证服务尽可能提供服务. 一般在实际生产中,服务不会部署成单节点,主要是 ...

  4. http 协议请求响应模型

    http 协议请求响应模型(一次请求生命周期或简单的软件分层) 场景: 登录 1.客户端发起请求到api接口层 1.1用户在客户端填写用户名和密码,点击登录,发送请求. 2.api接收到客户端发起的用 ...

  5. 安装坦克PWA3教程

    全文概述 本文档提供了一份详细的教程,旨在引导读者完成坦克PWA3的安装与基本配置过程.坦克PWA3是一个综合性的平台,具备多项实用功能,如快速DNS记录管理.内网穿透及安全配置等,特别适用于自托管服 ...

  6. colab 使用技巧

    无法进入目录 import os path = "/content/TaBERT/" os.chdir(path) print(os.getcwd()) 无法执行conda !pi ...

  7. git pull报错:Pulling without specifying how to reconcile divergent branches is discouraged.

    一.保存内容如下 二.翻译 三.设置为默认即可:git config pull.rebase false

  8. FLink18--全窗口聚合方式2 ProcessWindowApp

    一.依赖 二.代码 package net.xdclass.class11; import java.util.List; import java.util.stream.Collectors; im ...

  9. Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]

    原题 分析 本题由于从一个节点发信息,同一个集合内的所有点都会收到信息,显然是一道要求维护各节点间关系的题,因此采用并查集的数据结构进行求解. 但由于维护关系的同时还要维护权值,所以采用带权并查集,它 ...

  10. IPMITool 工具使用详细教程

    IPMITool 工具使用详细教程 一.IPMI 与 IPMITool 简介 1. IPMI 概述 智能平台管理接口(Intelligent Platform Management Interface ...