System V信号量 vs. POSIX信号量:核心区别与选型指南
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(涉及文件系统路径解析)
六、选型建议
优先POSIX的场景:
- 需要兼容C++11以上标准(如
std::counting_semaphore) - 线程间同步或简单进程同步(如共享内存计数器)
- 对性能要求苛刻(如高频交易系统)
- 需要兼容C++11以上标准(如
坚持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信号量:核心区别与选型指南的更多相关文章
- system V信号量和Posix信号量
一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...
- 五十一、进程间通信——System V IPC 之进程信号量
51.1 进程信号量 51.1.1 信号量 本质上就是共享资源的数目,用来控制对共享资源的访问 用于进程间的互斥和同步 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对所有信 ...
- system v共享内存与信号量综合
ipc.h #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include < ...
- 第三十三章 System V共享内存与信号量综合
用信号量解决生产者.消费者问题 实现shmfifo ip.h #ifndef _IPC_H #define _IPC_H #include <unistd.h> #include < ...
- System V IPC 之信号量
本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...
- Linux进程通信 之 信号灯(semphore)(System V && POSIX)
一. 信号灯简介 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制. 相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程 也可以修改该标志.除了用于访 ...
- UNIX 进程间通讯(IPC)概念(Posix,System V IPC)
IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- 多线程编程之Apue3rd_Chapter15.10之posix信号量
看了APUE的chapter15,只重点看了15.10,学习了posix信号量.Posix信号量比起xsi信号量的优点是性能更好,在Linux3.2.0平台上性能提升很大.其中命名信号量使用方法如下. ...
- System V IPC
1.概述 System V IPC共有三种类型:System V消息队列.System V 信号量.System V 共享内存区. System V IPC操作函数如下: 2.key_t键和ftok函 ...
随机推荐
- 2020年最新消息中间件MQ与RabbitMQ面试题-copy
为什么使用MQ?MQ的优点 简答 异步处理 - 相比于传统的串行.并行方式,提高了系统吞吐量. 应用解耦 - 系统间通过消息通信,不用关心其他系统的处理. 流量削锋 - 可以通过消息队列长度控制请求量 ...
- Kubernetes 深入学习
目录 一.简介 1.Kubernetes 是什么 2.Kubernetes 特性 二.集群架构与组件 1.Master 2.Node 三.核心概念 四.集群搭建 -- 平台规划 1.生产环境 K8S ...
- Golang-接口7
http://c.biancheng.net/golang/interface/ Go语言接口声明(定义) Go语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念 ...
- 《SpringBoot》自动装配原理(简单易懂)
引入 先看SpringBoot的主配置类 @SpringBootApplication public class DemoApplication{ public static void main(St ...
- 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)
九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...
- EIP、VIP、RIP的区别
本文分享自天翼云开发者社区<EIP.VIP.RIP的区别>,作者:魏****猛 EIP.VIP.RIP都是网络中经常使用的术语,但是它们的意义和使用场景是不同的. 首先,EIP(Elast ...
- 部署Palworld幻兽帕鲁服务器最佳实践(Ubuntu)
本文为您介绍Ubuntu系统部署Palworld幻兽帕鲁服务器的最/佳实践. 1.登录云主机控制台,选择创建云主机的资源池,点击"创建云主机"按钮. 2.基础配置. CPU架构选择 ...
- pkill 踢出某个终端
是ps命令和kill命令的结合,按照进程名来杀死指定进程 选项 -o:仅向找到的最小(起始)进程号发送信号: -n:仅向找到的最大(结束)进程号发送信号: -P:指定父进程号发送信号: -g:指定进程 ...
- Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...
- 如何配置 maven 编译插件的 JDK 版本
普通maven项目配置编译器版本 参考maven官方文档 Setting the -source and -target of the Java Compiler maven有2种方法设置编译JDK版 ...