12-System V信号量的缺点
47.11 System V信号量的缺点
System V信号量存在的很多缺点与消息队列(参见46.9节)的缺点是一样的,包括以下几点。
- 信号量是通过标识符而不是大多数UNIX I/O和IPC所采用的文件描述符来引用的。这使得执行诸如同时等待一个信号量和文件描述符的输入之类的操作就会变得比较困难。(通过创建一个子进程或线程来操作这个信号量并使用第63章中介绍的其中一种方法将消息写入一个被监控的管道以及其他文件描述符就可以解决这个难题。)
- 使用键而不是文件名来标识信号量增加了额外的编程复杂度。
- 创建和初始化信号量需要使用单独的系统调用意味着在一些情况下必须要做一些额外的编程工作来防止在初始化一个信号量时出现竞争条件。
- 内核不会维护引用一个信号量集的进程数量。这就给确定何时删除一个信号量集增加了难度并且难以确保一个不再使用的信号量集会被删除。
- System V提供的编程接口过于复杂。在通常情况下,一个程序只会操作一个信号量。同时操作集合中多个信号量的能力有时侯是多余的。
- 信号量的操作存在诸多限制。这些限制是可配置的,但如果一个应用程序超出了默认限制的范围,那么在安装应用程序时就需要完成额外的工作了。
不管怎样,与消息队列所面临的情况不同,替代System V信号量的方案不多,其结果是在很多情况下都必须要用到它们。信号量的一个替代方案是记录锁,在第55章中将会对此予以介绍。此外,从内核2.6以及之后的版本开始,Linux支持使用POSIX信号量来进行进程同步。第53章将会介绍POSIX信号量。