2013-08-24 25 views
10

Trong chương 5 của ULK các bang tác giả như sau:Có yêu cầu spinlock cho mọi trình xử lý ngắt không?

" ... từng gián đoạn handler là serialized liên quan đến bản thân-có nghĩa là, nó không thể thực hiện nhiều hơn một đồng thời Do đó, việc tiếp cận các cấu trúc dữ liệu. không yêu cầu các nguyên tắc đồng bộ hóa "

Tôi không hiểu tại sao trình xử lý ngắt được" tuần tự hóa "trên các CPU hiện đại với nhiều lõi. Tôi nghĩ rằng có thể có một ISR tương tự có thể chạy trên các lõi khác nhau cùng một lúc, đúng không? Nếu đó là trường hợp, nếu bạn không sử dụng spinlock để bảo vệ dữ liệu của bạn, nó có thể đến một điều kiện chủng tộc. Vì vậy, câu hỏi của tôi là, trên một hệ thống hiện đại với multi-cpus, cho mỗi trình xử lý ngắt bạn sẽ viết mà sẽ đọc & viết một số dữ liệu, là spinlock luôn luôn cần thiết?

Trả lời

7

Trong khi thực hiện các trình xử lý ngắt, hạt nhân vô hiệu hóa ngắt dòng cụ thể đó tại bộ điều khiển ngắt, do đó, một trình xử lý ngắt không thể được thực hiện nhiều hơn một lần đồng thời. (Tuy nhiên, các trình xử lý của các ngắt khác có thể chạy đồng thời.)

+0

Tôi nghĩ, nó chỉ vô hiệu hóa ngắt cho CPU thực thi trình xử lý đó chứ không phải cho các CPU khác. Có đúng không? – Eugene

+1

Nó vô hiệu hóa ngắt dòng, tại bộ điều khiển ngắt. Cho dù * khác * ngắt trên cùng một CPU bị vô hiệu hóa hay không là kiến ​​trúc cụ thể. –

-1

Nếu dữ liệu quan trọng được chia sẻ b/w trình xử lý ngắt và quy trình của bạn (có thể là luồng hạt nhân) thì bạn cần bảo vệ dữ liệu và do đó spinlock là bắt buộc. api Kernel phổ biến cho spinlock là: spin_lock(). Cũng có các biến thể của các api này, ví dụ: spin_lock_irqsave() có thể giúp tránh các vấn đề bế tắc mà người ta có thể gặp phải trong khi mua/giữ ổ khóa quay. Vui lòng xem qua liên kết bên dưới để tìm chi tiết của chủ thể: http://www.linuxjournal.com/article/5833

+0

-1: Hoặc giải thích tại sao 'spin_lock_irqsave' là cần thiết ở đây, hoặc thả nó. Nó vẫn không trả lời câu hỏi. –

4

Làm rõ: theo CL. nhận xét bên dưới - hạt nhân đảm bảo không kích hoạt trình xử lý ngắt cho cùng một ngắt nhưng nếu bạn có nhiều đăng ký của cùng một trình xử lý ngắt cho nhiều ngắt hơn câu trả lời dưới đây, tôi tin là đúng.

Bạn đúng rằng trình xử lý ngắt cùng có thể chạy đồng thời trên nhiều lõi và dữ liệu được chia sẻ cần phải được bảo vệ. Tuy nhiên, một spinlock không phải là cách duy nhất và chắc chắn không phải lúc nào cũng được khuyến nghị để đạt được điều này.

Nhiều phương thức đồng bộ hóa khác, từ dữ liệu trên mỗi CPU, truy cập dữ liệu được chia sẻ chỉ sử dụng phép toán nguyên tử và thậm chí có thể sử dụng các biến thể đọc-sao chép Cập nhật để bảo vệ dữ liệu được chia sẻ.

+2

Điều này là sai; hạt nhân ngăn chặn rõ ràng cùng một trình xử lý ngắt chạy đồng thời trên nhiều lõi. Khi dữ liệu được truy cập * chỉ * từ trình xử lý ngắt, khóa chỉ được yêu cầu nếu các trình xử lý khác nhau chia sẻ cùng một dữ liệu. ULK là chính xác; và [LDD] (http://lwn.net/Kernel/LDD3/) là chính xác ("bạn sẽ không bao giờ thấy hai bộ vi xử lý xử lý cùng một IRQ cùng một lúc.", chương 10). –

+0

@CL. Tôi có thể phân tích cú pháp câu hỏi sai, nhưng tôi nghĩ anh ta hỏi về cùng một trình xử lý ngắt * trên các lõi khác nhau, không phải cho cùng một ngắt. Tôi hiểu các hạt nhân chặn dòng ngắt, nhưng AFAIK hiểu không có gì ngăn cản cùng một trình xử lý ngắt được đăng ký nhiều lần, nếu nó được đăng ký để xử lý một gián đoạn khác nhau. – gby

+0

@gby có quan điểm của bạn. Cảm ơn! – Jun

0

Không cần phải luôn có khóa xoay trong bộ xử lý ngắt. Vui lòng lưu ý một điều trước tiên - Khi ngắt của một thiết bị cụ thể xảy ra trên bộ điều khiển ngắt, ngắt được tắt ở bộ điều khiển ngắt và do đó trên tất cả các lõi cho thiết bị cụ thể đó. Vì vậy, ngắt của cùng một thiết bị không thể đến trên tất cả các CPU cùng một lúc. Vì vậy, trong trường hợp bình thường, sẽ không có bất kỳ khóa quay nào được yêu cầu vì mã sẽ không được tái nhập.

Mặc dù có 2 trường hợp bên dưới trong đó cần có khóa xoay trong trình xử lý ngắt.

  1. Xin lưu ý, khi ngắt từ thiết bị và đường IRQ, lõi đó sẽ vô hiệu hóa tất cả các ngắt khác trên lõi đó và cũng cho thiết bị đó gián đoạn trên lõi khác. Gián đoạn từ các thiết bị khác có thể xuất hiện trên lõi khác.

Vì vậy, có thể có trường hợp trong đó, cùng một trình xử lý ngắt được đăng ký cho các thiết bị khác nhau. ví dụ: - request_irq (A, func, ..); reqest_irq (B, func, ..); cho thiết bị Một trình xử lý ngắt func được gọi. cho thiết bị B cùng một trình xử lý ngắt func được gọi. Vì vậy, một spinlock nên được sử dụng trong trường hợp này để ngăn chặn tình trạng tăng.

  1. Khi cùng một tài nguyên đang được sử dụng trong trình xử lý ngắt và cũng có một số mã khác chạy trong ngữ cảnh quy trình. Ví dụ: - có tài nguyên A Vì vậy, có thể có trường hợp một lõi chạy trong chế độ ngắt, trình xử lý ngắt và đang sửa đổi tài nguyên A và lõi khác chạy trong ngữ cảnh quy trình và cũng sửa đổi cùng một tài nguyên trong một số nơi khác. Vì vậy, để trình bày điều kiện nâng cao cho tài nguyên đó, chúng ta nên sử dụng khóa quay.
Các vấn đề liên quan