что означает 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 использует идею о том, что нам не нужны объекты блокировки, которые "принадлежат", чтобы знать такую информацию, как "никакой поток больше не может получить доступ к этому объекту".