что означает rcu в linux?
Я новичок в ядре linux. Мой вопрос о task_struct
.
Я знаю, что каждый task_struct
имеет ссылку на родительский процесс через указатель на task_struct
родителя.
после просмотра sched.ч. В task_struct
определение я заметил следующее :
struct task_struct __rcu *real_parent; /* real parent process */
я обнаружил, что он ссылается на компилятор.h. Я думаю, что "__rcu "означает" прочитать обновление копии"
может кто-нибудь уточнить синтаксис ?
2 ответов
чтение-копирование-обновление - это алгоритм, который обеспечивает параллельный доступ к считывателям структуры данных без необходимости блокировки структуры. Его можно прочитать о здесь.
если ядро построено с помощью CONFIG_SPARSE_RCU_POINTER
настройки, __rcu
определена в include/linux/compiler.h
as
# define __rcu __attribute__((noderef, address_space(4)))
это аннотация для инструмента анализа разреженного кода, который может предупреждать о некоторых вещах, которые программист, возможно, пропустил. Как это относится к RCU объясняется в Documentation/RCU/checklist.txt
:
__RCU разреженные проверки: тег указатель на RCU-защищенные данные структура с __rcu, и sparse предупредит вас, если вы доступ к этому указателю без услуг одного из варианты rcu_dereference().
rcu_dereference()
возвращает указатель, который может быть безопасно разыменован кодом и документирует намерение программиста защитить указатель с помощью механизма RCU, включая такие инструменты, как Sparse для проверки ошибок и пропусков в программировании.
RCU означает "чтение, копирование, обновление". Это алгоритм, который позволяет нескольким читателям получать доступ к данным, которые могут быть обновлены или даже удалены одновременно авторами.
в рамках RCU писатели по-прежнему должны обеспечивать взаимное исключение друг относительно друга, но читатели не получают блокировки. Необходимо позаботиться о том, чтобы общая структура данных обновлялась таким образом, чтобы не нарушать целостность чтения. Если что-то должно быть удалено или удалено, отсоединение этого элемента от структура данных может быть выполнена параллельно с считывателями, но фактическое удаление памяти должно подождать, пока последний считыватель не закончит.
вместо того, чтобы заставить читателей приобрести замок, местонахождение читателей выводится другими способами. Потоки могут объявить о своем намерении просмотреть структуру данных, присоединившись к" критическому разделу чтения", который на самом деле не является блокировкой, а своего рода глобальной фазой.
например, предположим, что некоторые потоки вошли в RCU прочитайте бортовой критический раздел в участке 0. Программа обновления выполнила удаление и хочет освободить часть памяти. Он должен просто ждать, пока все потоки в системе освободят фазу 0. В то же время другие читатели уже смотрят на структуру данных, но когда они заявляют о своем намерении RCU, они делают это, входя в критический раздел RCU для чтения в рамках Фазы 1. Только потоки Фазы 0 могут иметь указатель на объект, который был удален, и поэтому, когда последний поток уходит фаза 0, объект можно безопасно удалить. Вновь поступающие потоки в фазе 1 не видят объект, потому что объект был удален из структуры данных, поэтому у них нет способа его найти.
RCU использует идею о том, что нам не нужны объекты блокировки, которые "принадлежат", чтобы знать такую информацию, как "никакой поток больше не может получить доступ к этому объекту".