Программа в стадии выполнения это

Как можно определить понятие жизни программы? Жизнь программы можно описать повторяющейся последовательностью конечных процессов в компьютере выполненных в контексте выбранной предметной области. Обязательно конечных, в каком-то разумном временном отрезке.

design

Когда появляется программа? Скорее всего, программа появляется в голове у проектировщика/разработчика, можно назвать это design-time. Но так как этот момент не поддаётся контролю компьютера (пока), то предположим, что моментом появления программы является момент создания минимального запускаемого (о подробном смысле этого термина стоит поговорить отдельно) исходного кода.

В контексте модульных языков или языков с ООП — программа рождается, когда появляется минимальный модуль/класс. Дальнейшее рассмотрение будем проводить для модульных систем, так как в немодульных/скриптовых системах те или иные этапы обычно редуцированы/слеплены в единый этап.

Можно обоснованно выделить design-time в отдельную категорию, но не как процесс в голове разработчика, а чисто утилитарно, опираясь на процесс кодирования. Здесь можно описать автокомплит, автоподсветку (как уже реализованные программы), программирование макросов ide, генерацию схем БД и ДРАКОН-схем, и так далее.

Лекция 6: Выполнение программы на компьютере

compile

Затем, после этапа написания некоторого программного кода, программа передается компилятору. Компилятор обеспечивает т.н. compile-time — время компиляции. В результате выполнения процесса компиляции мы получаем компилят (то есть непосредственный результат обработки нашего исходного кода).

Во время компиляции наш исходный код влияет на работу компилятора по определенным законам, которые выражены в коде компилятора.

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

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

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

load

После получения компилята, над ним, сразу или отложенно должен быть исполнен процесс связывания или линковки. Так как компилят обычно хранится в файле, то возникает время загрузки — load-time.

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

На данный момент известна только одна технология, WebAssembly (slim-binaries), поздняя кодогенерация на целевой платформе, которая хоть как-то описывает время загрузки.

Структура и порядок выполнения программы. #Include. using namespace. C++ для начинающих. Урок #2.

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

Эта ситуация в многомодульной системе приводит к необходимости связывания. В старых системах связывание могло производиться непосредственно после компиляции, но этот вырожденный случай мы не рассматриваем. Итак, возникает время связывания, или link-time.

Мало что известно про выполнение кода во время связывания, однако понятно, что в момент связывания возможно выполнение кода, например, Dependency Injection и динамического наследования/проксирования, как это может быть реализовано в рамках работы внутри jvm.

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

init, run, close

Запуск и дальнейшая работа. Наиболее известные широкой публике этапы. Представлены временем инициализации (init-time) и временем исполнения (run-time). В сущности, результат работы этого этапа жизненного цикла и является обычно непосредственной целью написания программы.

Можно дополнительно выделить время завершения работы программы (close-time). Однако сейчас все три времени работы обычно принято называть run-time, а логическое деление на три этапа реализовывать уже в рамках клиентского программного кода.

Такой подход снижает требования к среде исполнения (run-time environment) но не дает гарантий исполнения того или иного этапа в нужной последовательности из-за возможных ошибок исполнения (run-time error) после которых исполнение, обычно, должно завершиться аварийно.

death

Отдельным важным временем жизни программы является посмертное время (death-time), в которое, вопреки распространенным представлениям тоже является частью жизненного цикла программы. Объяснение тут простое, так как целью работы программы обычно является некий результат, обычно зависящий от входных данных, которых может быть очень много, программы строятся с применением методов, позволяющих итеративно обрабатывать входные данные и производить выходные данные, которые могут быть поданы на вход следующей итерации.

Обычно такие данные структурированы (БД), версионны (результат взаимодействия со сторонним API) и их содержимое и интерпретация зависит от реализации работающей программы. То есть, программа это алгоритмы и данные, в том числе внешние и степень связанности этих внешних данных с программой никак не влияет на сам факт наличия такой связанности на любом этапе жизненного цикла.

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

Итоги

Итак, рассмотрены этапы жизни программы: design-time -> compile-time -> load-time -> link-time -> init-time -> run-time -> close-time -> death-time. Как можно заметить, все этапы присутствует в цикле разработки и использования любой программы, а значит в любой из этих этапов может быть выполнен пользовательский код, который позволит получить результат, наиболее соответствующий целям разработчика. На сегодняшний день нет такого языка, фреймворка или экосистемы, в котором данные этапы были бы реализованы во всей полноте. Науке, бизнесу и сообществу есть куда стремиться.

