Jump to content
    

RapidJSON и FreeRTOS

14 минут назад, dxp сказал:

Вам известны случаи падения программ, например, на x86 из-за того, что фрагментация "побила" всю память?

На сколько я помню Firefox страдал от этой проблемы (https://support.mozilla.org/en-US/questions/1115812), но он не одинок: https://www.ibm.com/support/pages/resolving-memory-problems-using-low-fragmentation-heap-lfh

Share this post


Link to post
Share on other sites

Не понятно, почему именно ломалось. Если 64-разрядная модель памяти, то забить её всю, это надо очень постараться. По второй ссылке лечение с помощью  какого-то патча. Т.е. пофиксили программно. Думается, на системе без MMU  никакими патчами фрагментацию купировать не получится.

Share this post


Link to post
Share on other sites

31 минуту назад, dxp сказал:

Думается, на системе без MMU  никакими патчами фрагментацию купировать не получится.

Вообще-то по большому счёту - можно. Алгоритмически. Но сложно.

Алгоритмически - реализовав свою сборку мусора. Например:

Периодически запуская циклы "сборки мусора" (выполняет дефрагментацию кучи). Запускаться циклы "сборки мусора" должны из критической секции. Все операции с выделенными из кучи данными - тоже только внутри этой критической секции (только пользователи кучи владеют секцией совместно, но захватывают - каждый самостоятельно). Указатели на все выделенные блоки сохраняются в некоем массиве (который корректируется сборщиком мусора). Пользователи должны периодически отпускать критическую секцию и заново захватывать её, при каждом новом запуске считывая указатель на свой выделенный блок из массива и пересчитывая заново все производные от него указатели (если нужны). Пользователи между освобождением и захватом критической секции не должны хранить никакие производные указатели от выделенного блока, только заново их генерировать при каждом новом захвате критической секции.

Выполняя все эти условия, работая с указателями аккуратно, можно свести к минимуму вред от дефрагментации кучи. Но кто же из куче-пользователей станет так дисциплинированно себя и вести и писать код так аккуратно?? Вопрос ясное дело - риторический.  :unknw:

В Яве это сделали на уровне системы - убрав указатели и позволив работать с массивами только через индексы. И добавив системный "сборщик мусора". Но это понижает эффективность кода.

Share this post


Link to post
Share on other sites

Вопрос решился просто: списал переопределение менеджера у Cereal (либа сериализации).
Про область применения: IoT (ближе к кофеварке, чем к марсоходу). По поводу джейсонов: они (в моем случае) разные бывают - от пары десятков байт до 2.5к (редко). Выделять память статически на максимум плохо, поскольку памяти дефицит. Поэтому, и по совокупности других обстоятельств, куча предпочтительнее. Кроме того, в определенных ситуациях (напр. если надо открыть еще один сокет) от длинных джейсонов я могу на время отписаться.

Share this post


Link to post
Share on other sites

25 минут назад, Axel сказал:

Выделять память статически на максимум плохо, поскольку памяти дефицит. Поэтому, и по совокупности других обстоятельств, куча предпочтительнее.

Так если "памяти дефицит", то тем более куча - зло. Так как потребует больше памяти для такого же размера JSON.

Ещё раз:

В 23.05.2023 в 13:14, jcxz сказал:

Макс.размер JSON-а скажем == 100 байт. Соответственно резервировать имеет смысл 100 байт. Но только при статическом выделении это и будет 100 байт потрачено, а при динамическом == 100 байт + заголовок блока + потери на фрагментацию.

Share this post


Link to post
Share on other sites

Ситуации у меня в общем альтернативные (как я и писал). А "кооперативно" использовать статическую память для объектов разной природы - ИМХО, слишком высокое искусство (особенно для последующей поддержки). Так что пока - куча.

Share this post


Link to post
Share on other sites

8 часов назад, Axel сказал:

Выделять память статически на максимум плохо, поскольку памяти дефицит.

Ну например у меня в программе немало статических массивов, но многие одновременно не используются, поэтому прекрасно подходят для использования различными модулями непосредственно в тех же типах или через union в других. Получается экономно и практично.

Share this post


Link to post
Share on other sites

Согласен. Я тоже пользую union и placement new везде, где возможно. Но в проекте, по поводу которого топик, присутствует SDK, построенный на freeRTOS, включающий lwip, А там свои дела с кучей. Ну и rapidjson, очень удобная, но внутри сильно динамическая.

Share this post


Link to post
Share on other sites

Если кому-нибудь еще интересно: в конце концов все обошлось статическим буфером (нашел здесь). Пока все нравится.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...