Книга: UNIX: взаимодействие процессов
10.17. Резюме
10.17. Резюме
Семафоры Posix представляют собой семафоры-счетчики, для которых определены три основные операции:
1. Создание семафора.
2. Ожидание изменения значения семафора на ненулевое и последующее уменьшение значения.
3. Увеличение значения семафора на 1 и возобновление выполнения всех процессов, ожидающих его изменения.
Семафоры Posix могут быть именованными или неименованными (размещаемыми в памяти). Именованные семафоры всегда могут использоваться отдельными процессами, тогда как размещаемые в памяти должны для этого изначально планироваться как разделяемые между процессами. Эти типы семафоров также отличаются друг от друга по живучести: именованные семафоры обладают по меньшей мере живучестью ядра, тогда как размещаемые в памяти обладают живучестью процесса.
Задача производителей и потребителей является классическим примером для иллюстрации использования семафоров. В этой главе первое решение состояло из одного потока-производителя и одного потока-потребителя; второе решение имело нескольких производителей и одного потребителя, а последнее решение допускало одновременную работу и нескольких потребителей. Затем мы показали, что классическая задача двойной буферизации является частным случаем задачи производителей и потребителей с одним производителем и одним потребителем.
В этой главе было приведено три примера возможной реализации семафоров Posix. Первый пример был самым простым, в нем использовались каналы FIFO, а большая часть забот по синхронизации ложилась на ядро (функции read и write). Следующая реализация использовала отображение файлов в память (аналогично реализации очередей сообщений Posix из раздела 5.8), а также взаимное исключение и условную переменную (для синхронизации). Последняя реализация была основана на семафорах System V и представляла собой, по сути, удобный интерфейс для работы с ними.
- 10.1.Введение
- 10.2. Функции sem_open, sem_close и sem_unlink
- 10.3. Функции sem_wait и sem_trywait
- 10.4. Функции sem_post и sem_getvalue
- 10.5. Простые примеры
- 10.6. Задача производителей и потребителей
- 10.7. Блокирование файлов
- 10.8. Функции sem_init и sem_destroy
- 10.9. Несколько производителей, один потребитель
- 10.10. Несколько производителей, несколько потребителей
- 10.11. Несколько буферов
- 10.12. Использование семафоров несколькими процессами
- 10.13. Ограничения на семафоры
- 10.14. Реализация с использованием FIFO
- 10.15. Реализация с помощью отображения в память
- 10.16. Реализация с использованием семафоров System V
- 10.17. Резюме
- Упражнения