Источник: habr.com

Лекция 4 5.1 Понятие процесса

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

Процесс собирает и хранит адреса областей на внешних устройствах и оперативной памяти где располагаетюданные (переменные и константы) и куда их нужно направить. С каждым процессом связывается его адресное пространство: список адресов от минимума до максимума, который процесс может прочесть и в которые он может писать. Также он имеет адреса свободной динамической памяти: куча (heap) и стек (stack), в которых будут хранится данные расчетов. В стеке сидят указатели на адреса данных. В «куче» находятся сами структуры данных, которые бывают различными, «запись» и «масив» и т.д.Область стека примыкает к куче расширяется за ее счет.

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

5.2 Частным проявлением процесса являются потоки (threads). Потоки порождаются процессом если есть возможность параллельно выполнять различные части программы на томже самом или разных процессорах и устройствах. Потоки это «дочки процесса» (childprocess).

Потоки используют даные и переменные их родного процесса, но имееют свои контекст кода программы и стека.Процессы создаются при выполненииипребразованийпрограммы до машинного кода с использованием составных части операционной системы как компиляторы, драйверы связывания с библиотеками ОС (linking), загрузчики (loading), драйверы файловой системы (запись/чтение на носители),драйверы исполнения (execution). После каждой операции объем программы заметно возрастает, а сама программа получает другое имя расширения – obj, lnk, exe. С этими процеесами мы сталкиваемся каждый раз при «установке» программы.

Процесс представляет собой отдельныйфайл, которыйво время исполнения имеет в памяти свои независимые области для кода и данных. В отличие от него потоки мо­гут пользоваться общими участками кода и данных. Так как множество потоков способ­но размещаться внутри одного EXE-модуля, это позволяет экономить ре­сурсы как внешней, так и внутрен­ней памяти.

Читайте также:
Установить программу для почты

Современные управляющие устройства состоят из нескольких вычислительных процессоров, соединенных между собой с помощью шины связи. Например, в програмируемх контроллерах есть основной процессор, но в каждом модуле ввода/вывода (МВА, МВД, МВВА, МВДА и другие) есть свой собственный процессор. Можно заставить программу пытаться паралельно исполнять операции уже на стадии написания программы.

Пара операторных скобок cobegin и coend приводит к генерации параллельных потоков в рамках многозадачных систем. Для однозадачной системы конечный Х был бы равен 3. Для случая паралельных потоков результат предсказать нельзя. Какая команда выполнится последней таково и будет значение Х.

В период своего существования процесс проходит через ряд дискретных состояний: — выполняется, если в данный момент времени ему выделен ЦП — готов, если он мог бы сразу использовать ЦП, предоставленный в его распоряжение — блокирован, если он ожидает появление какого-либо события

5.3 Когда в операционную систему поступает какое то задание на выполнение программы, она создает соответствующие процессы, которые затем устанавливаются в конец списка готовых процессов. Этот процесс постепенно продвигается к головной части списка по мере завершения выполнения предыдущих процессов.

Когда процесс окажется первым в списке готовых и когда освобождается ЦП, этому процессу выделяется ЦП, и происходит смена состояния процесса (переходит из состояния готовности в состояние выполнения). Чтобы предотвратить либо монопольный захват ресурсов компьютера каким-то одним процессом, ОС устанавливает в специальном аппаратном таймере прерываний временной интервал, в течении которого любому процессу разрешается занимать ЦП. Если процесс добровольно не освобождает ЦП в течение указанного временного интервала, таймер вырабатывает сигнал прерывания, по которому управление будет передано ОС. После этого ОС переведет ранее выполнявшийся процесс в состояние готовности, а первый процесс списка готовых – в состояние выполнения.

Представителем процесса в ОС является блок управления процессом (дескриптор процесса). Это структура данных, содержащая: идентификатор процесса, приоритет процесса, состояние, указатели памяти, указатели выделенных ресурсов. Когда ОС переключает ЦП с процесса на процесс, она использует области сохранения регистров, предусмотренные в блоке управления процессом, чтобы запомнить информацию, необходимую для рестарта каждого процесса, необходимую при следующем обращении процесса к ЦП.ОС предусматривает следующие операции над процессами: Создание, — Уничтожение, — Возобновление, — Блокирование, — Пробуждение, — Выбор

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

