Những người khác đã trả lời. Tôi sẽ tóm tắt các trường hợp bạn sẽ sử dụng spinlock và các quy tắc để sử dụng spinlock.
1. Khi spinlock được sử dụng?
Trả lời: Trong các tình huống sau.
- Các chủ đề giữ khóa không được phép ngủ.
- Sợi chỉ chờ khóa không ngủ, nhưng quay tròn trong một vòng lặp chặt chẽ.
Khi được sử dụng đúng cách, spinlock có thể cho hiệu suất cao hơn semaphore. Vd: Xử lý xâm nhập.
2. Các quy tắc để sử dụng spinlocks là gì?
Trả lời:
Quy tắc - 1: Bất kỳ mã nào chứa spinlock, không thể từ bỏ bộ xử lý vì bất kỳ lý do nào ngoại trừ các ngắt dịch vụ (đôi khi thậm chí không phải sau đó). Vì vậy, mã giữ spinlock không thể ngủ.
Lý do: giả sử tài xế của bạn cầm spinlock đi ngủ. Ví dụ: chức năng gọi copy_from_user()
hoặc copy_to_user()
, hoặc quyền ưu tiên kernel khởi động trong quá trình ưu tiên cao hơn để đẩy mã của bạn sang một bên. Hiệu quả quá trình từ bỏ CPU giữ spinlock.
Bây giờ chúng tôi không biết khi nào mã sẽ phát hành khóa. Nếu một số luồng khác cố gắng để có được cùng một khóa, nó sẽ quay trong thời gian rất dài. Trong trường hợp xấu nhất, nó sẽ dẫn đến deedlock.
Trường hợp ưu tiên hạt nhân được xử lý bởi chính mã spinlock. Bất cứ lúc nào mã hạt nhân giữ một spinlock, quyền ưu tiên bị vô hiệu hóa trên bộ xử lý có liên quan. Ngay cả hệ thống bộ xử lý đơn cũng phải vô hiệu hóa quyền ưu tiên theo cách này.
Quy tắc - 2: Vô hiệu hóa các ngắt trên CPU cục bộ, trong khi spinlock được giữ.
Lý do: Hỗ trợ trình điều khiển của bạn thực hiện một spinlock kiểm soát truy cập vào thiết bị và sau đó phát ra một ngắt. Điều này làm cho trình xử lý ngắt chạy. Bây giờ trình xử lý ngắt cũng cần khóa để truy cập thiết bị. Nếu trình xử lý ngắt chạy trên cùng một bộ xử lý, nó sẽ bắt đầu quay. Mã trình điều khiển cũng không thể chạy để giải phóng khóa. Vì vậy, bộ xử lý sẽ quay mãi mãi.
Quy tắc - 3: Spinlocks phải được tổ chức trong thời gian tối thiểu có thể.
Lý do: Thời gian giữ khóa dài cũng giữ cho bộ xử lý hiện tại không lên lịch, nghĩa là quá trình ưu tiên cao hơn có thể phải chờ để lấy CPU.
Vì vậy, nó ảnh hưởng đến độ trễ của hạt nhân (thời gian một quá trình có thể phải chờ để được lên lịch). Thông thường các spinlocks nên được giữ trong khoảng thời gian, ít hơn CPU đó để thực hiện chuyển đổi bối cảnh giữa các luồng.
Quy tắc -4: nếu bạn có cả semaphores và spinlocks đều được thực hiện. Sau đó lấy semaphore trước và sau đó spinlock.