2013-06-15 13 views
9

Jestem nowy w jądrze Linux. Moje pytanie dotyczy task_struct. Wiem, że każde task_struct ma odniesienie do procesu nadrzędnego za pośrednictwem wskaźnika do obiektu nadrzędnego w postaci task_struct.co oznacza __rcu w systemie Linux?

Po patrząc na sched.h w definicji task_struct zauważyłem następujące:

struct task_struct __rcu *real_parent; /* real parent process */ 

znalazłem, że odwołuje się do compiler.h. Domyślam się, że "__rcu" oznacza "read copy update"

Czy ktoś może wyjaśnić składnię?

Odpowiedz

8

Aktualizacja do odczytu-odczytu to algorytm, który umożliwia równoczesny dostęp do czytników struktury danych bez konieczności blokowania struktury. Można przeczytać o here.

Jeśli jądro jest zbudowany z opcją CONFIG_SPARSE_RCU_POINTER config, __rcu jest zdefiniowana w include/linux/compiler.h jak

# define __rcu   __attribute__((noderef, address_space(4))) 

To jest adnotacja do kodu Sparse narzędzia analizy, które mogą ostrzegać o pewnych rzeczach programista może przeoczyć .Jak to jest istotne dla pilocie jest wyjaśnione w Documentation/RCU/checklist.txt:

__rcu rzadkie kontrole: tag wskaźnik do RCU-chronionych danych struktura z __rcu i rzadki ostrzeże cię, jeśli dostępu że wskaźnik bez korzystania z usług jeden z wariantów rcu_dereference().

rcu_dereference() zwraca wskaźnik, który może być bezpiecznie dereferencjonowane przez kod i dokumentów zamiar programisty, aby chronić wskaźnik z mechanizmem RCU, umożliwiając narzędzi takich jak Sparse do sprawdzania błędów programistycznych i przeoczeń.

5

RCU oznacza "czytaj, kopiuj, aktualizuj". Jest to algorytm, który umożliwia wielu czytelnikom dostęp do danych, które mogą być aktualizowane lub nawet usuwane w tym samym czasie przez autorów.

W ramach RCU scenarzyści nadal muszą wzajemnie wykluczać się wzajemnie, ale czytelnicy nie nabywają blokady. Należy zwrócić uwagę, że struktura danych udostępnionych jest aktualizowana w sposób, który nie narusza integralności odczytu. Jeśli coś trzeba usunąć lub usunąć, odłączenie tego elementu ze struktury danych można wykonać równolegle z czytnikami, ale faktyczne usunięcie pamięci musi poczekać, aż ostatni czytnik zakończy.

Zamiast zmuszać czytelników do zdobycia zamka, miejsce pobytu czytelników można wywnioskować na inne sposoby. Wątki mogą ogłaszać zamiar przeglądania struktury danych, łącząc "sekcję krytyczną po przeczytaniu", która nie jest tak naprawdę blokadą, ale stanowi rodzaj globalnej fazy.

Załóżmy na przykład, że niektóre wątki weszły do ​​sekcji krytycznej po stronie odczytu RCU w fazie 0. Aktualizator dokonał usunięcia i chciał zwolnić część pamięci. Musi po prostu poczekać, aż wszystkie wątki w systemie zwolnią fazę 0. W międzyczasie inni czytelnicy już patrzą na strukturę danych, ale kiedy deklarują zamiar RCU, robią to, wpisując krytyczne strony odczytu RCU sekcja w fazie 1. Tylko wątki fazy 0 mogą nadal mieć wskaźnik do obiektu, który został usunięty, a więc gdy ostatni wątek opuści fazę 0, obiekt może być bezpiecznie usunięty. Nowo przybyłe wątki w fazie 1 nie widzą obiektu, ponieważ obiekt został usunięty ze struktury danych, więc nie ma możliwości jego odnalezienia.

RCU wykorzystuje ideę, że nie potrzebujemy blokować obiektów, które są "własnością", aby wiedzieć, jak "żaden wątek nie może uzyskać dostępu do tego obiektu".