Лекция 5. 6.1Понятие ресурса, так же как и понятие процесса, являетсяосновным при рассмотрении операционных систем. Ресурсом называется всякий объект, который может распределяться внутри системы. Ресурсы могут быть разделяемыми, когда несколько процессов могут их исполь­зовать одновременно (в один и тот же момент времени) или параллельно (в течение некоторого интервала времени процессы используют ресурс поперемен­но), а могут быть и неделимыми.

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

Задача (т.е процесс или поток) обращается к супервизору операционной системы — ее центральному управляющему моду­лю, посредством специальных запросов (вызовов и команд) и сообщает о своем тре­бовании. При этом указывается приоритет, вид ресурса и его объем. Приоритет – это целое число, присваиваемое задаче и характеризую­щее ее важность по сравнению с други­ми задачами, выполняемыми в системе. Приоритет используется планировщиком задач для определе­ния того, какая из готовых к работе за­дач должна получить управление. Ресурс выделется задаче, обратившейся к супервизору с запросом, если он свободен и в системе нет запросов от задач более высокого приоритета к этому же ресурсу; Текущий запрос и ранее выданные запросы допускают совместное использование ресурсов; Ресурс используемый задачей низшего приоритета может быть временно отобран (разделяемый ресурс).

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

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

Для этого занимаемая процессом память разбивается на несколько частей, назыкаемых страницами.Часть страниц находится в ОЗУ, другая часть должна быть на внешней пямяти. Для контроля наличия страницы во внешней памяти процессом вводится специальный бит присутствия, входящий в состав атрибутов страницы в таблице страниц.

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

Каждый процесс получет в своё распоряжение дополнительное адресное пространство.Виртуальная память является логическим представлением расположения информации в памятина внешнем носителе и не является хранилищем самих страниц. Блок управления памятью (memorymanagementunit, MMU) — компонент аппаратного обеспечения компьютера, отвечающий за управление доступом к памяти, запрашиваемым центральным процессором. Его функции заключаются в трансляции адресов виртуальной памяти в адреса внешней физической памяти.Менеджер памяти откачивает часть данных на вторичное хранилище и указывает это в виртуальной памяти.

В результате процессы используют существенно меньше физической памятиОЗУ, чем им доступно через виртуальную.Как физическая так и виртуальная память делится на части фиксированного размера, называемые страницами (Page). Процессоры х86 делят физическое адресное пространство на страницы размером 5кВ, используя для этого устройство управления памятью MMU (MemoryManagementUnit). При выполнении процесса в физическую память загружаются лишь используемые страницы, остальные же хранятся во вторичной памяти.

Когда процесс обращается по виртуальному адресу, к данным хранящемися в массовой памяти, менеджер памяти загружает требуемую страницу в основную память. Приложения не должны учитывать откачку/подкачку страниц — этим с аппаратной поддержкой занимается менеджер памяти, и весь процесс незаметен для приложений. Для увеличения объема виртуальной памяти необходимо войти в систему с учетной записью «Администратор». Если компьютер подключен к сети, то параметры сетевой политики могут запретить выполнение данной процедуры.

Адресное пространство виртуальной памяти зависит от аппаратной платформы. Так, адресное пространство 32-битных х86 систем составляет 4ГБ. Операционные системы, работающие с этими платформами не могут видить большие объемы ОЗУ, хотя физически память установлена.

Физической памяти (ОЗУ) компьютера должно быть достаточно, чтобы в нее поместились все текущие страницы пользовательских программ. Если основной памяти не хватает, то производительность системы резко падает из-за ошибок страниц и, соответственно постоянного подкачивания страниц.

Ошибка страница (PageFault) — это ситуация, когда процесс обращается по логическому адресу, но соответствующая страница не загружена в основную память. Если возникает ошибка страницы, ОС запускает процедуру управления ошибка страниц, которая блокирует обратившийся по этому адресу процесс, находит во виртуальной вторичной памяти требуемую страницу и загружает её в основную память. Затем процедура управления ошибками обновляет запись страницы физическим адресом и запускает заблокированный процесс, чтобы тот мог возобновить свою работу.

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

Читайте также:
Сделать свой установщик программ

