<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Доступна библиотека управления памятью jemalloc 5.3.1</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html</link>
    <description>Спустя 4 года после публикации прошлого обновления доступен релиз библиотеки управления памятью jemalloc 5.3.1, предлагающей альтернативную реализацию функций malloc, оптимизированную для снижения фрагментации и работы на многопроцессорных системах. Для решения проблем с блокировками на многоядерных системах в jemalloc для каждого ядра CPU используется своя изолированная область распределения памяти, что позволяет добиться  линейной масштабируемости при росте числа потоков...&lt;br&gt;&lt;br&gt;Подробнее: https://www.opennet.ru/opennews/art.shtml?num=65201&lt;br&gt;</description>

<item>
    <title>- (Аноним)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#39</link>
    <pubDate>Tue, 14 Apr 2026 22:19:52 GMT</pubDate>
    <description>&amp;gt; Я стараюсь мыслить в асм реализации.&lt;br&gt;&lt;br&gt;Очень плохо, потому что x86 не единственная и уже даже не основная архитектура.&lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним83)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#38</link>
    <pubDate>Tue, 14 Apr 2026 22:05:53 GMT</pubDate>
    <description>Удачи в реализации.&lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним83)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#37</link>
    <pubDate>Tue, 14 Apr 2026 22:05:14 GMT</pubDate>
    <description>Нет.&lt;br&gt;&lt;br&gt;static pthread_key_t tp_tls_key_tpt;&lt;br&gt;static int tp_tls_key_tpt_error = EAGAIN;&lt;br&gt;&lt;br&gt;int tp_init(void) &#123;&lt;br&gt;if (0 != tp_tls_key_tpt_error) &#123; /* Try to reinit TLS. */&lt;br&gt;tp_tls_key_tpt_error = pthread_key_create(&amp;tp_tls_key_tpt, NULL);&lt;br&gt;&#125;&lt;br&gt;return (tp_tls_key_tpt_error);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;static void *tp_thread_proc(void *data) &#123;&lt;br&gt;...&lt;br&gt;pthread_setspecific(tp_tls_key_tpt, (const void*)data);&lt;br&gt;...&lt;br&gt;// do something...&lt;br&gt;...&lt;br&gt;pthread_setspecific(tp_tls_key_tpt, NULL);&lt;br&gt;return (NULL);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;void *tpt_get_current(void) &#123; /* TLS magic. */&lt;br&gt;return ((void*)pthread_getspecific(tp_tls_key_tpt));&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Это чуть упрощённое из моего кода.&lt;br&gt;tp_init() вызывается типа один раз при старте.&lt;br&gt;Каждый поток в tp_thread_proc() получает свой какой то указатель на данные и сохраняет его в TLS.&lt;br&gt;Вызывая tpt_get_current() из любой функции в контексте выполнения такого потока можно получить указатель на данные (void *data) который передали при создании потока.&lt;br&gt;Прикол тут в том, что для всех потоков код который они вызывают и аргумент один </description>
</item>

