Небольшой вопрос о проектировании

Тема в разделе "WASM.OS.DEVEL", создана пользователем Igor1024, 18 июн 2011.

  1. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Вот задался вопросом: как лучше поступать системе в таком случае:
    Вот, допустим, есть 2 процесса в юзермодском адресном пространстве. Всё место они не занимают, а физическая память выглядит так:
    Код (Text):
    1. ;******<|  1-ый процесс
    2. ******    |
    3. ******    |
    4. ;******<|
    5.  
    6. ;******<| 2-ой процесс
    7. ******    |
    8. ;******<|
    9.  
    10. ;А дальше память свободна
    Т.е в физической памяти нет свободного места между концом 1-го процесса и началом 2-го, но есть ещё свободная, целостная оператива.

    Вопрос в том, что лучше делать дальше - использовать оверлеи для 1-го процесса (приведёт к нестабильности, да и вообще требует много крови), переместить со всеми вытекающими 2-ой процесс (тут уже менее скользкая ситуация), юзать своп для 1-го процесса?
    У товарища Таненбаума такая ситуация не описана, а сам я не знаю, как лучше сделать.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В начале ответьте, что вы понимаете под этим дальше.
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Дальше - создать условия для работы всех процессов. К примеру, если 1-му процессу вдруг захочется зарезервировать память или что-нибудь в этом роде, то места станет недостаточно, и нужно будет исправлять эту ситуацию. Чтоб все были довольны и счастливы.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Какая разница по каким адресам процессу брать память? С оверлеями вы что-то перемудрили, просто нужен менеджер памяти.
     
  5. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Igor1024
    Процессу совершенно не нужен непрерывный участок памяти. 1МБ виртуальной памяти процесса может быть разбросан по всему диапазону физической памяти (страницы размером 4К). Для процесса этот механизм совершенно прозрачен.
     
  6. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Упс, спасибо, dinoweb. Мы же виртуальное на физическое отображаем... Что-то ступил я.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Igor1024
    Виртуальные на физические или нет - значения не имеет. В дос есть эмуляция многозадачности с помощью резидентных программ и там тоже нет проблемы с этим.
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    На самом деле разница есть. Да действительно в DOS блоки одного процесса могут быть разбросаны в памяти, но невозможно выделить непрерывный блок, если нет подходящего по размеру участка свободной памяти, даже если в целом свободной памяти достаточно. Резидентные программы в DOS - это полумертвые процессы со всеми вытекающими, поэтому о реальной многозадачности здесь говорить не слишком уместно.

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