
osdev-libstdc: реализация std::atomic и spin_lock
GNU_Dimarik 3 минуты назад osdev-libstdc: реализация std::atomic и spin_lock Простой 18 мин 7 C * C++ * Приветствую!Код тутВ моей библиотеке ядра уже есть минимальные, но работающие аллокатор, семейство vsnprintf,...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. GNU_Dimarik 3 минуты назад osdev-libstdc: реализация std::atomic и spin_lock Простой 18 мин 7 C * C++ * Приветствую! Код тутВ моей библиотеке ядра уже есть минимальные, но работающие аллокатор, семейство vsnprintf, ctype, string. Остались только атомики и спинлок, и тогда можно будет доделать семейство malloc в блокировками как того требует стандарт.
Так уж вышло что в osdev-libstdc есть и библиотечные вещи для чистого С++ с шаблонами. Это разумный минимум для реализации последующих вещей необходимых хотя бы для того, что бы комфортно напечатать "Hello world" не говоря уже о том, что бы сделать минимально разумные контейнеры. Реализация базового шаблона std::atomic со всеми перегрузками минимального набора функций из cppreference выполнена при помощи gcc atomic builtins.
Технические детали
По сути сам шаблон является оберткой над ними. Это должно успешно работать на x86, x86_64, arm, arm64 и других поддерживаемых gcc платформх благодаря усилиям компилятора. На момент написания статьи код не скомпилируется ни чем кроме GCC.
Поддержка clang планируется в будущем, но когда именно пока неизвестно :-)Раз уж я обозреваю процесс разработки своей ОС, а не пишу учебник, в этой статье не будет подробно рассматриваться устройство кеша процессора или протокол MESI, я расскажу лишь о вещах необходимых для понимания что означают те или иные константы и зачем они нужны. Так же я расскажу почему они добавлены именно в atomic. Что такое GCC Atomic Builtins?
Это набор встроенных в компилятор функций реализующих атомарный доступ к памяти примерно соответствующий модели памяти С++ 11. Тем кто смотрел в код std::atomic в libstdc++ gcc уже известно, что эти функции используются в реализации std::atomic. По сути моя реализация делает тоже самое, только более прямолинейно.
Отраслевые последствия
В реализации я использую следующие встроенные константы и функции GCC:__ATOMIC_RELAXEDОперация атомарна, но не накладывает дополнительных ограничений на порядок других операций памяти. __ATOMIC_ACQUIREAcquire-операция. Если она читает значение, записанное release-операцией, то образуется synchronizes-with / inter-thread happens-before связь.
Не позволяет последующим операциям чтения и записи быть переупорядоченными перед acquire-операцией. __ATOMIC_RELEASERelease-операция. Публикует все операции чтения и записи, выполненные до неё,для потока, который потом выполнит соответствующий acquire.
Не позволяет предыдущим операциям чтения и записи быть переупорядоченнымипосле release-операции. __ATOMIC_ACQ_RELКомбинация acquire и release. Обычно используется для read-modify-write операций:exchange, compare_exchange, fetch_add и т.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.



