2013-06-15 14 views
9

Tôi mới dùng Linux kernel. Câu hỏi của tôi là về số task_struct. Tôi biết rằng Mỗi task_struct có tham chiếu đến quy trình gốc của nó thông qua một con trỏ đến số task_struct của phụ huynh.__rcu là viết tắt của linux?

Sau khi xem xét các sched.h trong định nghĩa task_struct tôi nhận thấy như sau:

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

tôi thấy rằng nó được tham chiếu đến compiler.h. Tôi đoán rằng "__rcu" là viết tắt của "read copy update"

Ai đó có thể làm rõ cú pháp không?

Trả lời

8

Đọc-sao chép-cập nhật là một thuật toán cho phép truy cập đồng thời vào người đọc của cấu trúc dữ liệu mà không phải khóa cấu trúc. Nó có thể được đọc về here.

Nếu hạt nhân được xây dựng với các tùy chọn CONFIG_SPARSE_RCU_POINTER config, __rcu được định nghĩa trong include/linux/compiler.h như

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

Đây là một chú thích cho một công cụ phân tích mã thưa thớt, có thể cảnh báo về những điều nào đó các lập trình viên có thể đã bị bỏ qua .Làm sao chuyện này có liên quan đến RCU được giải thích trong Documentation/RCU/checklist.txt:

thưa thớt __rcu kiểm tra: thẻ con trỏ đến dữ liệu RCU được bảo vệ bằng cấu trúc với __rcu, và thưa thớt sẽ cảnh báo bạn nếu bạn truy cập mà con trỏ mà không cần sự phục vụ của một trong các biến thể của rcu_dereference().

rcu_dereference() trả về con trỏ có thể được bảo vệ an toàn bằng mã RCU, cho phép các công cụ như Sparse kiểm tra lỗi lập trình và thiếu sót.

5

RCU là viết tắt của "đọc, sao chép, cập nhật". Nó là một thuật toán cho phép nhiều người đọc truy cập dữ liệu có thể được cập nhật hoặc thậm chí bị xóa cùng lúc bởi các nhà văn.

Theo RCU, các nhà văn vẫn phải đảm bảo loại trừ lẫn nhau liên quan đến nhau, nhưng độc giả không có khóa. Cần lưu ý rằng cấu trúc dữ liệu được chia sẻ được cập nhật theo những cách không vi phạm tính toàn vẹn của đọc. Nếu một cái gì đó phải được loại bỏ hoặc xóa, việc hủy liên kết của mục đó khỏi cấu trúc dữ liệu có thể được thực hiện song song với người đọc nhưng việc xóa thực tế bộ nhớ phải chờ cho đến khi người đọc cuối cùng kết thúc.

Thay vì làm cho người đọc có được khóa, nơi ở của người đọc được phỏng đoán theo những cách khác. Chủ đề có thể thông báo ý định của họ để duyệt cấu trúc dữ liệu bằng cách tham gia một "phần bên đọc quan trọng" mà không thực sự là một khóa nhưng là một loại giai đoạn toàn cầu. Ví dụ, giả sử rằng một số luồng đã nhập phần quan trọng bên đọc RCU trong pha 0. Trình cập nhật đã thực hiện xóa và muốn giải phóng một phần bộ nhớ. Nó chỉ đơn giản là đợi tất cả các luồng trong hệ thống rời khỏi giai đoạn 0. Trong khi đó, các độc giả khác đang xem cấu trúc dữ liệu, nhưng khi họ tuyên bố ý định của họ với RCU, họ làm như vậy bằng cách nhập vào RCU phần dưới giai đoạn 1. Chỉ có các chủ đề pha 0 có thể vẫn có một con trỏ tới đối tượng đã bị xóa, và vì vậy khi luồng cuối cùng rời khỏi pha 0, đối tượng có thể xóa một cách an toàn. Chủ đề mới đến trong giai đoạn 1 không thấy đối tượng, bởi vì đối tượng đã bị xóa khỏi cấu trúc dữ liệu, vì vậy họ không có cách nào để tìm thấy nó.

RCU tận dụng ý tưởng rằng chúng tôi không cần các đối tượng khóa được "sở hữu" để biết thông tin như "không có chuỗi nào có thể truy cập được đối tượng này nữa".