«Цепь» связи

«Цепь» ожидания
Алгоритм доступа к системным ресурсам в ситуации создания задачи

·  Начало

·  Анализ прерывания

·  IF1 <если вызывающая задача системная>

IF2 <уровень привилегий вызывающей задачи достаточен для вызываемой>

§  IF3<задача свободна>

·  Установить цепочку связей в таблице задач

·  Поместить задачу в очередь - на - выполнение

·  Формировать код возврата «УСПЕХ»

·  Перейти к диспетчеру

§  FI3

Else

·  IF4 <есть свободные блоки запросов в очереди вызовов системной задачи>

Поиск свободного блока по таблице очереди вызовов

o  Занести в блок запросов информацию о номере вызывающей задачи и адрес области параметров

o  IF5 <существует очередь к вызываемой задачи>

§  Поместить блок запросов в очереди вызовов соответственно приоритету вызывающей задачи

§  Пометить в карте очереди вызовов этот блок, как занятый

§  Уменьшить счетчик свободных блоков запроса

§  Уменьшения счетчика задач ожидающих данную

§  Формировать код возврата – «УСПЕХ»

§  Идти к диспетчеру

o  FI5

Else

o  Поместить блок запросов в очереди вызовов соответственно приоритету вызывающей задачи

o  Перейти к диспетчеру

·  FI4

Else

·  Формирование кода возврата, «ПЕРЕГРУЗКА СИСТЕМЫ»

·  Перейти к диспетчеру

·  FI2

·  Формирование кода возврата – «Превышение полномочий доступа»

·  Перейти к диспетчеру

·  FI1

·  IF6< есть незанятый блок запроса в очереди загрузки>

·  Установить цепочку в таблице задач

·  Поместить запрос в очередь загрузки

·  Блокировать задачу по условию ожидания загрузки в ОП

·  Разблокировать «Процесс загрузки задачи в ОП»

·  Формировать код возврата – «Успех»

·  Перейти к диспетчеру

·  FI6

·  Формировать код возврата – «ПЕРЕГРУЗКА СИСТЕМЫ»

·  Перейти к диспетчеру

·  Конец

Алгоритм работы с очередью при завершении задачи

Анализ прерываний. Очистить цепочку связей в таблице задач. Исключить задачу из очереди на выполнение. Требуется завершить системную хадачу [ДА->5, НЕТ ->13]. Данную задачу ожидают [ДА->6, НЕТ ->15]. Взять первый блок запроса из очереди вызовов для данной задачи. Установить цепочку связей в таблице задач. Включить задачу в очередь на выполнение. Освободить блок запроса в очереди вызовов. Счетчик задач, ожидающих данную уменьшается на 1. Уменьшение счетчик свободных блоков в очереди вызовов Формировать код возврата – «УСПЕХ». Перейти к диспетчеру. Освободить основную память, занимаемую задачей. Перейти к диспетчеру. Формировать код возврата – «УСПЕХ». Перейти к диспетчеру.

 

Вопросы по лекции №7:

Сформировать таблицу проблемных и системных задач. Алгоритмы работы с очередью при завершении задачи. Алгоритм доступа к системным ресурсам в ситуации создания задачи.

ЛЕКЦИЯ 8

Ядро ОС Unix. Структура ОС Unix

В структуре можно выделить три основные части

Самая низкоуровневая часть ОС - специальные средства для управления конкретными аппаратными и программными ресурсами, специфичными для данной конкретной платформы. Более высокий уровень - уровень конкретных служебных программ и языков программирования. На этом уровне система получает ресурсы через обращение к ядру ОС (т. е. по прерываниям). Уровень вспомогательных процедур, интерпретаторов, компиляторов. На данной основе строятся пользовательские приложения (текстовые редакторы, графические интерфейсы и собственно приложения).

Рис. 23 Структура ОС UNIX

Sh – уровень интерпретатора языка Shell

Сpp – компилятор языка Си

Vi – текстовый редактор

grep – команда, позволяющая искать файлы по их содержимому

Блок схема системного ядра ОС Unix

Рис. 24 Блок схема системного ядра ОС Unix

На рисунке 24 показана блок-схема ядра операционной системы UNIX. Ядро содержит системные программы, которые выполняют диспетчерские функции, и управляющие структуры данных, используемые этими программами. Все работы, выполняемые вне ядра, оформлены в виде процессов, работающих режиме "Пользователь"

