
Расчетное задание / КМ2 / Ответы КМ2
.pdf
процесса на CPU с того момента, когда он был переведен из состояния выполнения в готовность или ожидание. Она называется контекст процесса и полностью описывает его состояние в момент прерывания. Для этого она включает в себя состояние регистров, программного счетчика, режим работы CPU, указатели на открытые файлы, коды ошибок и т.д.
Другая структура служит для планирования работы ОС с точки зрения переключения процессов в их функционировании на CPU. В ней хранится информация о степени привилегированности процесса, его состояния(-е), идентификатор процесса и т.д. Часто она называется описанием (дескриптором) процесса. Частично эта информация может пересекаться с контекстом процесса, однако, ее конечная цель совершенно другая – оптимальность планирования процессорного времени или распределения CPU между процессами (программами). В зависимости от понятия оптимальности в конкретной ОС компоненты дескриптора процесса могут варьироваться.
На основе дескрипторов для каждого процесса ОС формирует очереди задач на выполнение, которые могут периодически обновляться.
При запуске программы на выполнение ОС создает процесс, при котором выполняются следующие основные действия:
1.создаются контекст и дескриптор процесса
2.дескриптор создаваемого процесса включается в очередь на выполнение
3.кодовый сегмент программы загружается в оперативную память.
При планировании выполнения процесса решаются следующие основные задачи:
a)определяется время смены выполняемого процесса на CPU
b)в соответствии с установленным в ОС алгоритмом выбирается из очереди процессов следующая задача на выполнение
c)происходит переключение контекстов старого и нового процессов.
Т.к. практически все современные процессоры функционируют в многозадачном режиме, то для ускорения данных операций их стремятся реализовать аппаратно. В частности это касается операции (с).
С точки зрения возможных алгоритмов выбора процесса на выполнение можно выделить следующие основные:
21

I.алгоритм, использующий квантование
II.алгоритм, использующий понятие приоритетов
В(I) для каждого процесса выделяется квант времени, в течение которого он может занимать CPU. После этого процесс вытесняется с CPU в состояние готовность и на выполнение выбирается следующий в очереди. Квант времени может быть одинаковый для каждого процесса или варьироваться в зависимости от его характеристик. Размер кванта также играет существенную роль в типе функционирования системы. Так малые кванты времени наиболее характерны для интерактивных систем, где требуется быстрая реакция системы. Большие кванты времени более подходят для расчетных систем, серверов. Некоторые ОС позволяют настраивать данные кванты, например Linux.
В(II) используется понятие приоритета, которое определяет степень привилегированности процесса по отношению к тому или иному ресурсу. Приоритет обычно выражается целыми числами и обычно чем выше число, тем выше приоритет. В современных системах приоритет также может изменяться в процессе жизни процесса, как пользователем, так и системой. При этом, хотя у пользователя и есть такая возможность, но обычно разработчики ОС не рекомендуют ей пользоваться, ссылаясь на то, что внутренние алгоритмы планирования ОС являются достаточно совершенными и ручная регулировка может сильно их нарушить. Исторически существует два вида использования (II). Алгоритмы абсолютного и относительного приоритетов. В обоих случаях каждый раз на выполнение выбирается процесс с наибольшим приоритетом. Однако, переключение в них реализуется по-разному. В системах с абсолютным приоритетом при появлении в очереди процессов на выполнение процесса с большим приоритетом текущий процесс прерывается. В относительном приоритете процесс продолжает выполняться до окончания своей работы или перехода в состояние ожидания.
Внастоящее время алгоритмы типа (II) сами по себе используются достаточно редко. В современных ОС наиболее часто применяются смесь режима (I) и (II).
Калгоритмам планирования и переключения процессов относятся также два режима планирования переключения процессов или многозадачности: вытесняющая и невытесняющая.
При использовании вытесняющей многозадачности в ОС существует управляющий процесс, который по некоторому критерию (обычно исчерпания кванта времени)
22

