Что такое информатика 9 страница

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

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

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

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

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

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

Существует 3 основных состояния процесса:

• готов;

• выполняется;

• блокирован.

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

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

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

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

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

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

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

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

В операционной системе, наряду с процессами, нужен другой меха­низм распараллеливания вычислений, который учитывал бы тесные связи между отдельными ветвями вычислений одного и того же прило­жения. Для этих целей современные ОС предлагают механизм многопо­точной обработки (multithreading). При этом вводится новая единица ра­боты - поток выполнения, а понятие «процесс» в значительной степени меняет смысл. Понятию «поток» соответствует последовательный пере­ход процессора от одной команды программы к другой. ОС распределя­ет процессорное время между потоками. Процессу ОС назначает адрес­ное пространство и набор ресурсов, которые совместно используются всеми его потоками.

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

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

Итак, мультипрограммирование более эффективно на уровне пото­ков, а не процессов. Каждый поток имеет собственный счетчик команд и стек. Задача, оформленная в виде нескольких потоков в рамках одного процесса, может быть выполнена быстрее за счет псевдопараллельного (или параллельного в мультипроцессорной системе) выполнения ее от­дельных частей. Особенно эффективно можно использовать многопо­точность для выполнения распределенных приложений, например, мно­гопоточный сервер может параллельно выполнять запросы сразу не­скольких клиентов.

Использование потоков связано не только со стремлением повысить производительность системы за счет параллельных вычислений, но и с целью создания более читабельных, логичных программ. Введение не­скольких потоков выполнения упрощает программирование. Например, в задачах типа «писатель-читатель» один поток выполняет запись в бу­фер, а другой считывает записи из него. Поскольку они разделяют об­щий буфер, не стоит их делать отдельными процессами. Другой пример использования потоков - управление сигналами, такими как прерывание с клавиатуры (del или break). Вместо обработки сигнала прерывания один поток назначается для постоянного ожидания поступления сигна­лов. Таким образом, использование потоков может сократить необходи­мость в прерываниях пользовательского уровня. В этих примерах не столь важно параллельное выполнение, сколь важна ясность программы.

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

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

Создание описателя процесса знаменует собой появление в систе­ме еще одного претендента на вычислительные ресурсы. Начиная с это­го момента при распределении ресурсов ОС должна принимать во вни­мание потребности нового процесса.

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

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

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

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

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

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

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

• выбор процесса на выполнение из очереди готовых процессов;

• переключение контекстов «старого» и «нового» процессов.

Первые две задачи решаются программными средствами, а по­следняя в значительной степени аппаратно.

Существует множество различных алгоритмов планирования про­цессов, по-разному решающих вышеперечисленные задачи, пресле­дующих различные цели и обеспечивающих различное качество муль­типрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: ал­горитмы, основанные на квантовании, и алгоритмы, основанные на при­оритетах.

В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:

• процесс завершился и покинул систему,

• произошла ошибка,

• процесс перешел в состояние ОЖИДАНИЕ,

• исчерпан квант процессорного времени, отведенный данному процессу.

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

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

Другая группа алгоритмов использует понятие «приоритет» процес­са. Приоритет - это число, характеризующее степень привилегирован­ности процесса при использовании ресурсов вычислительной машины, в частности процессорного времени: чем выше приоритет, тем выше при­вилегии.

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

Существует две разновидности приоритетных алгоритмов: алгорит­мы, использующие относительные приоритеты, и алгоритмы, исполь­зующие абсолютные приоритеты.

В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По-разному решается проблема определения момента сме­ны активного процесса. В системах с относительными приоритетами ак­тивный процесс выполняется до тех пор, пока он сам не покинет процес­сор, перейдя в состояние БЛОКИРОВКИ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами вы­полнение активного процесса прерывается еще при одном условии: ес­ли в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный про­цесс переходит в состояние готовности.

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

5.8 Вытесняющие и невытесняющие алгоритмы

Существует два основных типа процедур планирования процессов - вытесняющие (preemptive) и невытесняющие (non-preemptive).

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

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

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

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

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

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

Поэтому разработчики приложений для non-preemptive операцион­ной среды, возлагая на себя функции планировщика, должны создавать приложения так, чтобы они выполняли свои задачи небольшими частя­ми. Например, программа форматирования может отформатировать од­ну дорожку дискеты и вернуть управление системе. После выполнения других задач система возвратит управление программе форматирова­ния, чтобы та отформатировала следующую дорожку. Подобный метод разделения времени между задачами работает, но он существенно за­трудняет разработку программ и предъявляет повышенные требования к квалификации программиста. Программист должен обеспечить «дру­жественное» отношение своей программы к другим выполняемым одно­временно с ней программам, достаточно часто отдавая им управление. Крайним проявлением «недружественности» приложения является его зависание, которое приводит к общему краху системы. В системах с вы­тесняющей многозадачностью такие ситуации, как правило, исключены, так как центральный планирующий механизм снимет зависшую задачу с выполнения.

Однако распределение функций планировщика между системой и приложениями не всегда является недостатком, а при определенных ус­ловиях может быть и преимуществом, потому что дает возможность разработчику приложений самому проектировать алгоритм планирова­ния, наиболее подходящий для данного фиксированного набора задач. Так как разработчик сам определяет в программе момент времени отда­чи управления, то при этом исключаются нерациональные прерывания программ в «неудобные» для них моменты времени. Кроме того, легко разрешаются проблемы совместного использования данных: задача во время каждой итерации использует их монопольно и уверена, что на протяжении этого периода никто другой не изменит эти данные. Суще­ственным преимуществом non-preemptive систем является более высо­кая скорость переключения с задачи на задачу.

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

Однако почти во всех современных операционных системах, ориен­тированных на высокопроизводительное выполнение приложений (UNIX, Windows NT, OS/2, VAX/VMS), реализована вытесняющая многозадач­ность. В последнее время дошла очередь и до ОС класса настольных систем, например, OS/2 Warp и Windows 95. Возможно в связи с этим вытесняющую многозадачность часто называют истинной многозадач­ностью.

5.9 Управление памятью

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

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

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

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

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

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

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

Подсистема управления памятью в этом случае выполняет сле­дующие задачи:

• сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел,

• осуществляет загрузку программы и настройку адресов.

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

Задачами операционной системы при реализации данного метода управления памятью является:

• ведение таблиц свободных и занятых областей, в которых указы­ваются начальные адреса и размеры участков памяти,

• при поступлении новой задачи - анализ запроса, просмотр табли­цы свободных областей и выбор раздела, размер которого доста­точен для размещения поступившей задачи,

• загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей,

• после завершения задачи корректировка таблиц свободных и за­нятых областей.

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

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

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








Дата добавления: 2016-03-20; просмотров: 454;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.038 сек.