Habr<p>[Перевод] Механизм перезапускаемых последовательностей (Rseq) при работе с TCMalloc</p><p>❯ Кэши для отдельных ядер процессора В TCMalloc кэши для отдельных ядер процессора реализуются при помощи перезапускаемых последовательностей (man rseq(2)) под Linux. Эту возможность ядра разработали Пол Тёрнер и Эндрю Хантер из Google , а также Мэтью Дезнойерс из EfficiOS. При помощи перезапускаемых последовательностей можно вплоть до завершения выполнять область памяти (атомарно, относительно других потоков, выполняющихся на том же ядре процессора), либо выходить из этого процесса, если ядро прервёт этот процесс, например, вытеснив его или прервавшись на обработку сигнала. Если вы хотите организовать перезапуск системы при миграции с ядра на ядро или при вытеснении процесса, то наиболее общий случай такой операции можно оптимизировать (не переносить с ядра на ядро тот процесс, который уже выполняется), избегая атомарных операций. Можно оптимизировать и более редкий случай – вытеснение как таковое. В результате такого компромисса нужно обеспечить, чтобы на всех путях выполнения нашего кода поддерживались такие операции перезапуска. Вся последовательность, кроме окончательного сохранения в памяти, когда изменение фиксируется, должна быть приспособлена к перезапуску.</p><p><a href="https://habr.com/ru/companies/timeweb/articles/789470/" rel="nofollow noopener" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">habr.com/ru/companies/timeweb/</span><span class="invisible">articles/789470/</span></a></p><p><a href="https://zhub.link/tags/timeweb_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>timeweb_статьи_перевод</span></a> <a href="https://zhub.link/tags/Rseq" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Rseq</span></a> <a href="https://zhub.link/tags/TCMalloc" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>TCMalloc</span></a> <a href="https://zhub.link/tags/Google" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Google</span></a> <a href="https://zhub.link/tags/EfficiOS" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>EfficiOS</span></a> <a href="https://zhub.link/tags/%D1%8F%D0%B4%D1%80%D0%BE" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>ядро</span></a> <a href="https://zhub.link/tags/ID" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>ID</span></a> <a href="https://zhub.link/tags/%D0%9F%D0%9A" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>ПК</span></a> <a href="https://zhub.link/tags/C" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>C</span></a>++ <a href="https://zhub.link/tags/%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D1%8B" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>массивы</span></a> <a href="https://zhub.link/tags/%D0%A6%D0%9F" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>ЦП</span></a> <a href="https://zhub.link/tags/begin" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>begin</span></a> <a href="https://zhub.link/tags/x86" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>x86</span></a> <a href="https://zhub.link/tags/%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>процессор</span></a> <a href="https://zhub.link/tags/%D0%BA%D1%8D%D1%88" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>кэш</span></a></p>