Процессы при этом простаивают в ожидании страниц. Такая ситуация называется пробуксовкой (Thrashing). Это патологическая ситуация, когда ОС тратит большую часть времени на разрешение ошибок страниц, а процессы не могут выполнять свои задачи. Для решения этой проблемы ОС должна сократить число запущенных процессов. Этого можно выполнить блокировкой поцесса и переносом его на жёсткий диск, высвободив при этом место в основной памяти.

Источник: cyberpedia.su

gosy_voprosy / вопрос_23

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

Термин «процесс» впервые появился при разработке операционной системы Multix и имеет несколько определений, которые используются в зависимости от контекста, согласно которым процесс — это:

— программа на стадии выполнения;

— «объект», которому выделено процессорное время;

Для описания состояний процессов используется несколько моделей. Самая простая — модель трех состояний. Она определяет следующие состояния процесса:

Выполнение — это активное состояние, во время которого процесс обладает всеми необходимыми ему ресурсами. В этом состоянии процесс непосредственно выполняется процессором.

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

Готовность — это тоже пассивное состояние, процесс тоже заблокирован, но в отличие от состояния ожидания, он заблокирован не по внутренним причинам (ведь ожидание ввода данных — это внутренняя, «личная» проблема процесса — он может ведь и не ожидать ввода данных и свободно выполняться — никто ему не мешает), а по внешним, независящим от процесса, причинам.

Из состояния готовности процесс может перейти только в состояние выполнения. В состоянии выполнения может находится только один процесс на один процессор. Если у вас n-процессорная машина, у вас одновременно в состоянии выполнения могут быть n процессов. Из состояния выполнения процесс может перейти либо в состояние ожидания, либо в состояние готовности.

Более сложная модель — это модель, состоящая из пяти состояний. В этой модели появилось два дополнительных состояния: рождение процесса и смерть процесса.

Рождение процесса — это пассивное состояние, когда самого процесса еще нет, но уже готова структура для появления процесса.

Смерть процесса — самого процесса уже нет, но может случиться, что его «место», то есть структура данных, осталась в списке процессов. Такие процессы называются зобми.

Над процессами можно производить следующие операции:

— Создание процесса — это переход из состояния рождения в состояние готовности;

— Уничтожение процесса — это переход из состояния выполнения в состояние смерти;

— Восстановление процесса — переход из состояния готовности в состояние выполнения;

— Изменение приоритета процесса — переход из выполнения в готовность;

— Блокирование процесса — переход в состояние ожидания из состояния выполнения;

— Пробуждение процесса — переход из состояния ожидания в состояние готовности;

— Запуск процесса (или его выбор) — переход из состояния готовности в состояние выполнения.

Процесс не может взяться из ниоткуда: его обязательно должен запустить какой-то процесс. Процесс, запущенный другим процессом, называется дочерним (child) процессом или потомком. Процесс, который запустил новый процесс называется родительским (parent), родителем или просто — предком. У каждого процесса есть два атрибута — PID (Process ID) — идентификатор процесса и PPID (Parent Process ID) — идентификатор родительского процесса.

Процессы создают иерархию в виде дерева. Самым «главным» предком, то есть процессом, стоящим на вершине этого дерева, является процесс init (PID=1).

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

Под словом «поток» имеется в виду «поток команд», то есть последовательность инструкций, которые считывает и исполняет процессор.

Все потоки процесса разделяют общие ресурсы. Изменения, вызванные одним потоком, становятся немедленно доступны другим.

При корректной реализации потоки имеют определенные преимущества перед процессами. Им требуется:

— меньше времени для создания нового потока, поскольку создаваемый поток использует адресное пространство текущего процесса;

— меньше времени для завершения потока;

— меньше времени для переключения между двумя потоками в пределах процесса;

— меньше коммуникационных расходов, поскольку потоки разделяют все ресурсы, и в частности адресное пространство. Данные, продуцируемые одним из потоков, немедленно становятся доступными всем другим потокам.

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

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

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

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

— Эффективное использование ресурсов системы — программы, использующие два или более процессов, которые имеют доступ к общим данным через разделяемую память, содержат более одного потока управления. При этом каждый процесс имеет полное адресное пространство и состояние в операционной системе. Стоимость создания и поддержания большого количества служебной информации делает каждый процесс более затратным, чем поток. Кроме того, разделение работы между процессами может потребовать от программиста значительных усилий, чтобы обеспечить связь между потоками в различных процессах или синхронизировать их действия.

