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函 ...
随机推荐
- c# Progress<T>
c# Progress<T> 用于显示进度........主要是利用IProgress<T> 的Report(T)方法: private void BtnDownload_Cl ...
- java线程用法和区别
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够 ...
- Django Rest Framework的使用
Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...
- Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]
原题 分析 本题由于从一个节点发信息,同一个集合内的所有点都会收到信息,显然是一道要求维护各节点间关系的题,因此采用并查集的数据结构进行求解. 但由于维护关系的同时还要维护权值,所以采用带权并查集,它 ...
- vivo HTTPDNS 端到端体验优化实践
作者:来自 vivo 互联网运维团队- Zhang Qianqian 在信息时代,用户的手机应用访问量日益增多,DNS 解析作为连接互联网的关键环节,也被提出了更高要求.这一背景下,HTTPDNS 域 ...
- 简单编写Makefile与使用make工具
简单编写Makefile与使用make工具 在不使用make工具下对c文件的编译 gcc main.c -o out gcc <目标文件> -o <生成执行文件> 编译到执行文 ...
- error setting certificate verify locations: CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt CApath: none
这个问题是因为git配置里crt证书的路径不正确导致的. 这个路径配置是在C:\Program Files\Git\etc\gitconfig中,应该所有人的配置都在这里 [diff "as ...
- PCI-5565PIO主要应用场景
PCI-5565PIO主要应用场景包括军事领域.工业自动化和控制系统.仿真与培训以及数据采集与分发.在军事领域,PCI-5565PIO可用于航空航天系统的飞行控制计算机.导航系统和传感器系统之间的 ...
- spring - [01] 简介
Spring发展至今,已经形成了一个生态体系(Spring全家桶) 001 || Spring 定义 Spring是一款主流的Java EE轻量级开源框架,目的是用于简化Java企业级应用的开发难 ...
- 机器学习 | 强化学习(1) | 马尔科夫决策过程(MDP)概论
最近在搞强化学习(Reinforcement Learning),打算把之前写的笔记整理一下 本文基于大卫 希尔维(David Silver)教授的强化学习概论课程,视频中所采用的样例学生马尔科夫链( ...