Câu trả lời:
Khi bạn sử dụng ổ khóa thường xuyên (mutexes, bộ phận quan trọng vv), hệ điều hành đặt chủ đề của bạn trong trạng thái WAIT và có cản nó bằng cách lập lịch chủ đề khác trên cùng một lõi. Điều này có một hình phạt về hiệu suất nếu thời gian chờ thực sự ngắn, vì luồng của bạn bây giờ phải chờ ưu tiên nhận lại thời gian CPU.
Bên cạnh đó, các đối tượng hạt nhân không có sẵn trong mọi trạng thái của hạt nhân, chẳng hạn như trong trình xử lý ngắt hoặc khi phân trang không khả dụng, v.v.
Spinlocks không gây ra preemption nhưng đợi trong một vòng lặp ("spin") cho đến khi lõi khác giải phóng khóa. Điều này ngăn luồng mất lượng tử và tiếp tục ngay sau khi khóa được giải phóng. Cơ chế đơn giản của spinlock cho phép kernel sử dụng nó ở hầu hết mọi trạng thái.
Đó là lý do tại sao trên một máy lõi đơn, spinlock chỉ đơn giản là "vô hiệu hóa ngắt" hoặc "nâng cao IRQL" ngăn hoàn toàn việc lập lịch luồng.
Spinlocks cuối cùng cho phép các hạt nhân tránh được "Big Kernel Lock" (một khóa có được khi lõi đi vào hạt nhân và được giải phóng khi thoát ra) và có khả năng khóa chi tiết đối với các nguyên thủy của hạt nhân, giúp xử lý đa nhân tốt hơn trên các máy đa nhân, do đó hiệu suất tốt hơn.
CHỈNH SỬA : Một câu hỏi xuất hiện: "Điều đó có nghĩa là tôi nên sử dụng spinlock ở bất cứ đâu có thể?" và tôi sẽ cố gắng trả lời nó:
Như tôi đã đề cập, Spinlocks chỉ hữu ích ở những nơi mà thời gian chờ dự kiến ngắn hơn một lượng tử (đọc: mili giây) và quyền ưu tiên không có nhiều ý nghĩa (ví dụ: không có sẵn các đối tượng hạt nhân).
Nếu thời gian chờ không xác định hoặc nếu bạn đang ở chế độ người dùng, Spinlocks không hiệu quả. Bạn sử dụng 100% thời gian CPU trên lõi chờ trong khi kiểm tra xem có sẵn spinlock hay không. Bạn ngăn các luồng khác chạy trên lõi đó cho đến khi lượng tử của bạn hết hạn. Kịch bản này chỉ khả thi đối với các vụ nổ ngắn ở cấp nhân và không chắc là một tùy chọn cho ứng dụng chế độ người dùng.
Đây là một câu hỏi về SO giải quyết rằng: Spinlocks, Chúng hữu ích như thế nào?
Giả sử một tài nguyên được bảo vệ bởi một khóa, một luồng muốn truy cập vào tài nguyên đó cần phải có được khóa trước. Nếu khóa không khả dụng, chuỗi có thể liên tục kiểm tra xem khóa đã được giải phóng chưa. Trong thời gian này, chuỗi bận chờ đợi, kiểm tra khóa, sử dụng CPU, nhưng không thực hiện bất kỳ công việc hữu ích nào. Một khóa như vậy được gọi là khóa quay.
Đó là một vòng lặp liên tục kéo dài cho đến khi một điều kiện nhất định được đáp ứng:
while(cantGoOn) {};
sleep(0)
nó sẽ chặn luồng, giết chết mục đích sử dụng spinlock ngay từ đầu. nếu bạn cần nhường cho các chủ đề khác, bạn nên sử dụng khóa thông thường. (Tôi biết nhận xét của bạn rất cũ nhưng muốn ngăn người khác xem đây là một gợi ý).
while(something != TRUE ){};
// it happend
move_on();
Đó là một loại khóa không chờ đợi bận rộn
Nó được coi là một mô hình chống, ngoại trừ lập trình trình điều khiển mức rất thấp (nơi có thể xảy ra việc gọi một hàm chờ "thích hợp" có nhiều chi phí hơn là chỉ đơn giản là bận khóa trong một vài chu kỳ).
Xem ví dụ Spinlocks trong nhân Linux .
SpinLocks là những thứ trong đó chủ đề đợi cho đến khi có khóa. Điều này thường được sử dụng để tránh chi phí lấy các đối tượng hạt nhân khi có phạm vi lấy đối tượng hạt nhân trong một khoảng thời gian nhỏ nào đó.
Ví dụ:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
Bạn sẽ muốn sử dụng spinlock khi bạn nghĩ rằng sẽ rẻ hơn khi vào một vòng lặp chờ bận và gộp tài nguyên thay vì chặn khi tài nguyên bị khóa.
Spinning có thể có lợi khi các khóa có chi tiết nhỏ và số lượng lớn (ví dụ: một khóa cho mỗi nút trong danh sách được liên kết) cũng như khi thời gian giữ khóa luôn cực kỳ ngắn. Nói chung, trong khi giữ khóa xoay, người ta nên tránh chặn, gọi bất kỳ thứ gì mà chính nó có thể chặn, giữ nhiều hơn một khóa xoay cùng một lúc, thực hiện các cuộc gọi được điều động động (giao diện và ảo), thực hiện các cuộc gọi được gửi tĩnh thành bất kỳ mã nào mà người ta không ' t sở hữu, hoặc phân bổ bộ nhớ.
Điều quan trọng cần lưu ý là SpinLock là một loại giá trị, vì lý do hiệu suất. Do đó, người ta phải rất cẩn thận để không vô tình sao chép một cá thể SpinLock, vì hai cá thể (bản gốc và bản sao) sau đó sẽ hoàn toàn độc lập với nhau, điều này có thể dẫn đến hành vi sai sót của ứng dụng. Nếu một cá thể SpinLock phải được truyền xung quanh, thì nó phải được chuyển theo tham chiếu chứ không phải theo giá trị.
Tóm lại, spinlock sử dụng phép so sánh và hoán đổi nguyên tử (CAS) hoặc các hướng dẫn thử nghiệm và thiết lập giống như hướng dẫn để triển khai thành ngữ an toàn chuỗi miễn phí, chờ miễn phí. Cấu trúc như vậy mở rộng quy mô tốt trong máy đa lõi.
Vâng, vâng - điểm của khóa spin (so với các phần quan trọng truyền thống, v.v.) là chúng mang lại hiệu suất tốt hơn trong một số trường hợp (hệ thống đa lõi ..), bởi vì chúng không mang lại ngay phần còn lại của lượng tử của luồng.
Spinlock, là một loại khóa, có thể không chặn và không thể ngủ. Bất kỳ luồng nào muốn có được một spinlock cho bất kỳ tài nguyên được chia sẻ hoặc quan trọng nào sẽ liên tục quay, làm lãng phí chu kỳ xử lý của CPU cho đến khi nó có được khóa cho tài nguyên được chỉ định. Sau khi có được spinlock, nó sẽ cố gắng hoàn thành công việc trong lượng tử của nó và sau đó giải phóng tài nguyên tương ứng. Spinlock là loại khóa có mức độ ưu tiên cao nhất, có thể nói đơn giản, nó là loại khóa không phủ đầu.