Вот задался вопросом: как лучше поступать системе в таком случае: Вот, допустим, есть 2 процесса в юзермодском адресном пространстве. Всё место они не занимают, а физическая память выглядит так: Code (Text): ;******<| 1-ый процесс ****** | ****** | ;******<| ;******<| 2-ой процесс ****** | ;******<| ;А дальше память свободна Т.е в физической памяти нет свободного места между концом 1-го процесса и началом 2-го, но есть ещё свободная, целостная оператива. Вопрос в том, что лучше делать дальше - использовать оверлеи для 1-го процесса (приведёт к нестабильности, да и вообще требует много крови), переместить со всеми вытекающими 2-ой процесс (тут уже менее скользкая ситуация), юзать своп для 1-го процесса? У товарища Таненбаума такая ситуация не описана, а сам я не знаю, как лучше сделать.
Дальше - создать условия для работы всех процессов. К примеру, если 1-му процессу вдруг захочется зарезервировать память или что-нибудь в этом роде, то места станет недостаточно, и нужно будет исправлять эту ситуацию. Чтоб все были довольны и счастливы.
Какая разница по каким адресам процессу брать память? С оверлеями вы что-то перемудрили, просто нужен менеджер памяти.
Igor1024 Процессу совершенно не нужен непрерывный участок памяти. 1МБ виртуальной памяти процесса может быть разбросан по всему диапазону физической памяти (страницы размером 4К). Для процесса этот механизм совершенно прозрачен.
Igor1024 Виртуальные на физические или нет - значения не имеет. В дос есть эмуляция многозадачности с помощью резидентных программ и там тоже нет проблемы с этим.
На самом деле разница есть. Да действительно в DOS блоки одного процесса могут быть разбросаны в памяти, но невозможно выделить непрерывный блок, если нет подходящего по размеру участка свободной памяти, даже если в целом свободной памяти достаточно. Резидентные программы в DOS - это полумертвые процессы со всеми вытекающими, поэтому о реальной многозадачности здесь говорить не слишком уместно. В современных системах физическая память редко распределяется так, как показано на рисунке, даже если в них поддерживается объединение смежных участков свободной/освободившейся физической памяти в единый блок. Кстати именно поэтому в основном пуле свободной памяти я не делаю такого объединения, а храню отдельно адрес каждой свободной страницы (объединение выполняется только в дополнительном пуле ограниченного размера; этот пул предназначен для нужд драйверов и используется для выделения непрерывных участков физической памяти).