Đây là báo giá trực tiếp từ Essential Linux Device Drivers có thể là những gì bạn đang tìm kiếm. Có vẻ như phần đối phó với RCU ở cuối có thể là những gì bạn đang quan tâm.
đọc-Writer Khóa
Một cơ chế điều chỉnh đồng thời chuyên ngành là một biến thể đọc giả của spinlocks. Nếu việc sử dụng một phần quan trọng là sao cho các luồng riêng biệt đọc hoặc ghi vào một cấu trúc dữ liệu được chia sẻ, nhưng không làm cả hai, các ổ khóa này đều là sự phù hợp tự nhiên. Nhiều chủ đề đọc được cho phép bên trong một khu vực quan trọng cùng một lúc. spinlocks đọc được định nghĩa như sau:
rwlock_t myrwlock = RW_LOCK_UNLOCKED;
read_lock(&myrwlock); /* Acquire reader lock */
/* ... Critical Region ... */
read_unlock(&myrwlock); /* Release lock */
Tuy nhiên, nếu một sợi nhà văn đi vào một phần quan trọng, đọc hoặc viết bài khác không được phép vào bên trong. Để sử dụng spinlocks nhà văn, bạn sẽ viết này:
rwlock_t myrwlock = RW_LOCK_UNLOCKED;
write_lock(&myrwlock); /* Acquire writer lock */
/* ... Critical Region ... */
write_unlock(&myrwlock); /* Release lock */
Nhìn vào IPX mã định tuyến có mặt trong net/ipx/ipx_route.c
cho một ví dụ thực tế cuộc sống của một spinlock đọc-viết. A khóa trình đọc giả được gọi là ipx_routes_lock
bảo vệ bảng định tuyến IPX khỏi truy cập đồng thời.Chủ đề cần tra cứu bảng định tuyến để chuyển tiếp gói yêu cầu khóa đọc. Các chủ đề cần thêm hoặc xóa các mục nhập khỏi bảng định tuyến sẽ có được các ổ ghi của người viết. Điều này cải thiện hiệu suất vì thường có nhiều trường hợp tra cứu bảng định tuyến hơn so với các bản cập nhật bảng định tuyến.
Giống như spinlocks thường xuyên, khóa đầu đọc-viết cũng có irq tương ứng biến-cụ thể là, read_lock_irqsave()
, read_lock_irqrestore()
, write_lock_irqsave()
, và write_lock_irqrestore()
. Các ngữ nghĩa của các hàm này tương tự như các hàm spinlocks thông thường.
Khóa trình tự hoặc các bit được giới thiệu trong hạt nhân 2.6, là các khóa trình đọc văn bản, nơi người viết được ưu tiên hơn người đọc. Điều này rất hữu ích nếu các hoạt động ghi trên một biến vượt xa số lần truy cập đọc. Ví dụ là biến số jiffies_64
được thảo luận trước đó trong chương này. Chủ đề của người viết không chờ người đọc có thể ở bên trong một phần quan trọng. Bởi vì điều này, bài đọc có thể khám phá ra rằng entry của họ bên trong một phần quan trọng đã thất bại và có thể cần phải thử lại:
u64 get_jiffies_64(void) /* Defined in kernel/time.c */
{
unsigned long seq;
u64 ret;
do {
seq = read_seqbegin(&xtime_lock);
ret = jiffies_64;
} while (read_seqretry(&xtime_lock, seq));
return ret;
}
Writers bảo vệ các khu vực quan trọng sử dụng write_seqlock()
và write_sequnlock()
.
Các kernel 2.6 giới thiệu một cơ chế gọi là Read-Sao chép Cập nhật (RCU), mà sản lượng được cải thiện hiệu suất khi độc giả vượt xa số nhà văn. Ý tưởng cơ bản là các luồng đọc có thể thực hiện mà không cần khóa . Các luồng Writer phức tạp hơn. Chúng thực hiện các thao tác cập nhật trên bản sao của cấu trúc dữ liệu và thay thế con trỏ mà người đọc thấy. Bản gốc được duy trì cho đến khi chuyển ngữ cảnh tiếp theo trên tất cả các CPU thành đảm bảo hoàn thành tất cả các hoạt động đọc liên tục. Xin lưu ý rằng việc sử dụng RCU có liên quan nhiều hơn việc sử dụng các nguyên tắc được thảo luận từ trước đến nay và chỉ nên được sử dụng nếu bạn chắc chắn rằng đó là công cụ thích hợp cho công việc. Dữ liệu RCU cấu trúc và chức năng giao diện được xác định trong include/linux/rcupdate.h
. Có tài liệu phong phú trong Documentation/RCU/*
.
Để biết ví dụ về cách sử dụng RCU, hãy xem fs/dcache.c
. Trên Linux, mỗi tệp được liên kết với mục nhập thông tin (được lưu trữ trong cấu trúc được gọi là răng giả), thông tin siêu dữ liệu (được lưu trữ trong inode) và dữ liệu thực tế (được lưu trữ trong khối dữ liệu). Mỗi khi bạn thao tác trên một tệp, các thành phần trong đường dẫn tệp được phân tích cú pháp và thu được hàm răng tương ứng. Các răng giả được lưu trữ trong một cấu trúc dữ liệu được gọi là dcache, để tăng tốc độ hoạt động trong tương lai. Bất cứ lúc nào, số lượng tra cứu dcache là nhiều hơn bản cập nhật dcache, do đó, tham chiếu đến dcache được bảo vệ bằng cách sử dụng RCU nguyên thủy.
Tôi không biết câu trả lời cho câu hỏi này, nhưng cuốn sách "Hiểu hạt nhân Linux" có rất nhiều thông tin tốt về loại nội dung này. Đó là một cuốn sách thực sự tuyệt vời, bất cứ ai làm công việc hạt nhân cũng nên đọc nó. – Zifre
Không biết nhiều về hạt nhân đồng thời, nhưng bạn có thể cuộn của riêng bạn với người đọc/nhà văn đếm và khóa trên nhà văn chờ đợi. –
@Nir Vui mừng khi thấy bạn cuối cùng đã chấp nhận câu trả lời sau 4 năm :-) –