вытесняет процесс с CPU в состояние готовности и загружает следующий процесс. Таким образом, ни одна задача не может монополизировать процессор.
При использовании невытесняющей многозадачности сам выполняемый процесс решает, когда покинуть процессор и дать возможность выполниться следующему. Сам механизм переключения реализуется в ОС. Таким образом, плохо написанная программа может парализовать работу ОС.
В настоящее время современные ОС в большинстве своем построены на основе вытесняющее многозадачности. В тоже время надо понимать, что в невытесняющей многозадачности есть свои положительные моменты. Первый заключается в том, что у нас нет центрального управляющего процесса, что немного экономит ресурсы системы. Далее, при правильной реализации задач для невытесняющей системы мы можем избежать ее прерывания в критических местах, например, при управлении технологическим процессом ЯЭ. В вытесняющей многозадачности это реализовать труднее. В невытесняющей многозадачности проще обеспечить режим доступа к разделяемым данным, т.к. каждая задача может быть уверена, что только она одна работает с данным ресурсом. И, наконец, в невытесняющей многозадачности скорость переключения между процессами быстрее. Таким образом, несмотря на определенную устарелость концепции невытесняющей многозадачности, ее использование в специализированных компьютерных системах оправдано.
3.1.1.Проблемы синхронизации процессов
Несмотря на хорошую отлаженность алгоритмов планирования и переключения процессов в современных ОС, некоторые проблемы остаются. В основном это касается трудности синхронизации различных процессов между собой при обращении к разделяемому ресурсу. В этом случае результат зависит от соотношения скоростей разных процессов. Для решения данной проблемы используется синхронизация процессов.
Для этого выделяется понятие критической секции. Это та часть программы, где осуществляется доступ к некому разделяемому ресурсу. Для того, чтобы решить проблему синхронизации необходимо для ОС обеспечить, чтобы в каждый момент времени в критической секции находился только один процесс, что называется взаимным исключением. Наиболее распространенным методом в настоящее время является использование блокирующих переменных, иногда называемых семафорами. Основная
23

идея состоит в присвоении значения 0 переменной, если какой либо процесс использует некий ресурс, и 1, если он свободен. Таким образом, обеспечивается взаимное исключение. Для правильного функционирования системы необходимо обеспечить, чтобы операция запроса состояния семафора и его изменения была бы неделимой. Т.е. в процессе ее выполнения задачу нельзя было бы прервать.
Хотя система блокирующих переменных обеспечивает в современных ОС синхронизацию между процессами, однако, определенные проблемы все же могут возникнуть на алгоритмическом уровне. Пусть, например, у нас имеется некоторый буфер памяти, который совместно могут использовать процессы А и Б. Процесс А читает информацию из буфера, а процесс Б записывает ее. Пусть процесс А пришел в состояние чтения буфера первый, но в буфере ничего еще нет, т.к. процесс Б еще не дошел до точки записи в буфер. Процесс А устанавливает семафор в состояние занятости буфера и переходит в состояние ожидания данных. Теперь, когда процесс Б дойдет до момента записи в буфер, он не сможет это выполнить, т.к. семафор укажет, что ресурс занят. Таким образом, алгоритмическая несогласованность процессов А и Б может привести к их взаимной блокировке. Такого рода проблемы синхронизации решаются наиболее трудно, т.к. они касаются непосредственно особенностей алгоритма некоторых программ. Один из методов решения в современных ОС заключается в возможности для пользователя прекратить выполнение определенных программ.
3.1.2.Нити
При функционировании системы переключения процессов в ОС все они конкурируют за CPU. В тоже время существует целый ряд случаев, когда процессы могут быть не такими независимыми, как в случае выполнения одной задачи. Здесь мы можем использовать понятие нити (multithread), которое широко применяется в современных ОС.
Нити отличаются от процессов тем, что они менее независимы, т.к выполняются в рамках одной задачи. Обычно они позволяют ускорить выполнение общей задачи на основе распараллеливания ее подзадач. В рамках однопроцессорной (одноядерной) системы это наиболее эффективно при использовании работы каждой подзадачи (нити) с разными ресурсами. Например, у нас есть расчетная задача ЯЭ, которая периодически записывает результаты расчетов на жесткий диск. Практика показывает, что их объем может быть достаточно большим – от сотен мегабайт до десятков гигабайт, что будет
24