<item>
    <title>- (Аноним)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#36</link>
    <pubDate>Tue, 14 Apr 2026 21:41:30 GMT</pubDate>
    <description>&amp;gt;&amp;gt; malloc(xxx) вызывается на самом деле malloc(this_thread,xxx).&lt;br&gt;&amp;gt; Может в какой то реализации так и есть, я таких не видел &lt;br&gt;&lt;br&gt;Идея.&lt;br&gt;- диспетчер узнает поток.&lt;br&gt;- прилепливает к выданному этому потоку.&lt;br&gt;- выдает указатель новым не подряд, а прыжками. &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#35</link>
    <pubDate>Tue, 14 Apr 2026 21:36:11 GMT</pubDate>
    <description>&amp;gt; Есть TLS: Thread Local Storage.&lt;br&gt;&amp;gt; Это как бы массив, когда ты туда хочешь что то записать ты &lt;br&gt;&amp;gt; аллоцируешь от туда индекс через pthread_key_create().&lt;br&gt;&amp;gt; Дальше через апи каждый поток в этот индекс пишет pthread_setspecific(), и у &lt;br&gt;&amp;gt; каждого потока там своё уникальное значение может хранится. Те каждый поток &lt;br&gt;&amp;gt; дёргая pthread_getspecific() с этим аллоцированным индексом может получать то значение &lt;br&gt;&amp;gt; которое привязано к этому потоку.&lt;br&gt;&lt;br&gt;pthread_key_create() - регистрируем ID1 первого потока у диспетчера.&lt;br&gt;pthread_setspecific() - регистрируем и получаем ID2 другого потока ссылаясь на ID1 первого как родителя&lt;br&gt;pthread_setspecific() - получаем указатель связанный с ID2 прилепленный диспетчером к уже полученным кускам этого потока.&lt;br&gt;&lt;br&gt;Есть родитель ID1 он же владеет общим пулом. Есть ID2 который узнаваем диспетчером и получает новую память для себя впритык к уже имеющейся и легко освобождаемую большим куском.  &lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним83)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#33</link>
    <pubDate>Tue, 14 Apr 2026 21:25:26 GMT</pubDate>
    <description>&amp;gt; malloc(xxx) вызывается на самом деле malloc(this_thread,xxx).&lt;br&gt;&lt;br&gt;Может в какой то реализации так и есть, я таких не видел да и смысла не понимаю.&lt;br&gt;Аллокатор сильно сложнее устроен чем просто как вы описали, как минимум он обычно возвращает выравненную память по границе sizeof(void*). Потом ему нужно к каждому куску памяти клеить свои метаданные - обычно оно находится ПЕРЕД тем значением что вернули через malloc().&lt;br&gt;&lt;br&gt;У вас какой то очень вырожденный юзкейс, в реале всё сложнее.&lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним83)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#32</link>
    <pubDate>Tue, 14 Apr 2026 21:19:52 GMT</pubDate>
    <description>Как то так так.&lt;br&gt;&lt;br&gt;Есть TLS: Thread Local Storage.&lt;br&gt;Это как бы массив, когда ты туда хочешь что то записать ты аллоцируешь от туда индекс через pthread_key_create().&lt;br&gt;Дальше через апи каждый поток в этот индекс пишет pthread_setspecific(), и у каждого потока там своё уникальное значение может хранится. Те каждый поток дёргая pthread_getspecific() с этим аллоцированным индексом может получать то значение которое привязано к этому потоку.&lt;br&gt;&lt;br&gt;Дальше там особенности аллокаторов, но в целом аллокаторы как провайдеры: берут оптом - продают в розницу. Выделают какие то большие куски через mmap(), и отдают по запросу из них маленькие кусочки. Выделить меньше PAGE_SIZE (4кб на х84) не возможно. Упомянутый dss - устарел, хз как он работал.&lt;br&gt;&lt;br&gt;У каждого потока свои страницы из которых он получает память при alloc(), а если соседний поток эти куски освобождает то они через lockfree ставятся в очередь на освобождение, которая обрабатывается потоком к которому прибит &quot;экземпляр&quot; аллокатора.&lt;br&gt;&lt;br&gt;Как там происходит на низком </description>
</item>

<item>
    <title>- (Аноним)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#31</link>
    <pubDate>Tue, 14 Apr 2026 21:01:40 GMT</pubDate>
    <description>&amp;gt;за каждым потоком закреплён &quot;пул памяти&quot; откуда именно этот поток получает куски памяти при каждом malloc()/realloc()/calloc().&lt;br&gt;&lt;br&gt;malloc(xxx) вызывается на самом деле malloc(this_thread,xxx). В дальнейшем менеджер предложит потоку указатель смещенный относительно первого на размер предыдущего (ххх). Легко освободить разом всё память, предоставленную потоку и освободить большой кусок памяти а не &quot;черезполосицу&quot; с другими потоками.&lt;br&gt;</description>
</item>

<item>
    <title>- (Аноним)</title>
    <link>https://217.65.3.21/openforum/vsluhforumID3/139806.html#30</link>
    <pubDate>Tue, 14 Apr 2026 20:44:27 GMT</pubDate>
    <description>Возможно Вы мыслите в абстракциях. Я стараюсь мыслить в асм реализации.&lt;br&gt;</description>
</item>

</channel>
</rss>
