Потери значительных ресурсов в однопрограммных машинах послужили причиной реализации мультипрограммных систем, в которых несколько пользователей одновременно “состязаются” за обладание машинными ресурсами, что обеспечивает возможность одновременно выполнять операции ввода-вывода и вычисления на УП. Благодаря этому существенно повышается коэффициент использования УП и производительность системы. В первых мультипрограммных системах основная память разбивалась на ряд разделов фиксированного размера. В каждом разделе могло размещаться одно задание. УП переключался с задание на задание, создавая иллюзию одновременного их выполнения. Однако если задание было готово для выполнения, а его раздел в это время был занят, то заданию приходилось ждать, несмотря на то, что другие разделы были свободны. Т.е. трансляция заданий производилась в абсолютных адресах с рачётом на выполнение только в конкретном разделе. Это приводило к неэффективному использованию ресурсов памяти, однако позволяло относительно просто реализовать ОС. Существует также подход при котором имеется возможность трансляции перемещаемых модулей, которые могут работать в любом свободном разделе, достаточно большом для их размещения. В мультипрограммных системах со связным распределением памяти защита чаще всего реализуется при помощи нескольких граничных регистров. Два регистра позволяют указывать нижнюю и верхнюю границы раздела пользователя.
Анализируя проблемы, присущие мультипрограммированию с фиксированными разделами, разработчики ОС пришли к выводу, что лучше позволить заданиям занимать столько места, сколько им требуется. В этом случае не происходит никакого “перерасхода” памяти – раздел каждого задания в точности соответствует размеру этого задания. Однако любая схема организации памяти сопряжена с определенными потерями. В этом случае потери становятся очевидными. Когда задания начинают завершаться, а в основной памяти остаются свободные участки (“дыры”). Т.о. без потери памяти не обойтись.
Объединение соседних свободных участков памяти
После того как в мультипрограммной системе с переменными разделами некоторое задание завершается, можно проверить, не соседствует ли освобождённый участок памяти с другими свободными участками (“дырами”). Если соседствует, то в список свободной памяти можно занести либо новый свободный участок, либо единый свободный участок, полученный объединением новой “дыры” с соседними. Благодаря объединению дыр можно формировать непрерывные блоки памяти максимально возможного размера.
Уплотнение памяти
Часто, даже после объединения соседних свободных участков бывает так, что остаются разбросанными отдельные “дыры”, составляющие в целом значительный объём памяти. Иногда очередное задание требует определённого объёма основной памяти, но не оказывается ни одного свободного, достаточно большого участка, для размещения этого задания, несмотря на то, что сумма всех свободных участков достаточно велика. Эта проблема решается при помощи метода, называемого уплотнением памяти. И заключающегося в перемещении всех занятых участков к одному или другому краю основной памяти. Благодаря этому мы получаем единый свободный участок памяти. Уплотнение памяти имеет свои недостатки:
1) отнимает ресурсы системы
2) во время уплотнения система должна прекращать любые другие работы и это может оказаться неприемлемым для систем реального времени
3) информация о рамещении программы должна сохраняться в легкодоступной форме.
1) Стратегия наиболее подходящего. Поступающее задание помещается в тот свободный участок основной памяти, в котором ему наиболее “тесно”, так, что остаётся минимально возможное неиспользуемое пространство.
2) Стратегия первого подходящего. Поступающее задание помещается в первый встретившийся свободный участок основной памяти достаточного размера.
3) Стратегия наименее подходящего. Необходимо занимать заданию максимально возможный свободный участок, т.к. остающийся свободный участок зачастую оказывается также большим и в нём можно разместить относительно большую новую программу.
Мультипрограммирование со свопингом
Каждая из рассматриваемых выше систем предполагает, что программы пользователя остаются в основной памяти до момента завершения. Существует схема, называемая свопингом, которая не накладывает подобного требования. В некоторых системах со свопингом сразу всю основную память в каждый момент времени занимает одно задание. Это задание выполняется до тех пор, пока оно может продолжаться, а затем освобождает как память, так и УП уже следущего задания.