занимать существенное время. При использовании обычного программирования расчетный процесс в момент записи данных на диск будет простаивать. Если же мы выделим отдельную нить (облегченный процесс), которая будет параллельно к расчету записывать данные, то мы можем получить существенное ускорение. Ясно, что в нашем примере данная нить должна иметь что-то общее с расчетным процессом для выполнения одной глобальной задачи и она должна взаимодействовать, а не бороться с ним.
Нити имеют собственные: программный счетчик, стек, регистры, нити-потомки, состояние. Т.е. все, что позволяет запускать их в многозадачной системе и переключать по описанным выше состояниям готовности, выполнения, ожидания.
В тоже время нити разделяют между собой (имеют общие): адресное пространство, глобальные переменные, открытые файлы, таймеры, семафоры, статистическую информацию. Опять, все те параметры, которые позволяют обеспечить взаимодействие между нитями в рамках одной задачи.
При выполнении нитей на многопроцессорной (многоядерной) компьютерной системе мы получаем дополнительный выигрыш, т.к. нити могут выполняться на разных процессорах (ядрах).
В качестве еще одного примера использования нитей в программах ЯЭ можно предложить следующий. Часто при выполнении расчетных программ надо организовать их работу таким образом, чтобы во время долгого расчета мы могли бы сохранить промежуточные данные на диск, планово закончить расчет и т.п. по запросу пользователя. Один из элегантных методов для реализации может базироваться на запуске параллельной нитки к основному расчетному процессу, чья задача будет заключаться в отслеживании команд пользователя с клавиатуры и передача их расчетному процессу для выполнения требуемого действия.
3.1.3.Гипернити (Hyperthreading)
Спонятием нити (thread) часто путают понятие hyper-threading. В какой-то степени данные понятия пересекаются, однако есть и отличие. Hyper-threading является чисто аппаратной реализацией и используется, начиная с процессора Pentium 4 фирмой Intel [6]. Основная ее суть состоит в том, что определенная часть CPU, та, что ответственна за его состояние, но не за основные выполняющие элементы, дублируется. Таким образом, ОС
25

воспринимает однопроцессорный CPU как 2-х процессорный. Это позволяет ОС с поддержкой СМО направлять на выполнение одновременно два процесса. В обычном CPU при выполнении определенных инструкций или обращению к памяти некоторые или все основные расчетные элементы CPU могут простаивать. В процессоре с hyper-threading данное состояние простоя существенно уменьшается за счет выполнения второго процесса.
По заявлению фирмы Intel возможное ускорение достигает 15-30 %. Однако данное ускорение возможно не всегда, а когда процессы относительно разнородны во время выполнения. Т.е. один процесс выполняет, например, целочисленные инструкции, а второй с плавающей точкой и т.п. Если же процессы интенсивно используют разделенные ресурсы, например, область оперативной памяти, то ускорение не достигается. Так же могут быть проблемы с интенсивным использованием кэш памяти и т.д. При использовании гипер-нитей ускорение достигается, как было сказано ранее, на ОС с поддержкой СМО, однако практически все современные ОС это поддерживают.
Резюмируя можно утверждать, что если на основе использования технологии гипер-нитей ОС идентифицирует 2 логических CPU, то запускать параллельно два схожих расчетных процесса не имеет смысла, т.к. в сумме мы получим общее замедление. Однако если наши процессы (нити) существенно разные, например, офисная программа и расчетная, то заявленное ускорение вполне достижимо.
3.2.Система управления оперативной памятью
Основными функциями по управлению оперативной памятью (ОП) ОС являются:
1.отслеживание свободной и занятой памяти
2.выделение памяти процессам и ее освобождение после их завершения
3.реализация функций виртуальной памяти
4.настройка адресов программы на конкретную область физической памяти
Вначале выделим основные типы адресов:
a)Символьные имена – имена переменных, присваиваемые пользователем при написании программы.
26

