OberonCore
https://forum.oberoncore.ru/

Управление памятью на 64-битных системах
https://forum.oberoncore.ru/viewtopic.php?f=86&t=6607
Страница 2 из 2

Автор:  adimetrius [ Вторник, 05 Май, 2020 13:26 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Comdiv писал(а):
У меня, кстати, на примере транслятора получилось на 32-битной системе как раз на 42% меньше.

А расскажите подробнее, пож

Автор:  hothing [ Вторник, 05 Май, 2020 21:11 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

adimetrius писал(а):
То есть, допустим, есть у нас 64-битный компилятор КП; он генерирует нативные 64-битные инструкции. И есть у него два режима: жадный и скупой: в жадном указатели 64-битные, а в скупом - 32-битные?
И выходит, что можно по желанию одну и ту же программу скомпилировать и жадно, и скупо.

Отлично сформулировано. Но только для Оберон-2(07) сработает.
Для КП\ЧЯ тут проблемы возникают: поскольку параметры компиляции для каждого модуля могут быть различны, то в среде всегда будет часть модулей "скупых" и часть "жадных" что требует: а) согласование вызовов процедур с аргументами-указателями; б) нужно будет два согласованных сборщика мусора.
(Кстати, мне теперь больше понятна реакция Info21 и И.Е. - они смотрят только в ЧЯ)

Автор:  Иван Денисов [ Вторник, 05 Май, 2020 21:20 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Моё наивное видение проблемы. Надо сделать какую-то гибридную систему кучи из холма и горы. В холме хранятся только указатели, а данные этих указателей отдельно вне холма в большой горе. По данным в горе сборщик вообще не бегает. А проверяет только холм. И если из холма объект удаляется, то и из горы ему соответствующие данные удаляются.

Автор:  adimetrius [ Вторник, 05 Май, 2020 22:08 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

hothing писал(а):
Отлично сформулировано. Но только для Оберон-2(07) сработает.
Для КП\ЧЯ тут проблемы возникают: поскольку параметры компиляции для каждого модуля могут быть различны, то в среде всегда будет часть модулей "скупых" и часть "жадных" что требует: а) согласование вызовов процедур с аргументами-указателями; б) нужно будет два согласованных сборщика мусора.

Ну, я так далеко не мыслил: вы описываете гибридную систему, в которой одновременно сосуществуют жадные и скупые указатели. А можно ж иметь целиком жадную систему или целиком скупую. Если, скажем, я делаю для заказчика систему с заведомо небольшими требованиями по памяти, то могу собрать для него скупую систему; иначе - жадную.

