进程间通信信号量
封面图
•
2026-01-14
•
嵌入式
235
0
0
0
进程间通信(IPC)中的**信号量(Semaphore)**是一种用于**同步和互斥**的机制,常用于控制多个进程对共享资源的访问。它由 **Dijkstra** 提出,是实现进程同步的重要工具。 --- ## 一、什么是信号量? 信号量是一个整数变量,用来表示系统中某种资源的可用数量。它支持两个原子操作: - **P 操作(Wait)**:尝试获取资源,若资源不足则阻塞等待。 - **V 操作(Signal)**:释放资源,通知其他等待的进程。 --- ## 二、信号量的类型 ### 1. **二进制信号量(Binary Semaphore)** - 也叫**互斥锁(Mutex)** - 只能取 0 或 1 的值 - 用于保护临界区,防止多个进程同时访问共享资源 ### 2. **计数型信号量(Counting Semaphore)** - 可以取大于 0 的整数值 - 用于管理多个相同资源(如打印机、缓冲区等) --- ## 三、信号量的操作 ### 原子操作: - `sem_wait(sem)`:相当于 P 操作,尝试获取信号量,如果无法获取则阻塞。 - `sem_post(sem)`:相当于 V 操作,释放信号量,唤醒等待的进程。 --- ## 四、信号量的使用场景 ### 1. **互斥访问(Mutual Exclusion)** - 多个进程访问同一资源时,保证同一时间只有一个进程在执行关键代码。 ```c semaphore mutex = 1; // 进程 A sem_wait(mutex); // 临界区代码 sem_post(mutex); // 进程 B sem_wait(mutex); // 临界区代码 sem_post(mutex); ``` ### 2. **进程同步(Synchronization)** - 控制进程执行顺序,例如生产者-消费者问题。 ```c semaphore empty = N; // 缓冲区大小 semaphore full = 0; semaphore mutex = 1; // 生产者 sem_wait(empty); sem_wait(mutex); // 生产数据 sem_post(mutex); sem_post(full); // 消费者 sem_wait(full); sem_wait(mutex); // 消费数据 sem_post(mutex); sem_post(empty); ``` --- ## 五、信号量的实现方式 不同操作系统提供了不同的信号量接口: | 系统 | 信号量接口 | |------|------------| | Linux/Unix | `sem_open`, `sem_wait`, `sem_post` | | Windows | `CreateSemaphore`, `WaitForSingleObject`, `ReleaseSemaphore` | | POSIX | `sem_init`, `sem_wait`, `sem_post` | --- ## 六、信号量与互斥锁的区别 | 特性 | 信号量 | 互斥锁 | |------|--------|--------| | 类型 | 二进制或计数型 | 二进制(只能 0/1) | | 使用场景 | 同步、资源管理 | 互斥访问 | | 调用方式 | `sem_wait`, `sem_post` | `lock`, `unlock` | | 优先级 | 无特定优先级 | 通常按 FIFO 排队 | --- ## 七、信号量的缺点 - **容易出现死锁**:比如两个进程互相等待对方释放信号量。 - **调试困难**:由于其异步特性,难以跟踪状态变化。 - **资源浪费**:频繁的等待和唤醒可能影响性能。 --- ## 八、信号量的典型应用 - **生产者-消费者问题** - **读者-写者问题** - **多线程/多进程任务调度** - **资源池管理** --- ## 九、示例代码(Linux 下 POSIX 信号量) ```c #include <stdio.h> #include <semaphore.h> #include <pthread.h> sem_t sem; void* thread_func(void* arg) { sem_wait(&sem); printf("Thread %d: Accessing resource\n", (int)arg); sleep(1); sem_post(&sem); return NULL; } int main() { sem_init(&sem, 0, 1); // 初始化为 1 pthread_t t1, t2; pthread_create(&t1, NULL, thread_func, (void*)1); pthread_create(&t2, NULL, thread_func, (void*)2); pthread_join(t1, NULL); pthread_join(t2, NULL); sem_destroy(&sem); return 0; } ``` --- ## 十、总结 | 项目 | 内容 | |------|------| | 作用 | 同步、互斥、资源管理 | | 操作 | `sem_wait` / `sem_post` | | 类型 | 二进制、计数型 | | 应用 | 生产者-消费者、读写问题、多线程同步 | | 实现 | POSIX、Windows、System V 等 | 如果你需要具体的编程实现或更深入的讲解,请告诉我!
上一篇:
放大电路
下一篇:
交叉编译
标题录入,一次不能超过6条
留言
评论