С каждым потоком связывается:

— Счетчик выполнения команд;

— Регистры для текущих переменных;

Потоки делят между собой элементы своего процесса:

ВЫПОЛНЕНИЕ – активное состояние потоков, во время которого поток обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;

ОЖИДАНИЕ – пассивное состояние потока, процесс заблокирован, он не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого потока, освобождения какого-либо необходимого ему ресурса;

ГОТОВНОСТЬ – также пассивное состояние потока, но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: поток имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого потока.

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

В состоянии ВЫПОЛНЕНИЕ в однопроцессорной системе может находиться только один процесс, а в каждом из состояний ОЖИДАНИЕ и ГОТОВНОСТЬ — несколько процессов, эти процессы образуют очереди соответственно ожидающих и готовых процессов. Жизненный цикл процесса начинается с состояния ГОТОВНОСТЬ, когда процесс готов к выполнению и ждет своей очереди. При активизации процесс переходит в состояние ВЫПОЛНЕНИЕ и находится в нем до тех пор, пока либо он сам освободит процессор, перейдя в состояние ОЖИДАНИЯ какого-нибудь события, либо будет насильно «вытеснен» из процессора, например, вследствие исчерпания отведенного данному процессу кванта процессорного времени. В последнем случае процесс возвращается в состояние ГОТОВНОСТЬ. В это же состояние процесс переходит из состояния ОЖИДАНИЕ, после того, как ожидаемое событие произойдет.

Алгоритмы планирования процессов

Планирование процессов включает в себя решение следующих задач:

Читайте также:
Топ бесплатных программ для записи экрана компьютера

  1. определение момента времени для смены выполняемого процесса;
  2. выбор процесса на выполнение из очереди готовых процессов;
  3. переключение контекстов «старого» и «нового» процессов.

Первые две задачи решаются программными средствами, а последняя в значительной степени аппаратно (см. раздел 2.3. «Средства аппаратной поддержки управления памятью и многозадачной среды в микропроцессорах Intel 80386, 80486 и Pentium»). Существует множество различных алгоритмов планирования процессов, по разному решающих вышеперечисленные задачи, преследующих различные цели и обеспечивающих различное качество мультипрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: алгоритмы, основанные на квантовании, и алгоритмы, основанные на приоритетах. В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:

  • процесс завершился и покинул систему,
  • произошла ошибка,
  • процесс перешел в состояние ОЖИДАНИЕ,
  • исчерпан квант процессорного времени, отведенный данному процессу.