b)Виртуальные адреса – адреса, присваиваемые компилятором переменным при обработке исходного текста программы, что образует виртуальное адресное пространство процесса. Размер пространства зависит от разрядности. Например, для 32-х разрядных программ имеем размер 232.
c)Физические адреса – те ячейки памяти, куда программа реально загружается при выполнении.
Преобразование от виртуальных к физическим адресам может выполняться в ОС двумя способами. При использовании перемещающего загрузчика в процессе загрузки программы в память происходит преобразование всех ее виртуальных адресов в реальные, физические. При использовании данного метода преобразование происходит только один раз в процессе выполнения программы, что уменьшает затраты ОС на данные операции. В тоже время это не дает нам возможности перемещать нашу программу в ОП в процессе ее выполнения, что серьезно ухудшает гибкость использования ОП. Другой метод осуществляет динамическое преобразование адресов при каждом обращении к памяти. Таким образом, он является более затратным, однако дает возможность перемещать программу в процессе ее выполнения, что серьезно расширяет возможности использования ОП. Поэтому в настоящее время данный метод управления ОП является доминирующим в современных ОС.
В конкретной реализации методы управления ОП можно разделить на методы использующие или нет виртуальную память.
Методы, не использующие виртуальную память, являются довольно устаревшими в настоящее время в современных ОС. Здесь можно выделить методы, использующие распределение памяти фиксированными и динамическими разделами. В данных методах для настройки адресов программы применяется перемещающий загрузчик. Также существует метод использования ОП на основе перемещающихся разделов, где употребляется динамическое преобразование адресов.
Методы управления ОП на основе виртуальной памяти являются доминирующими в современных ОС. Для начала определим понятие виртуальности. Это такое свойство компьютерной системы, которым оно в реальности не обладает, но создает полную иллюзию присутствия данного свойства. В отношении ОП данное понятие реализуется через формирование виртуальной памяти, которая строиться из самой ОП, памяти на других устройств (обычно жестких дисков) и которая может быть существенно больше чем размер ОП. При работе с виртуальной памятью программа имеет полную иллюзию,
27

что у нее имеется вся доступная однородная память данного размера, хотя размер ОП, используемый при выполнении программы, является в реальности гораздо меньшим. В процессе выполнения программы ОС размещает данные на запоминающих устройствах виртуальной памяти, при необходимости перемещает данные между ними, преобразует виртуальные адреса в физические. Данный механизм виртуальной памяти для пользователя/программиста является абсолютно прозрачным.
Существует два механизма организации виртуальной памяти - страничный и сегментный. При использовании страничного механизма все виртуальное адресное пространство процесса разбивается на разделы одинакового размера – виртуальные страницы. Их размер выбирается кратным 2-м. В современных ОС этот размер обычно равен 4 килобайтам. На страницы того же размера делится вся виртуальная память – физические страницы. При загрузке процесса ОС создает для каждого процесса информационную структуру – таблицу страниц, где устанавливает соответствие между виртуальными и физическими страницами. Кроме того, в данной информационной структуре указывается местоположение страниц на устройствах виртуальной памяти, признаки модификации страницы, невыгружаемости, частота обращений.
При выполнении процесса в специальный регистр процессора загружается адрес таблицы страниц данного процесса. При обращении к памяти происходит автоматическая переадресация от виртуальных адресов к физическим. Если нужная виртуальная страница в данный момент отсутствует в ОП, то вырабатывается страничное прерывание. При этом текущий процесс переводится в состояние ожидания, а программа обработки страничного прерывания производит поиск нужной страницы на других устройствах. После нахождения нужной страницы она пытается переместить ее в ОП. Если свободные страницы в ОП отсутствуют, то решается вопрос о том, какие страницы могут быть выгружены из ОП. При этом анализируются признаки страниц, указанные выше. Если страница помечена невыгружаемой, то она остается в памяти. Наибольшее предпочтение при выгрузке может быть отдано страницам с наименьшей частотой обращение в последнее время. При этом, если не стоит признак модификации страницы, то она просто затирается новой страницей в ОП. В противном случае она обновляется на внешнем устройстве виртуальной памяти. Страницы, наиболее часто используемые, обычно формируют рабочее множество, и ОС стремится сохранять их постоянно в ОП.
Страничный механизм виртуальной памяти не позволяет дифференцировать разные области программ, сегменты данных, кода и т.д. Это не дает возможности
28

