Повторно входимые программные модули.
Основные виды ресурсов и возможности их разделения
Рассмотрим кратко основные виды ресурсов вычислительной системы и способы их разделения.
К основным видам ресурсов можно отнести следующие (рис.1):
1. процессор (процессорное время);
2. память:
2.1. оперативная память;
2.2. внешняя память;
2.3. доступ к внешней памяти;
3. программные модули:
3.1. однократно используемые;
3.2. многократно (или повторно) используемые:
3.2.1. привилегированные;
3.2.2. непривилегированные;
3.2.3. реентерабельные;
3.2.4. повторно входимые;
4. информационные ресурсы.
Рис. 1. Основные виды ресурсов вычислительной системы
Рассмотрим каждый из них более детально.
1. Одним из важнейших ресурсов является процессор[1] (а точнее — процессорное время).
Процессорное время делится попеременно (параллельно). Существует множество методов разделения этого ресурса, которые мы позднее рассмотрим.
2. Вторым по значимости видом ресурсов вычислительной системы можно считать память.
Оперативная память.
Оперативная память может делиться одновременно и попеременно.
Одновременное разделение памяти означает, что в ней одновременно может располагаться несколько задач или, по крайней мере, текущих фрагментов, участвующих в вычислениях.
Под попеременным разделением памяти понимается, что в разные моменты оперативная память может предоставляться для разных вычислительных процессов.
Рассмотрим некоторые особенности распределения оперативной памяти. В каждый конкретный момент времени процессор при выполнении вычислений обращается к очень ограниченному числу ячеек оперативной памяти.
- С этой точки зрения желательно память выделять для возможно большего числа параллельно исполняемых задач.
- С другой стороны, как правило, чем больше оперативной памяти может быть выделено для конкретного текущего вычислительного процесса, тем лучше будут условия его выполнения.
Поэтому проблема эффективного разделения оперативной памяти между параллельно выполняемыми вычислительными процессами является одной из самых актуальных.
2.2 Внешняя память.
Внешняя память - ресурс, который часто необходим для выполнения вычислений.
Внешняя память (например, память на магнитных дисках) и доступ[2] к ней считаются разными видами ресурса. Каждый из этих ресурсов может предоставляться независимо от другого. Но для полноценной работы с внешней памятью необходимо иметь оба этих ресурса.
Внешняя память может разделяться одновременно или попеременно.
Доступ к ней всегда разделяется попеременно.
Пояснения: Если говорить о внешних устройствах, то они, как правило, могут разделяться параллельно, если используются механизмы прямого доступа.
В устройстве хранения с прямым доступом (Direct Access Storage Device, DASD) есть возможность обращения к блокам по их адресам в произвольном порядке и, что важно, допускается произвольное чередование операций записи и чтения блоков. Традиционными устройствами с прямым доступом являются дисковые накопители, и часто в понятие «диск», или «дисковое устройство» (disk device), вкладывают значение «накопитель прямого доступа».
Если же устройство работает с последовательным доступом, то оно не может считаться разделяемым ресурсом. Простыми и наглядными примерами внешних устройств, которые не могут быть разделяемыми, являются принтер и накопитель на магнитной ленте.
Действительно, если допустить, что принтер можно разделять между двумя процессами, которые смогут его использовать (управлять его работой) попеременно, то результаты печати, скорее всего, окажутся негодными — фрагменты выведенного текста могут перемешаться таким образом, что будет не понятно, что есть что.
Аналогично и для накопителя на магнитной ленте. Если один процесс начнет что-то читать или писать, а второй при этом запросит перемотку ленты на ее начало, то оба вычислительных процесса не смогут выполнить свои вычисления. Здесь следует заметить, что при работе с устройствами печати мы, тем не менее, явно наблюдаем возможность печатать из разных программ, выполняющихся параллельно.
Однако необходимо знать, что это реализуется за счет того, что каждый вычислительный процесс получает свой виртуальный принтер, который он ни с кем не разделяет.
А операционная система, получив задания на печать от выполняющихся задач, сама упорядочивает эти задания и передает очередное задание на принтер только после полного завершения предыдущего задания.
3. программные модули.
Очень важным видом ресурсов являются программные модули.
Прежде всего, мы будем рассматривать системные программные модули, поскольку именно они обычно считаются программными ресурсами и поэтому в принципе могут распределяться между выполняющимися процессами.
Программные модули могут быть:
· однократно используемыми;
· многократно (или повторно) используемыми.
3.1. Однократно используемыми называют такие программные модули, которые могут быть правильно выполнены только один раз, то есть в процессе своего выполнения они могут испортить себя: либо повреждается часть кода, либо исходные данные, от которых зависит ход вычислений.
Очевидно, что однократно используемые программные модули являются неделимым ресурсом. Более того, их, как правило, вообще не распределяют как ресурс системы. Системные однократно используемые программные модули, как правило, задействуются только на этапе загрузки операционной системы. При этом следует иметь в виду тот очевидный факт, что собственно двоичные файлы, которые обычно хранятся на системном диске и в которых и записаны эти модули, не портятся, а потому могут быть повторно использованы при следующем запуске операционной системы.
3.2. Повторно используемые программные модули могут быть
- привилегированными;
- непривилегированными;
- реентерабельными.
Все они допускают корректное повторное выполнение программного кода при обращении к нему из другой программы.
Остановимся на рассмотрении разновидностей программных модулей более детально.
3.2.1. Привилегированные программные модули работают в так называемом привилегированном режиме, то есть при отключенной системе прерываний (часто говорят, что прерывания закрыты), когда никакие внешние события не могут нарушить естественный порядок вычислений. Как результат, программный модуль выполняется до своего конца, после чего он может быть вновь вызван на исполнение из другой задачи (другого вычислительного процесса). С позиций стороннего наблюдателя по отношению к вычислительным процессам, которые попеременно (причем, возможно, неоднократно) в течение срока своей «жизни» вызывают некоторый привилегированный программный модуль, такой модуль будет выступать как попеременно разделяемый ресурс.
Структура привилегированных программных модулей изображена на рис. 2
На рисунке 2 в первой секции программного модуля выключается система прерываний. Следовательно, при выполнении вычислений в первой секции ничто не может их прервать, и беспокоиться о промежуточных переменных нет необходимости.
В последней секции, напротив, система прерываний включается. Даже если тут же возникнет прерывание и другой процесс запросит этот же привилегированный модуль, все равно все вычисления уже выполнены и ничто не сможет их испортить.
Рис.2. Структура привилегированного программного модуля
3.2.2. Непривилегированные программные модули — это обычные программные модули, которые могут быть прерваны во время своей работы.
Следовательно, такие модули в общем случае нельзя считать разделяемыми, потому что если после прерывания выполнения такого модуля, исполняемого в рамках одного вычислительного процесса, запустить его еще раз по требованию другого вычислительного процесса, то промежуточные результаты для прерванных вычислений могут быть потеряны.
3.2.3.Реентерабельные[3] программные модули (в противовес непривилегированным программным модулям) допускают повторное многократное прерывание своего исполнения и повторный их запуск по обращению из других задач (вычислительных процессов).
Для этого реентерабельные программные модули должны быть созданы таким образом, чтобы было обеспечено сохранение промежуточных результатов для прерываемых вычислений и возврат к ним, когда вычислительный процесс возобновляется с прерванной ранее точки. Это может быть реализовано двумя способами:
Ø с помощью динамических методов выделения памяти под сохраняемые значения;
Ø с помощью статических методов выделения памяти под сохраняемые значения.
Динамический способ.
Основным и наиболее часто используемым является динамический способ выделения памяти для сохранения всех промежуточных результатов вычисления, относящихся к реентерабельному программному модулю (рис. 3).
Рис. 3. Структура реентерабельного программного модуля
Основная идея построения и работы реентерабельного программного модуля заключается в том, что в первой (головной) своей части путем обращения из системной привилегированной секции осуществляется запрос на получение в системной области памяти блока ячеек, необходимого для размещения всех текущих (промежуточных) данных.
При этом на вершину стека помещается указатель на начало области данных и ее объем. Все текущие переменные реентерабельного программного модуля в этом случае располагаются в системной области памяти. Адресация этих переменных осуществляется относительно вершины стека. Поскольку в конце привилегированной секции система прерываний включается, то во время работы центральной (основной) части реентерабельного модуля возможно ее прерывание.
Если прерывания не возникает, то в третьей (заключительной) секции осуществляется запрос на освобождение используемого блока системной области памяти. При освобождении этой области памяти модифицируется значение стека.
Если же во время работы центральной секции возникает прерывание, и другой вычислительный процесс обращается к тому же самому реентерабельному программному модулю, то для этого нового процесса вновь заказывается новый блок памяти в системной области памяти, и на вершину стека записывается новый указатель.
Очевидно, что возможно многократное повторное вхождение в реентерабельный программный модуль до тех пор, пока в области системной памяти, выделяемой специально для реентерабельной обработки, есть свободные области, объема которых достаточно для выделения нового блока.
Статический способ
Что касается статического способа выделения памяти, то здесь речь может идти, например, о том, что заранее для фиксированного числа вычислительных процессов резервируются области памяти, в которых будут располагаться переменные реентерабельных программных модулей: для каждого процесса — своя область памяти. Чаще всего в качестве таких процессов выступают процессы ввода-вывода, и речь идет о реентерабельных драйверах.
Повторно входимые программные модули.
Кроме реентерабельных программных модулей существуют еще повторно входимые (re-entrance). Этим термином называют программные модули, которые тоже допускают свое многократное параллельное использование, но, в отличие от реентерабельных, их нельзя прерывать.
Повторно входимые программные модули состоят из привилегированных секций, и повторное обращение к ним возможно только после завершения какой-нибудь из таких секций. После выполнения очередной такой привилегированной секции управление может быть передано супервизору, который может предоставить возможность выполняться другой задаче, а значит, возможно, повторное вхождение в рассматриваемый программный модуль.
Другими словами, в повторно входимых программных модулях четко предопределены все допустимые (возможные) точки входа. Следует отметить, что повторно входимые программные модули встречаются гораздо чаще реентерабельных (повторно прерываемых).
Информационные ресурсы.
В качестве ресурсов могут выступать данные - информационные ресурсы.
Информационные ресурсы могут существовать как в виде переменных, находящихся в оперативной памяти, так и в виде файлов.
Если процессы используют данные только для чтения, то такие информационные ресурсы можно разделять. Если же процессы могут изменять информационные ресурсы, то необходимо специальным образом организовывать работу с такими данными.
Д./З. прочитать из учебника Гордеева. Операционные системы -> $ Процессы и задачи. (или см.презентацию ОС_лекция6+(прочитать).ppt).
[1] Разговор о процессоре как об одном из ресурсов более характерен для мультипроцессорных систем. В случае однопроцессорных систем чаще говорят о процессорном времени.
[2] Процесс обращения к данным.
[3] Реентерабельный — допускающий повторные прерывания (дословный перевод с английского слова «re-enterable»).