Функции ОС Unix

Обработка прерываний. Создание и уничтожение процессов. Переключения процессов из одного состояния в др. Диспетчеризация. Приостановка, возобновление, активизация процессов. Синхронизация процессов. Организация взаимодействия между процессами. Манипулирования блоками управляющих процессов. Поддержка операции в/в. Поддержка операции распределения, перераспределения памяти. Поддерживается работа файловой системы. Поддержка механизма вызова/возвратов к процедурам.

ОС UNIX состоит из ядра с включенными в него драйверами и из утилит. Если надо изменить конфигурацию ОС UNIX, то ядро пересобирают (перелинковывают) из объектных кодов или из исходных текстов. В Windows и OS/2 при загрузке прилинковывают драйверы, при этом компактность собранного ядра и повторное использование общего кода на порядок ниже, чем у UNIX. Компактность кода особенно важна, т. к. ядро и драйверы никогда не свопируются
на диск. UNIX - это ОС, которая на данный момент поддерживает наибольшее число платформ. ОС UNIX предназначена для квалифицированного администратора, т. к. требует знаний принципов функционирования происходящих в ней процессов. ОС UNIX отличается высокой надежностью функционирования, это обеспеченно за счет жесткого разделения памяти и реальной многозадачности. Практически все протоколы, на которых основан Internet, ориентированы под ОС UNIX (TCP/IP).

Управление процессами

Процессы – это независимые работы, которые выполняются с разной скоростью

Скорость зависит от параметров:

·  приоритета;

·  количества обращений к внешним устройствам;

·  соотношение события данной задачи и других;

·  частота обращения к SV.

Проблемы управления вычислитеными процессами

Взаимное исключение - эта ситуация возникает из-за попытки какого-либо процесса использовать системные ресурсы конфликтным образом. Например, когда процесс1 находится в CS, а процесс2 пытается получить доступ к этому ресурсу. Данная ситуация должна быть разрешена на уровне макрокоманд ядра, запрещающих такую ситуацию (CS – критическая секция).. Синхронизация процессов - подразумевает "сигнализацию" между двумя или более процессами по установленному протоколу (правилу). "Сигнал" рассматривается как событие, вызывающее у получателя этого "сигнала" соответствующие действия. Взаимоблокировка - ситуация возникает в связи с тем, что число единиц конкретного ресурса больше числа процессов, запросивших этот ресурс. Системная взаимоблокировка (deadlock) возникает, когда все процессы в системе не в состоянии продолжить работу. Коммуникация между процессами - связи между процессами должны быть определенным образом налажены. Связь между процессами создает проблемы связанные с адресацией процессов, со структурами планировщика и диспетчера.

Схемы взаимодействия между процессами соответствуют механизму сопрограмм. Использование сопрограмм упрощает логику ядра системы и требует одного выделенного процесса, который создается нестандартным образом. С него начинается работа системы после запуска. В ОС UNIX этот процесс называется "диспетчерским" ("swapper"), он не имеет пользовательской фазы.

Все процессы в ОС UNIX, кроме диспетчерского, создаются операцией "Порождение". В этой операции участвуют два процесса: порождающий и порожденный. Порождающий выполняет системный вызов (fork), в результате формируется порожденный процесс.

Адресное пространство процесса состоит из 3 сегментов:

    текстового сегмента (инструкции) – сегмент кода; сегмент данных; сегмент стека.

 

Вопросы по лекции №8:

Что такое критический участок? Что такое взаимная системная блокировка? Функции ОС Unix (перечислить). Нарисовать блок схема системного ядра ОС Unix. Структура Unix.

ЛЕКЦИЯ 9

Управление процессами в ОС UNIX

Управление процессами осуществляется в ОС UNIX с помощью двух структур.

1. PROC-STRUCTRE (структура управления). Составляющие структуры:

    состояние процесса; размер и адрес процесса; кому принадлежит процесс; идентификация процесса; канал ожидания; поле сигналов; таймер и счетчик используемого времени.

2. USER-STRUCTRE (структура использования)- содержит информацию о процессе, которая должна быть доступна только на уровне исполнения. Содержание структуры:

    параметры ввода-вывода (I/O), т. е. адреса буферов и т. д.; окружение в файловой системе (текущий каталог, коренной каталог); таблица открытия файлов; код возврата, номера ошибок; поле сигналов (информация, как надо реагировать на сигнал).