Процесс, который исчерпал свой квант, переводится в состояние ГОТОВНОСТЬ и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение в соответствии с определенным правилом выбирается новый процесс из очереди готовых. Таким образом, ни один процесс не занимает процессор надолго, поэтому квантование широко используется в системах разделения времени. Граф состояний процесса, изображенный на рисунке 2.1, соответствует алгоритму планирования, основанному на квантовании. Кванты, выделяемые процессам, могут быть одинаковыми для всех процессов или различными. Кванты, выделяемые одному процессу, могут быть фиксированной величины или изменяться в разные периоды жизни процесса. Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить или не получить компенсацию в виде привилегий при последующем обслуживании. По разному может быть организована очередь готовых процессов: циклически, по правилу «первый пришел — первый обслужился» (FIFO) или по правилу «последний пришел — первый обслужился» (LIFO). Другая группа алгоритмов использует понятие «приоритет» процесса. Приоритет — это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии. Приоритет может выражаться целыми или дробными, положительным или отрицательным значением.Чем выше привилегии процесса, тем меньше времени он будет проводить в очередях. Приоритет может назначаться директивно администратором системы в зависимости от важности работы или внесенной платы, либо вычисляться самой ОС по определенным правилам, он может оставаться фиксированным на протяжении всей жизни процесса либо изменяться во времени в соответствии с некоторым законом. В последнем случае приоритеты называются динамическими. Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты. В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности. На рисунке 2.2 показаны графы состояний процесса для алгоритмов с относительными (а) и абсолютными (б) приоритетами. Рис. 2.2. Графы состояний процессов в системах (а) с относительными приоритетами; (б)с абсолютными приоритетами Во многих операционных системах алгоритмы планирования построены с использованием как квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов. Вытесняющие и невытесняющие алгоритмы планирования Существует два основных типа процедур планирования процессов — вытесняющие (preemptive) и невытесняющие (non-preemptive). Non-preemptive multitasking — невытесняющая многозадачность — это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс. Preemptive multitasking — вытесняющая многозадачность — это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей. Понятия preemptive и non-preemptive иногда отождествляются с понятиями приоритетных и бесприоритетных дисциплин, что совершенно неверно, а также с понятиями абсолютных и относительных приоритетов, что неверно отчасти. Вытесняющая и невытесняющая многозадачность — это более широкие понятия, чем типы приоритетности. Приоритеты задач могут как использоваться, так и не использоваться и при вытесняющих, и при невытесняющих способах планирования. Так в случае использования приоритетов дисциплина относительных приоритетов может быть отнесена к классу систем с невытесняющей многозадачностью, а дисциплина абсолютных приоритетов — к классу систем с вытесняющей многозадачностью. А бесприоритетная дисциплина планирования, основанная на выделении равных квантов времени для всех задач, относится к вытесняющим алгоритмам. Основным различием между preemptive и non-preemptive вариантами многозадачности является степень централизации механизма планирования задач. При вытесняющей многозадачности механизм планирования задач целиком сосредоточен в операционной системе, и программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст. При невытесняющей многозадачности механизм планирования распределен между системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения своей очередной итерации и передает управление ОС с помощью какого-либо системного вызова, а ОС формирует очереди задач и выбирает в соответствии с некоторым алгоритмом (например, с учетом приоритетов) следующую задачу на выполнение. Такой механизм создает проблемы как для пользователей, так и для разработчиков. Для пользователей это означает, что управление системой теряется на произвольный период времени, который определяется приложением (а не пользователем). Если приложение тратит слишком много времени на выполнение какой-либо работы, например, на форматирование диска, пользователь не может переключиться с этой задачи на другую задачу, например, на текстовый редактор, в то время как форматирование продолжалось бы в фоновом режиме. Эта ситуация нежелательна, так как пользователи обычно не хотят долго ждать, когда машина завершит свою задачу. Поэтому разработчики приложений для non-preemptive операционной среды, возлагая на себя функции планировщика, должны создавать приложения так, чтобы они выполняли свои задачи небольшими частями. Например, программа форматирования может отформатировать одну дорожку дискеты и вернуть управление системе. После выполнения других задач система возвратит управление программе форматирования, чтобы та отформатировала следующую дорожку. Подобный метод разделения времени между задачами работает, но он существенно затрудняет разработку программ и предъявляет повышенные требования к квалификации программиста. Программист должен обеспечить «дружественное» отношение своей программы к другим выполняемым одновременно с ней программам, достаточно часто отдавая им управление. Крайним проявлением «недружественности» приложения является его зависание, которое приводит к общему краху системы. В системах с вытесняющей многозадачностью такие ситуации, как правило, исключены, так как центральный планирующий механизм снимет зависшую задачу с выполнения. Однако распределение функций планировщика между системой и приложениями не всегда является недостатком, а при определенных условиях может быть и преимуществом, потому что дает возможность разработчику приложений самому проектировать алгоритм планирования, наиболее подходящий для данного фиксированного набора задач. Так как разработчик сам определяет в программе момент времени отдачи управления, то при этом исключаются нерациональные прерывания программ в «неудобные» для них моменты времени. Кроме того, легко разрешаются проблемы совместного использования данных: задача во время каждой итерации использует их монопольно и уверена, что на протяжении этого периода никто другой не изменит эти данные. Существенным преимуществом non-preemptive систем является более высокая скорость переключения с задачи на задачу. Примером эффективного использования невытесняющей многозадачности является файл-сервер NetWare, в котором, в значительной степени благодаря этому, достигнута высокая скорость выполнения файловых операций. Менее удачным оказалось использование невытесняющей многозадачности в операционной среде Windows 3.х. Однако почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений (UNIX, Windows NT, OS/2, VAX/VMS), реализована вытесняющая многозадачность. В последнее время дошла очередь и до ОС класса настольных систем, например, OS/2 Warp и Windows 95. Возможно в связи с этим вытесняющую многозадачность часто называют истинной многозадачностью.

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru