Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов, страница 10
Описание файла
PDF-файл из архива "Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 10 страницы из PDF
Далее процесспереходит в состоянии зомби, а затем уничтожается.планирование процессовfork()СозданГотов квыполнениюочередь готовыхпроцессовРодительвызывает wait()ЗомбиВыполняетсяВ режиме ядраВ пользовательскомрежимевнешнее событиеexit()системный вызов;прерываниеБлокированожидает внешнегособытияРис. 12 Жизненный цикл процесса в ОС UNIX.4.7 Начальная загрузка.процессов.ФормированиеОи1Рассмотрим подробнее, что происходит в момент начальнойзагрузки OC UNIX. Начальная загрузка – это загрузка ядра системыв основную память и ее запуск.
Нулевой блок каждой файловойсистемы предназначен длязаписи короткой программы,выполняющей начальную загрузку. Начальная загрузка выполняетсяв несколько этапов.1.Аппаратный загрузчик читает нулевой блок системногоустройства.2.После чтения этой программы она выполняется, т.е. ищетсяи считывается в память файл /unix, расположенный в корневомкаталоге и который содержит код ядра системы.3.Запускается на исполнение этот файл.В самом начале ядром выполняются определенные действияпо инициализации системы, а именно, устанавливаются системныечасы (для генерации прерываний), формируется диспетчер памяти,формируютсязначения некоторых структур данных (наборыбуферов блоков, буфера индексных дескрипторов) и ряд других. Поокончании этих действий происходит инициализация процесса сномером "0".
По понятным причинам для этого невозможноиспользовать методы порождения процессов, изложенные выше, т.е.с использованием функций fork() и exec(). При инициализации56этого процесса резервируется память под его контекст иформируется нулевая запись в таблице процессов. Основнымиотличиями нулевого процесса являются следующие моменты:- Данный процесс не имеет кодового сегмента , этопросто структура данных, используемая ядром ипроцессом его называют потому, что онкаталогизирован в таблице процессов.- Он является чисто системным процессом, т.е.существует в течении всего времени работы системыи считается, что он активен, когда работает ядро ОС.Далее ядро копирует "0" процесс и создает "1" процесс.Алгоритм создания этого процесса напоминает стандартнуюпроцедуру, хотя и носит упрощенный характер.
Сначала процесс"1" представляет собой полную копию процесса "0" , т.е. у него нетобласти кода. Далее происходит увеличение его размера и во вновьсозданную кодовую область копируется программа, реализующаясистемный вызов exec(), необходимый для выполнения программы/etc/init.На этом завершается подготовка первых двухпроцессов. Первый из них представляет собой структуру данных,при помощи которой ядро организует мультипрограммный режим иуправление процессами.
Второй – это уже подобие реальногопроцесса. Далее ОС переходит к выполнению программ диспетчера.Диспетчер наделен обычными функциями и на первом этапе у негонет выбора – он запускает exec(), который заменит командыпроцесса "1" кодом, содержащимся в файле /etc/init.Получившийся процесс, называемый init, призван настраиватьструктуры процессов системы. Далее он подключает интерпретаторкоманд к системной консоли. Так возникает однопользовательскийрежим, так как консоль регистрируется с корневыми привилегиямии доступ по каким-либо другим линиям связи невозможен. Привыходе из однопользовательского режима init создаетмногопользовательскую среду. С этой целью для каждого активногоканала связи, т.е.
каждого терминала, init создает отдельныйпроцесс, выполняющий команду getty. Эта программа ожидаетвхода в систему кого-либо по каналу связи. Далее, используясистемный вызов exec(), getty передает управление программеlogin, проверяющей пароль. Во время работы ОС процесс initожидает завершения одного из порожденных им процессов (т.е.окончания сессии работы с системой), после чего он активизируетсяи создает для соответствующего терминала новый процесс gettyвзамен завершившегося . Таким образом, процесс init57поддерживает многопользовательскую структуру во времяфункционирования системы.
Схема описанного “круговорота”представлена на Рис. 13initinitПосле окончанияработы shellсоздает новый gettyfork()/exec()gettyПечатает login: иожидает входа всистемуневерныйпарольвводпароляокончаниеработыshellВыполняетпользовательскиепрограммыloginЗапрашиваетпароль и проверяетеговерныйпарольРис. 13 Поддержка многопользовательской работы в ОС UNIX.4.8 Планирование процессов в ОС UNIX.Планирование процесса, которому предстоит занять времяцентрального процессора, основывается на понятии приоритета.Каждому процессу сопоставляется некоторое целое числовоезначение его приоритета (в т.ч., возможно, и отрицательное).
Общееправило таково: чем больше числовое значение приоритетапроцесса, тем меньше его приоритет, т.е. наибольшие шансы занятьвремя ЦП будут у того процесса, у которого числовое значениеприоритета минимально.Итак, числовое значение приоритета, или просто приоритетпроцесса - это параметр, который размещен в таблице процессов, ипо значению этого параметра осуществляется выбор очередногопроцесса для продолжения работы и принимается решение оприостановке работающего процесса. Приоритеты системных ипользовательских процессов вычисляются по-разному. Рассмотрим,как это происходит для пользовательского процесса.В общем случае, значение приоритета есть некоторая функцияP_PRI= F(P_NICE, P_CPU)Т.е. в вычислении приоритета P_PRI используются двеизменяемые составляющие - P_NICE и P_CPU (в простейшем случаеэти составляющие просто суммируются).
P_NICE - это58пользовательская составляющая приоритета.Его начальноезначение полагается равным системной константе NZERO, в процессевыполнения процесса P_NICE может модифицироваться системнымвызовом nice(). Аргументом этого системного вызова являетсядобавкактекущемузначению(дляобычного–непривилегированного - процесса эти добавки представляют собойнеотрицательные числа). Значение P_NICE наследуется припорождении процессов, и таким образом, значение приоритета неможет быть понижено при наследовании. Заметим, что изменятьсяP_NICE может только в сторону увеличения значения (до некоторогопредельного значения), таким образом пользователь может снижатьприоритет своих процессов.P_CPU - это системная составляющая. Она формируетсясистемой следующим образом: при прерывании по таймеру черезпредопределенные периоды времени для процесса, занимающегопроцессор в текущий момент, P_CPU увеличивается на единицу.
Также, как и P_NICE, P_CPU имеет некоторое предельное значение. Еслипроцесс будет находиться в состоянии выполнения так долго, чтосоставляющая P_CPU достигнет своего верхнего предела, то значениеP_CPU будет сброшено в нуль, а затем снова начнет расти. Отметим,однако, что такая ситуация весьма маловероятна, так как скореевсего, этот процесс будет выгружен и заменен другим еще до тогомомента, как P_CPU достигнет максимума.Упрощенная формула вычисления приоритета таковаP_PRI= P_USER + P_NICE + P_CPUКонстанта P_USER представляет собой нижний порогприоритета для пользовательских процессов.
Пользовательскаясоставляющая, как правило, учитывается в виде разности P_NICE –N_ZERO, что позволяет принимать в расчет только добавку,введенную посредством системного вызова nice(). Системнаясоставляющая учитывается с некоторым коэффициентом. Посколькунеизвестно, проработал ли до момента прерывания по таймерупроцесс на процессоре полный интервал между прерываниями, тоберется некоторое усреднение.
Суммарно получается следующаяформула для вычисления приоритетаP_PRI= P_USER + P_NICE – NZERO + P_CPU/aЗаметим, что, если приоритет процесса не изменялся припомощи nice(), то единственной изменяемой составляющейприоритета будет P_CPU, причем эта составляющая растет толькодля того процесса, который находится в состоянии выполнения. В59тот момент, когда значение ее станет таково, что в очереди готовыхк выполнению процессов найдется процесс с меньшим значениемприоритета, выполняемый процесс будет приостановлен и замененпроцессом с меньшим значением приоритета.
При этом значениесоставляющей P_CPU для выгруженного процесса сбрасывается внуль.Пример 9. Планирование процессов.Рассмотрим два активных процесса, разделяющих процессор,причем таких, что ни их процессы-предки, ни они сами не менялисоставляющую P_NICE системным вызовом nice().
ТогдаP_NICE=NZERO и оба процесса имеют начальное значение приоритетаP_PRI=P_USER, так как для них обоих в начальный момент P_CPU=0.Пусть прерывание по таймеру происходит через N единиц времени, икаждый раз значение P_CPU увеличивается на единицу, а ввычислениеприоритетасоставляющаяP_CPUвходитскоэффициентом 1/A. Таким образом, дополнительная единица вприоритете процесса, занимающего процессор, «набежит» через Атаймерных интервалов. Значение P_CPU второго процесса остаетсянеизменным, и его приоритет остается постоянным. Через NA единицвремени разница приоритетов составит единицу в пользу второгопроцесса и произойдет смена процессов на процессоре.4.9 Принципы организация свопинга.В системе определенным образом выделяется пространстводля области свопинга. Есть пространство оперативной памяти, вкотором находятся процессы, обрабатываемые системой в режимемультипрограммирования.
Есть область на ВЗУ, предназначеннаядля откачки этих процессов по мере необходимости. Упрощеннаясхема планирования подкачки основывается на использованиинекоторого приоритета, который называется P_TIME и такженаходится в контексте процесса. В этом параметре аккумулируетсявремя пребывания процесса в состоянии мультипрограммнойобработки, или в области свопинга. В поле P_TIME существуетсчётчик выгрузки (outage) и счётчик загрузки (inage).При перемещении процесса из оперативной памяти в областьсвопинга или обратно система обнуляет значение параметра P_TIME.Для загрузки процесса в память из области свопинга выбираетсяпроцесс с максимальным значением P_TIME.