В ОС UNIX нет разницы между задачами и заданиями. Работы в системе представлены множеством конкурирующих процессов. Процессы строго последователены, нельзя выполнять асинхронные действия внутри процесса. Даже операция I/O не может быть выполнена асинхронно.

Распределением ресурсов между процессами занимается ядро ОС. Программы ядра выполняются от имени процесса. Процесс может находится: в режиме пользователя или в режиме системы.

На рисунке 25 приведена таблица связи между структурами.

Рис.25 Таблица связи между структурами.

Примеры системных вызовов в Unix

Вызов

Описание

Управление процессами

Pid = fork (…, …) Pid = waitpid (pid, statloc, options) s = execve(name, argv,…) Exit (status) Создает процесс, идентичный родительскому Ожидает завершения дочернего процесса Перемещает образ памяти процесса Завершает выполнения процесса и возвращает статус

Управление файлами

fd = open (file, how …) s = close (fd) n = read (fd, buffer, nbytes) n = write (fd, buffer, nbytes) s = stat (name, buf)

1. Открыть файл для чтения /записи/

2. Закрывает открытый файл

3. Читает данные из файла в буфер

4. Пишет данные из буфера в файл

5. Получает о состояния файла

Управление каталогами и файловой системой

Разные

Табл.4 Таблица системных вызовов в Unix

Pid – индетификация процесса

fd - описатель файла

n – количество байтов

Жизненный цикл процесса

В ОС UNIX процесс в ходе своего существования может иметь одно из девяти состояний:


рис. 26 Граф состояний процесса в ОС UNIX

Пояснения к рисунку:

1 - процесс выполняет инструкции программы (USER RUNNING);

2 - процесс выполняет системный вызов (KERNEL RUNNING);

3 - процесс готов к выполнению (READY_TO_RUN);

4 - процесс "спит" и ждет события (SLEEP_IN_MEMORY);

5 - процесс готов к выполнению, но он находится на внешнем носителе (т. е. выгружен) (READY_TO_ RUN, SWAPPED);

6- процесс "спит" и находится на внешнем носителе (SLEEP, SWOPPED);

7 - процесс только что создан (процесс родился) (CREATED);

8 - процесс уничтожен, завершен (ZOMBIE);

9 - процесс прерван по приоритету (PREEMPTED).

Планирование и диспетчеризация процесса

Планирование - это организация процессов в некоторую последовательность, согласно заданной стратегии.

Планировщик - это программа, ответственная за постановку процессов в очередь-на-выполнение и управляющая этой очередью.

Диспетчер - это программа, которая выбирает процессы из очереди-на-выполнение, переводит их в активное состояние и передает им контроль над CPU.

Вопросы по лекции №9:

Что такое Планировщик? Что такое Диспечер? Нарисовать жизненный цикл процесса. Preempted. Что это означает и когда это применяется? Приведите примеры системных вызовов в Unix.

ЛЕКЦИЯ 10

Планирование и диспетчеризация процессов

Функции планировщика-диспетчера

Во многих ОС планирования и диспетчеризация функции могут быть представлены неразрывной последовательностью, поэтому введем термин планировщик-диспетчер.

Планировщик - это программа, ответственная за постановку процессов в очередь-на-выполнение и управляющая этой очередью.

Диспетчер - это программа, которая выбирает процессы из очереди-на-выполнение, переводит их в активное состояние и передает им контроль над CPU.

Основная функция - возможность управлять действиями большого числа процессов.

Приостановка процесса

В ходе своего выполнения системный процесс может установить, что требуемый ресурс занят или в данный момент процессу не требуется производить каких-либо действий. Тогда процесс может «сознательно» приостановить свое выполнение до момента активизации его другим процессом. При этой процедуре адрес блока управления процессом (БУП) записывается в стек, затем для активизации другого процесса вызывается системный планировщик. Результатом этого действия является то, что "приостановленный" процесс не помещается в очередь-на-выполнение, т. е. не активизируется.

Схемы очередей блоков управления процессами до а. и после б. "приостановки":

А) «ДО»

Б) «ПОСЛЕ»

Рис.27 Схема очереди блоков управления процессами.

