Автор Тема: Горячая замена кода  (Прочитано 22838 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #45 : Декабрь 18, 2013, 02:17:10 pm »
Вообще то Blackbox вообще не умеет выгружать модули, он лишь умеет игнорировать "выгруженный" модуль при импорте и инвалидировать кодовую секцию (см. Kernel.UnloadMod). При этом модуль-зомби продолжает находиться в памяти до завершения процесса Blackbox.

А что тогда происходит, если миллион раз выгрузить/загрузить модуль? Память кончится?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #46 : Декабрь 18, 2013, 02:26:03 pm »
Вообще то Blackbox вообще не умеет выгружать модули, он лишь умеет игнорировать "выгруженный" модуль при импорте и инвалидировать кодовую секцию (см. Kernel.UnloadMod). При этом модуль-зомби продолжает находиться в памяти до завершения процесса Blackbox.

А что тогда происходит, если миллион раз выгрузить/загрузить модуль? Память кончится?
Написал тест. Тестится пока - но похоже таки да. Кончится. Память кушается и не освобождается. ББ уже скушал 64 метра ОЗУ.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #47 : Декабрь 18, 2013, 02:27:50 pm »
Вообще то Blackbox вообще не умеет выгружать модули, он лишь умеет игнорировать "выгруженный" модуль при импорте и инвалидировать кодовую секцию (см. Kernel.UnloadMod). При этом модуль-зомби продолжает находиться в памяти до завершения процесса Blackbox.

А что тогда происходит, если миллион раз выгрузить/загрузить модуль? Память кончится?
Написал тест. Тестится пока - но похоже таки да. Кончится. Память кушается и не освобождается. ББ уже скушал 64 метра ОЗУ.
Хотя быть может эта память отжирается StdLog'ом? Ведь туда валятся сообщения о выгрузке модуля.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #48 : Декабрь 18, 2013, 02:39:59 pm »
Да, это был StdLog. В тест вкралась ошибка и он был не корректным.
Y = λf.(λx.f (x x)) (λx.f (x x))

X512

  • Newbie
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #49 : Декабрь 18, 2013, 02:56:47 pm »
А что тогда происходит, если миллион раз выгрузить/загрузить модуль? Память кончится?
Да, именно так. Элементарно проверяется, особенно если в выгружаемом модуле есть большие массивы (так память израсходуется быстрее).

Код проверки:
MODULE A;
   VAR
      a: ARRAY 1000 OF POINTER TO RECORD
         p: ANYPTR
      END;
END A.

MODULE B;
   IMPORT Kernel;
   
   PROCEDURE Do*;
      VAR mod: Kernel.Module;
   BEGIN
      mod := Kernel.ThisMod("A");
      WHILE mod # NIL DO
         Kernel.UnloadMod(mod);
         mod := Kernel.ThisMod("A")
      END
      (* mod = NIL, память кончилась *)
   END Do;
   
END B.

(!) B.Do

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #50 : Декабрь 18, 2013, 03:05:15 pm »
Поправил тест. Там похоже захардкожено ограничение на объем отводимый на загруженные модули.

Через какое-то время у меня в StdLog начали валиться такие вот сообщения:
command error: not enough memory for Test1

При этом, после останова теста (руками) ББ так и не восстановился. В частности не получается открыть диалог для сохранения файла (вываливается с трапом), не удается скопировать в системный буфер обмена текст. Всего памяти ББ скушал порядка 38 Мб.

Вот текст тестовых модулей (они работают в паре):
MODULE test1;
IMPORT StdLog;

PROCEDURE Do*();
BEGIN
    StdLog.Clear;
    StdLog.Int(42);
END Do;

END Test1.

MODULE Test;

IMPORT DevDebug;

PROCEDURE Do*();
VAR
    i : INTEGER;
BEGIN
    i:=0;
    WHILE i<1000000 DO
        INC(i);
        DevDebug.Execute;
        DevDebug.Unload;
    END;
END Do;

END Test.

Запускается это так:
Test1.Do
(!)Test.Do

Выделяем текст Test1.Do, и жмем на коммандер перед Test.Do
Y = λf.(λx.f (x x)) (λx.f (x x))

X512

  • Newbie
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #51 : Декабрь 18, 2013, 03:22:55 pm »
Кстати память частично освобождается при выгрузке модуля, но выгруженный участок памяти больше никогда не используется. Ограничение памяти под модули вероятно вызвано резервированием 1.5 ГБ виртуальной памяти под кучу в стандартном режиме (есть ещё режим "dllMode" в котором память выделяется через стандартную Win32 кучу). Для памяти под модули используется виртуальная память (VirtualAlloc), а не куча сборщика мусора.