
- •Глава 5
- •5.1. Принципы параллельных вычислений
- •Простой пример
- •Взаимодействие процессов
- •Листинг 5.1. Взаимные исключения
- •5.2. Взаимоисключения
- •Листинг 5.3. Алгоритм Петерсона для двух процессов
- •5.3. Взаимоисключения: аппаратная поддержка
- •Специальные машинные команды
- •5.4. Семафоры
- •5.5. Мониторы
- •5.6. Передача сообщений
- •Синхронизация
- •Принцип работы очереди
- •5.7. Задача читателей/писателей
- •Приоритетное чтение
- •5.8. Резюме, ключевые термины и контрольные вопросы
- •5.9. Pекомендуемая литература
- •5.10. Задачи
Глава 5
Параллельные вычисления: взаимоисключения и многозадачность
Принципы параллельных вычислений
Взаимоисключения: программный подход
Взаимоисключения: аппаратная поддержка
Семафоры
Мониторы
Передача сообщений
Задача читателей/писателей
Резюме, ключевые термины и контрольные вопросы
Рекомендуемая литература
Задачи
Основные вопросы, на которых сосредотачивается внимание разработчиков операционных систем, связаны с управлением процессами и потоками.
Многозадачность: управление множеством процессов в однопроцессорной системе.
Многопроцессорность: управление множеством процессов в многопроцессорной системе.
Распределенные вычисления: управление множеством процессов, выполняемых в распределенной вычислительной системе с множеством компьютеров. Основным примером таких систем являются широко распространенные в последнее время кластеры.
Фундаментальной концепцией этой области, да и разработки операционных систем в целом, является концепция параллельных вычислений (concurrency). Параллельность охватывает множество вопросов разработки, включая вопросы обмена информацией между процессами, разделения ресурсов, синхронизацию работы процессов и распределение процессорного времени между различными процессами. Вы увидите, что эти вопросы возникают не только в многопроцессорной или распределенной вычислительной среде, но и в случае многозадачных систем на базе одного процессора.
Параллельность проявляется в трех различных контекстах.
Множественные приложения: многозадачность разработана для того, чтобы позволить динамически разделять процессорное время между рядом активных приложений.
Структурность приложений: в качестве развития парадигмы модульной разработки и структурного программирования некоторые приложения могут быть разработаны как множество параллельно работающих процессов.
Структура операционной системы: преимущества структурного программирования доступны не только прикладным, но и системным программистам, и, как вы знаете, операционные системы также зачастую реализуются в виде набора процессов или потоков.
В силу важности данного вопроса ему посвящены четыре главы данной книги. В настоящей и следующей главах рассматривается параллельность в контексте многопроцессорности и многозадачности; в главах 13, "Распределенные вычисления, архитектура клиент/сервер и кластеры", и 14, "Управление распределенными процессами", изложены вопросы параллельных вычислений в контексте распределенных вычислений. Хотя оставшаяся часть книги охватывает различные важные темы разработки операционных систем, параллельные вычисления играют главную роль при рассмотрении этих тем.
Данная глава начинается с введения в концепции параллельных вычислений и параллельного выполнения ряда процессов1. Вы узнаете, что основным требованием поддержки параллельных процессов является возможность обеспечения взаимоисключений, т.е. возможность обеспечить работу только одного процесса с остановкой выполнения всех остальных. В следующем разделе будут рассмотрены различные подходы к обеспечению взаимоисключений. Все они являются программными решениями и требуют использования технологии, известной как пережидание занятости (busy waiting). Затем мы остановимся на некоторых аппаратных механизмах, способных обеспечить поддержку взаимоисключений, а также решениях, которые не используют пережидание занятости и могут поддерживаться операционной системой или компиляторами. Мы рассмотрим три подхода: семафоры, мониторы и передачу сообщений.
Для иллюстрации концепций и сравнения представленных в этой главе подходов используются две классические задачи. Сперва мы познакомимся с задачей производителей/потребителей, а затем — с задачей читателей/писателей.
Наше изучение параллельных вычислений продолжится в главе 6, "Взаимоблокировка и голодание", и обсуждение механизмов параллельности рассматриваемых нами операционных систем мы отложим до ее конца.