Алгоритм "Приостановить процесс":

    НАЧАЛО Анализ прерывания procedure "ПРИОСТ" IF1< приостанавливаемый процесс не является системным и находится в ОП>
      блокировать процесс по условию выгрузки из ОП IF2<есть свободный блок запроса в очереди приостановок>

o  создать блок запроса в очереди приостановок

o  разблокировать процесс "откачки"

o  формировать код возврата по удачному завершению

o  передать управление диспетчеру

o  FI2

o  формирование кода возврата по перегрузке системы

o  передать управление диспетчеру

    FI1 формировать код возврата по невозможности приостановки передать управление диспетчеру КОНЕЦ

Отсрочка процесса

При выполнении длинных кодовых инструкций процесс может надолго занять CPU. Это означает, что за исключением прерываний никакой другой процесс не имеет доступ к CPU. Для облегчения доступа к CP процесс может осуществить повторное планирование, тем самым "отсрочить" свое выполнение.

При отсрочке процесса адрес блока управления помещается в стек процесса. Затем процесс выдает запрос на планирование, вызывая процедуру "Активизировать", с указанием адреса собственного БУП (блока управления процессом). Планировщик-диспетчер выбирает на выполнение следующий процесс из очереди.

Алгоритм "Возобновить процесс"

    НАЧАЛО Анализ прерывания procedure "ВОЗОБНОВИТЬ" IF1<процесс не системный и был выгружен из ОП>
      IF2<есть свободные блоки запросов в очереди возобновлений>
        Поместить блок запроса в очередь возобновлений разблокировать процесс подкачек блокировать процесс по условию загрузки в ОП формировать код возврата по удачному завершению переход к диспетчеру
      FI2 формирование кода возврата по перегрузке системы переход к диспетчеру
    FI1 формировать код возврата по невозможности приостановки переход к диспетчеру КОНЕЦ

Алгоритм «АКТИВИЗИРОВАТЬ»

Процесс, вызывающий отсроченный процесс, активизирует его процедурой "Активизировать" с указание адреса блока управления процессом.

1. Процедура "Активизировать" помещает БУП в очередь-на-выполнение.
2. Проверяет, совпадают ли адрес БУП с адресом текущего выполняющегося процесса.
3. Если не совпадают, то процесс помещается в очередь-на-выполнение.
4. Если совпадает, то БУП уже находится в конце очереди-на-выполнение.

Общий вид алгоритма "Активизировать процесс", используемого при диспетчеризации.

    НАЧАЛО procedure DISPATCH обновить БУП активного процесса выбрать следующий "Готовый" процесс для передачи ему управления IF1< "Готовый" процесс найден>
      пометить его как "активный" выделить квант времени, установить командой SETTAME - интервальный таймер передать управление выбранному процессу
    FI1 перевести CPU с состояние простоя (режим "холостого хода")

При передаче управления от одного процесса к другому, прежде всего надо сохранить информацию о состоянии активного процесса. Если процесс был заблокирован по причине дельта t, то информация о состоянии процесса может быть найдена в рабочей области прерываний по таймеру.

После сохранения состояния предыдущего активного процесса диспетчер выбирает для активизации новый процесс.

Чтобы задать квант времени, выделяемый процессу, диспетчер устанавливает интервальный таймер. Затем диспетчер использует команду LPS (Load Process Status) (загрузка состояния процесса) для загрузки информации о состоянии данного процесса и осуществляет передачу управления.

Если процесса в состоянии готовности нет, то диспетчер переводит CPU в состояние простоя.

Выбор следующего процесса для диспетчеризации осуществляется несколькими способами (например, используя дисциплину RR - "круговой алгоритм"). Диспетчер циклически просматривает все БУП-ы, выбирает следующий процесс из тех, что находятся в готовности. Каждому активизированному процессу предоставляет одинаковый квант времени.

Графическая интерпретация диспетчеризации представлена на рис. 28:

Рис. 28 Временная диаграмма взаимодействия "Диспетчера" и задач.

ВЫВОДЫ

1. Диспечерезация задач нужна для эффективного управления потоком процессов с учетом критериев эффективности:

среднее время ответа или среднее время обращения;

    среднее взвешенное время; общее время обслуживания процессов; количество процессов в единицу времени; суммарная загрузка всех устройств системы; штраф за задержку обслуживания процессов (понижается приоритет).