Автор:  Comdiv [ Среда, 06 Май, 2020 01:02 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

adimetrius писал(а):
Comdiv писал(а):
У меня, кстати, на примере транслятора получилось на 32-битной системе как раз на 42% меньше.
А расскажите подробнее, пож
Добавил в транслятор вывод кол-ва использованной динамической памяти при использовании с простейшим распределителем памяти без освобождения, и собрал его в 64- и 32-битных режимах. Расходы памяти при трансляции самого себя отличались на 42%. Попробовал, также, собрать в 64-битном режиме с упакованными структурами и без выравнивания выделяемых блоков. Разница с обычным составила 25%.

Автор:  adimetrius [ Среда, 06 Май, 2020 18:56 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Очень любопытно!
Comdiv писал(а):
Добавил в транслятор вывод кол-ва использованной динамической памяти при использовании с простейшим распределителем памяти без освобождения, и собрал его в 64- и 32-битных режимах. Расходы памяти при трансляции самого себя отличались на 42%. Попробовал, также, собрать в 64-битном режиме с упакованными структурами и без выравнивания выделяемых блоков. Разница с обычным составила 25%.


Оч интересный результат! Не подберу только название к нему: получается, это не максимальный объем памяти, используемый при компиляции (некоего стандартного теста, коим служит здесь сам компилятор), а как бы объем памяти, который бы понадобился, если бы динамические переменные были неудалимыми. так?
А сборка в 32 и 64 - это Оберон->C->машкод? Т.е. саму сборку посторонние инструменты осуществляют, а не ваш?

Автор:  Comdiv [ Среда, 06 Май, 2020 22:10 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

adimetrius писал(а):
а как бы объем памяти, который бы понадобился, если бы динамические переменные были неудалимыми. так?
Да. Это, также, приблизительно соответствует использованию сборщика мусора, так как при непродолжительном выполнении он тоже не будет освобождать память.

adimetrius писал(а):
А сборка в 32 и 64 - это Оберон->C->машкод? Т.е. саму сборку посторонние инструменты осуществляют, а не ваш?
Верно.

Автор:  kekc_leader [ Среда, 22 Июль, 2020 16:15 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

А зачем такая экономия? Может быть, это экономия не в том месте?
Как бывает и оптимизация не в том месте.

Лучше уж целочисленные идентификаторы делать для таких случаев.

Автор:  Comdiv [ Среда, 22 Июль, 2020 18:07 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Зачем нужна экономия 40% памяти? Звучит как риторический вопрос.
А к идентификаторам эта экономия вообще никак не привязана.

Автор:  arlean1 [ Суббота, 25 Июль, 2020 14:29 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Илья Ермаков писал(а):
А внутри контейнера, среди этих микрообъектов такая сложная логика, что нельзя освобождать явно? Нет простой логики владения?

Сборка мусора обязательна в двух ситуациях:
1) В расширяемой системе, где между компонентами гуляют объекты - и явно контролировать владение, его передачу и т.п. очень сложно (что пробует делать Rust, но статически с глобальным анализом, а не для расширяемых систем. (Читаем классические обоснования у Шиперского в EthOS).
2) Всюду :) То есть, решающий свою задачу программист не должен думать об освобождении памяти, иначе будет какой-то процент ошибок, и система будет ненадёжной не на логическом уровне, а на уровне недетерминированного повреждения памяти.

А где можно без сборки мусора:
Когда вы пишите замкнутый компонент, с внутренними объектами, с ограниченной логикой, которую можете спокойно верифицировать. А потом уже 1000 раз безопасно использовать 1 раз написанное.

Если одновременно используется две системы - одна, где требуется сборка муссора, и другая , где требуется несколько или очень много циклов использования замкнутого компонента (контейнера)? У вас было упоминание на дне Оберона о вашей системе в этом аспекте - можно привести пример правильного использования, чтобы не было утечки памяти?

Автор:  Info21 [ Суббота, 25 Июль, 2020 22:25 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

Сборка мусора позволяет разделить (divide et impera) разработку логики и оптимизацию размещения данных в памяти.

Это дико полезно.

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

Автор:  Илья Ермаков [ Понедельник, 27 Июль, 2020 12:55 ]
Заголовок сообщения:  Re: Управление памятью на 64-битных системах

arlean1 писал(а):
Если одновременно используется две системы - одна, где требуется сборка муссора, и другая , где требуется несколько или очень много циклов использования замкнутого компонента (контейнера)? У вас было упоминание на дне Оберона о вашей системе в этом аспекте - можно привести пример правильного использования, чтобы не было утечки памяти?


Ну смотрите, у вас 2 пути:
1) Мелкие объекты таки являются управляемыми (создаются через NEW в основной управляемой куче). Тогда просто нужны пулы, в которые вы их возвращаете - и из них же берёте. Тем самым у вас падает количество избыточно созданных и выброшенных (в ожидании сборки мусора) объектов. И можно вообще крайне редко выполнять сборку мусора (или вообще не выполнять, если у вас всё выделение сконцентрировано только в пулах - а ББ неграфический, без чужих компонентов, т.е. вы понимаете, где и что выделяется).
Минус - если сборка всё же выполняется, то при большом количестве мелких объектов пробег по ним сборщика занимает время.

2) Если объекты инкапсулированы в реализации и недоступны внешнему модулю, то можно сделать их через POINTER TO RECORD [untagged] и выделять и освобождать через malloc или WinApi.Heap... Разумеется, нужно строго выверить корректность выделения/освобождения внутри реализации вашего контейнера.
Если логика сложная, я бы без необходимости оптимизации не рисковал этим вообще, пусть гарантирует сборщик (по крайней мере, при выделении/освобождении в пул вы получите логическую ошибку одновременного использования объекта - и это можно подиагностировать, а при неверной работе с неуправляемой памяти у вас всё неуправляемо и сдохнет :) ).
Если логика простая (моменты выделения/освобождения ну прямо очевидны) - то игра стоит свеч, т.к. если мелких объектов внутри очень много, то и задержки они дают на сборку очень существенные.

Ещё есть такая штука, как POINTER [untagged] TO RECORD - такой указатель не трассируется сборщиком, но является теговым, т.е. можно иметь методы, полиморфизм, WITH и проч. Только за размещение тега в выделенном блоке отвечаете сами. Надо положить сначала тег типа, а потом взять за указатель +SIZE(POINTER) (чтобы тег остался по -4). Ну и освобождать с соответствующей логикой.
Это может быть важно, если внутри реализации вашей структуры вы таки используете ООП (подвиды листов дерева там, ну и т.п.)

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/