2009-05-31 15 views
5

tôi cần phải giải quyết một vấn đề khóa cho kịch bản này là gì:cơ chế khóa kernel Linux tốt nhất cho một kịch bản cụ thể

  1. Một hệ thống đa CPU.
  2. Tất cả CPU sử dụng tài nguyên (phần mềm) chung.
  3. Chỉ đọc quyền truy cập vào tài nguyên là rất phổ biến. (Xử lý các gói mạng đến)
  4. Quyền truy cập ghi ít thường xuyên hơn nhiều. (Chỉ có nhiều thay đổi cấu hình).

Hiện tại tôi đang sử dụng cơ chế read_lock_bh, write_lock_bh (spinlocks). Vấn đề là càng có nhiều CPU, tôi càng bị khóa mềm trong ngữ cảnh nhà văn.

Tôi đã đọc chương tương tranh trong this book, Nhưng không thể hiểu được liệu người đọc hoặc người viết có được ưu tiên khi sử dụng khóa quay hay không.

Vì vậy, câu hỏi là:

  1. Có cơ chế spinlock Linux ưu tiên người đọc/nhà văn/không ai trong số họ?
  2. Có cơ chế nào tốt hơn tôi có thể sử dụng để tránh những phần mềm bị khóa trong kịch bản của tôi hay không? Có thể là cách để tôi ưu tiên người viết bất cứ khi nào nó cố khóa, trong khi sử dụng giải pháp hiện tại của tôi?

Cảm ơn, Nir

+0

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

+0

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. –

+0

@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 :-) –

Trả lời

5

Đâ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()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.

0

Nếu công việc bạn làm trong khi giữ khóa là nhỏ, bạn có thể thử một mutex bình thường, không đọc-viết. Nó hiệu quả hơn.

+0

Nó loại bỏ điểm của việc có một máy đa CPU. Điều này sẽ làm cho nó hữu ích như một máy CPU đơn lẻ. – Nir

3

Đây có phải là trường hợp sử dụng RCU được thiết kế để xử lý không? Xem http://lwn.net/Articles/262464/ để biết rõ về cách sử dụng của nó.

+0

Tôi đọc về RCU trong cuốn sách tôi đã đề cập. Vấn đề là, như tôi hiểu, nó chỉ được thiết kế cho một người viết. Tôi có thể có nhiều hơn. Bên cạnh đó, tôi nghĩ tôi sẽ phải thay đổi kiến ​​trúc của mình để nó hoạt động. Cảm ơn mặc dù. (Cập nhật mọi thứ và sau đó chỉ cần thay thế một con trỏ.) – Nir

Các vấn đề liên quan