2. Диспетчеризация процессов выполняется на уровне планировщика среднего уровня.

3. Так как имеется элемент случайности в требовании процессов, то не возможно предусмотреть заранее характер выполнения процессов.

4. При диспетчеризации используется равномерное циклическое квантование RR (для систем разделения времени t порядка 100нс).
Кроме RR возможна диспетчеризация обслуживания процессов типа FB (Feed Back) - обратная связь.

5. Приоритетное диспетчирование процессов основано на характере оценки использования предыдущего кванта времени. Поощряются задачи с активным вводом-выводом.

6. Существуют принципы многоуровневой диспетчеризации, например:

1-ый уровень: диспетчер работает по завершении обработки прерывания, например, выбирает первый из очереди процесс;

2-ой уровень: (краткосрочная диспетчеризация) при возникновении (создании) новых процессов пользователей диспетчер размещает их в очереди, например, последним;

3-ий уровень: (долгосрочное планирование) диспетчер работает иногда (периодически по таймеру), просматривает всю очередь и в зависимости от качества обслуживания процессов очередь может быть переформирована.

 

Вопросы по лекции № 10:

Что такое долгосрочное планирование? Что такое отсрочка процесса? Нарисовать схемы очередей до приостановки, и после приостановки. Написать алгоритм «ВОЗОБНАВИТЬ»? Написать алгоритм «ПРИОСТАНОВИТЬ»?

ЛЕКЦИЯ 11

Взаимоисключение процессов без посредника

Многие компьютеры с расчетом на несколько CPU имеют команду TSL_RX. LOCK (Test and Set Lock – проверить и заблокировать)

1.  В RG RX считываем слово из памяти lock.

2.  В ячейке памяти lock сохраняется не нулевое значение.

3.  Гарантируется, что операция считывания слова и сохранения его неделима (т. е. никакой другой процесс не может обратиться к слову памяти, пока команда не выполнится).

4.  CPU выполняющий TSL, блокирует шину памятя, чтобы другие CPU не обращались к памяти.

Использование команды” ПРОВЕРИТЬ и УСТАНОВИТЬ” на примере временной диаграммы.

С некоторым ресурсом связана переменная (ВВ). Если ВВ=1 то, ресурс занят (процесс вошел в критический участок). Перед входом в критический участок, CPU должен выполнить команды «Проверить и установить». Перед выходом из CS, необходимо выполнить команду «освободить», т. е. изменить ВВ->0. Для входа в CS должна использоваться неделимая команда «проверить и установить».

Рис. 29 Временная диаграмма использования команды

НЕДОСТАТОК взаимоисключения:

Непроизводительный расход времени CPU на уровне активного ожидания!

Взаимоисключения с участием посредников

Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива. В абстрактной форме эти примитивы, обозначаемые P и V, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:

V(S): переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P

Алгоритм DOWN

Сравниваем S с нулем, если S > 0, команда down уменьшает это значения (расходует один из сигналов активности и возвращает управление процессору)

если S = 0, то команда не возвращает управление процессору, процесс переводится в состояние.”ОЖИДАНИЕ”.

Алгоритм UP

Операция up увеличивает значениe семафора,

если с S связаны процессы, то выбирается один и ему разрешается завершить операцию down.

Mutex не способен считать, может только управлять взаимоисключающим доступом к совместно используемому ресурсу. Mutex – переменная, которая может находиться в одном из двух состояний (БЛОК и НЕБЛОК), для этого требуется всего один бит.

Значение Mutex устанавливается 2 процедурами:

Если процесс собирается войти в CS, он вызывает Mutex_lock, если вход в CS разрешен, запрос выполняется, если запрещен, то вызывающий процесс блокирован пока другой не выйдет из CS, вызывя Mutex_unlock.

 

Вопросы по лекции № 11:

Что такое Mutex? Взаимоисключение процессов без посредников? Взаимоисключение процессов с посредниками? Алгоритм UP Алгоритм DOWN

ЛЕКЦИЯ 12

Двоичные семафоры

С каждым семафором связывается список процессов, ожидающих разрешения пройти семафор.
ОС может выполнить три действия над процессами

1. Может назначить для исполнения готовый процесс.
2. Может заблокировать использующийся процесс и поместить его в список, связанный с конкретным семафором.
3. Может деблокировать процесс, тем самым, переводя его в готовое к исполнению состояние и позволяя ему когда-нибудь возобновить исполнение.