регулировать доступ к разным логическим частям процесса или объявить их в совместный доступ, что позволило бы сэкономить ресурсы ОП. Для того, чтобы учесть все это, был введен сегментный механизм виртуальной памяти. Структурно он сильно похож на функционирование страничного механизма. Для каждого процесса выделяются смысловые сегменты. В момент загрузки для процесса создается таблица сегментов, позволяющая определить адрес виртуальной памяти, где реально размещен сегмент. Остальные признаки похожи на таблицу страниц, хотя есть некоторые дополнительные (?), которые указывают правила доступа к соответствующему сегменту. При использовании несколькими процессами одного и того же сегмента в их таблицах просто указывается один и тот же адрес виртуальной памяти. В остальном сегментный механизм функционирует схожим образом как и страничный, за исключением того, что все операции производятся по отношению к сегментам, а не страницам. Основные недостатки данного механизма заключаются во фрагментации на уровне сегментов и более медленным по сравнению со страничным преобразовании адресов.
Для решения проблем страничного и сегментного механизмов виртуальной памяти в современных ОС используется странично - сегментный механизм. Он призван решить проблемы, присутствующие в обоих подходах. Как и ранее в сегментном подходе в процессе выделяются логические сегменты. Так же как и в страничном механизме, адресное пространство процесса и виртуальная память разделяется на страницы. Т.е. каждый сегмент в свою очередь автоматически делится на страницы. После загрузки процесса создается таблица сегментов и для каждого сегмента создается таблица страниц. В таблице сегментов указывается адреса соответствующих таблиц страниц для каждого сегмента. Таким образом, при обращении процесса к определенному виртуальному адресу определяется его сегмент, и после чего по таблице сегментов определяется соответствующая таблица страниц. Далее виртуальная память функционирует по рассмотренному ранее страничному механизму.
При использовании компьютерных систем в ЯЭ необходимо учесть следующие аспекты, связанные с работой ОС с ОП. Т.к. в настоящее время доминируют ОС со странично - сегментной организацией, то мы должны выбрать оптимальные условия ее функционирования.
Первый вопрос касается размера виртуальной памяти. Эвристическое правило его определения есть размер больший в 3-4 раза от ОП, что позволяет параллельно выполнять 3 – 4 программы с требованиям к виртуальному адресному пространству размером с ОП
29

на компьютерной системе. Если же у нас имеется мощный расчетный сервер с большим объемом ОП, а предполагаемые требования запускаемых программ достаточно малы по сравнению с физическим объемом ОП, то размер виртуальной памяти может быть серьезно уменьшен или даже сведен просто к ОП. При этом надо учесть, что в системах семейства MS Windows NT виртуальная память устанавливается автоматически по умолчанию и часто не соответствует оптимальным параметрам. Установка жесткого размера виртуальной памяти в отличие от автоматической его регулировки, как реализуется в MS Windows NT, позволит избежать ее фрагментации на диске и соответствующего замедления страничных операций.
Второй вопрос касается размещения страниц виртуальной памяти на внешних устройствах. Очевидно, что это должно быть наиболее быстрое устройство в системе. В настоящее время, как правило, это жесткие диски. Поэтому мы должны выбрать наиболее быстрый физический жесткий диск, желательно при прочих равных условий на нем не должна быть установлена наша ОС для ускорения дисковых операций при распараллеливании работы контролера. Оптимально, если у нас имеется специальная файловая система, или лучше даже ее отсутствие как в системе Linux. В случае системы MS Windows такого нет, поэтому лучше всего выделить специальный раздел для виртуальной памяти и образовать ее изначально на весь размер раздела, чтобы избегнуть последующей фрагментации.
3.2.1.Кэш память
Кэш памятью называется способ организации совместного функционирования двух компьютерных компонент, запоминающих устройств, которые отличаются быстродействием и стоимостью. Т.е. у нас имеется устройство с быстрой выборкой информации, но дорогое и наоборот. Механизм функционирования кэш памяти прозрачен для пользователя. Кэширование применяется процессором, жёсткими дисками, браузерами, веб-серверами, службами DNS и т.д.
Посмотрим, как кэш памяти работает с ОП. Для этого в современных компьютерных системах используется память отличная от ОП, являющейся существенно более быстрой в выборке данных. Кэш память состоит из набора записей. Каждая запись ассоциирована с элементом данных находящимся в ОП и имеет соответствующий идентификатор, определяющий связь между данными в кэш памяти и в ОП. При
30