Находясь в списке заблокированных, ожидающий процесс не проверяет семафор непрерывно, как в случае активного ожидания. Вместо него на процессоре может исполняться другой процесс.

Рис. 30 Временная диаграмма для двоичного семафора (семафор – S - один ресурс)

Комментарии к временной диаграмме

До момента t1 ресурс был не занят. В момент t1 процесс Pr1 выполняет операцию P(S) и входит в критический участок (CS).

В момент t2 процесс Pr2 выполняет операцию P(S) - занять ресурс, это приводит к изменению: S = -1 - означает, что Pr2 в состоянии блокирования.

В момент t3 - конец критического участка для процесса Pr1. Выполняется операция V(S) - освободить, это приводит к увеличению значения S на единицу (т. е. S=0). Для процесса блокированного (Pr2) это сигнал на разблокировку и предоставления ему ресурса.

В момент t4 процесс Pr2 освобождает ресурс, выполняется операция V(S), которая по переднему фронту изменяет значение S на 1 (т. е. S=1).

Достоинство синхронизации на основе семафорных операций - отсутствие активного ожидания предоставления ресурса.

Рис. 31 Временная диаграмма для двоичного семафора (семафоры S1 и S2 - два ресурса)

Б - блокировано, СS1 и CS2 - критические участки 1 и 2, идентифицированные семафорами S1 и S2.

Считающий семафор. Числовой семафор

Пример временной диаграммы считающего семафора
(1 ресурс, семафор - S, 5 процессов)

Рис. 32 Временная диаграмма для считающего семафора

Алгоритм P(s)

    Запрет прерываний S:=S-1 IF (S<0)
      Блокировать процесс по S Выбрать другую задачу
    FI Разрешить прерывание

Алгоритм V(s)

    Запрет прерываний S:=S+1 IF (S<=0)
      деблокировать любой процесс, ожидающий S
    FI Разрешить прерывание

Семафоры как счетчики ресурсов и синхронизаторы.

Для процессов, совместно выполняющих общую работу, недостаточно, что они взаимно исключают друг друга при работе с разделяемыми переменными, им необходимо еще и передавать друг другу информацию. Минимальной единицей передаваемой информации может быть простой временной сигнал. В этом случае действует следующее правило:
процессу предоставляется возможность ждать, пока другой не сообщит о "свершении" определенного события.

В качестве примера возьмем пару процессов – ПРОИЗВОДИТЕЛЬ – ПОТРЕБИТЕЛЬ

Pr1 - производитель.

Pr2 - потребитель.

Пусть Pr1 создает записи по одной за t, а Pr2 использует их по одной за t.

Произведенная, но еще не затребованная запись помещается в буфер размером в одну запись. Процессы должны быть синхронизированы так, чтобы между любыми двумя последовательными записями в буфер, выполнялось в точности одно чтение и наоборот.

Pr1 - пишет i-ую (первую запись) в буфер и совершает событие - НАЧАЛО - это событие позволяет потребителю начать обработку записи.

Pr2 - читает i-ую запись из буфера и совершает событие - КОНЕЦ - это позволяет производителю (Pr1) записать в буфер i+1 запись.

Специально предусматривать взаимное исключение при доступе к буферу нет необходимости, т. к. в данном случае оно обеспечивается синхронизацией. Итак - семафор может быть синхронизатором, координирующим производство и потребление ресурсов. Процесс, потребляя ресурс, выполняет P-операцию над связанным с ресурсом семафором (т. е. Р(S)), что означает изменение значения S в меньшую сторону. Процесс производит ресурс, выполняя V(S)- операцию над тем же семафором.

Алгоритм "Производитель-Потребитель" с буфером на одну запись

Введем переменные (семафоры):

ПУСТО = 1 - сигнал для производителя "поместить в буфер запись"

ПОЛНО = 1 - сигнал для потребителя "читать запись"

ПУСТО

ПОЛНО

Состояния

0

0

Какой-то процесс находится в CS

0

1

Потребитель может войти в CS, буфер полон

1

0

Производитель может войти в CS, буфер пуст

1

1

Не определено

Описание (определение) процессов "Производитель-Потребитель" с буфером на одну запись

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3