Chính xác thì "khóa quay" là gì?


108

Tôi luôn tự hỏi chúng là gì: mỗi khi tôi nghe về chúng, hình ảnh của những thiết bị giống như bánh đà trong tương lai lại nhảy múa (lăn?) Trong tâm trí tôi ...

Họ là ai?

Câu trả lời:


125

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?


có nghĩa là tôi nên quay khóa (thay vì mutex, phần quan trọng, v.v.) bất cứ khi nào có thể?

1
ai đó vui lòng sửa cho tôi nếu tôi sai, nhưng spinlock không vô hiệu hóa quyền ưu tiên (tức là lập lịch lại). vì lý do đơn giản rằng, nếu spinlock đang đợi một tài nguyên bị khóa bởi một quy trình khác, thì quy trình thứ hai đó phải được tạo cơ hội để chạy và giải phóng tài nguyên. hoặc, chạy quy trình thứ hai yêu cầu trước quy trình đầu tiên (quay).
dùng1284631

thay vào đó, spinlock làm được gì là nó không thay đổi trạng thái quy trình từ TASK_RUNNING thành TASK_INTERRUPTIBLE (là trạng thái ngủ) và do đó, nó không lưu mọi thứ về quá trình đó (bộ nhớ, bộ nhớ cache, v.v.). thay vào đó, quá trình quay được ưu tiên trước, nhưng nó không bao giờ thoát khỏi các quá trình "có thể lập lịch ngay lập tức": nó được lưu trong bộ nhớ và các quá trình khác được chạy thường xuyên cho đến khi một trong số chúng giải phóng tài nguyên mà người quay đang chờ đợi: tại thời điểm đó, spinlock chỉ cần quay trở lại và quá trình quay có thể tiếp tục. nó chờ ở trạng thái luôn TASK_RUNNING.
dùng1284631

1
bạn nói đúng về điều đó (xem thêm phần này: linuxjournal.com/article/5833 ), nhưng thực tế là việc khóa nguồn ressource và vô hiệu hóa ngắt, mặc dù hữu ích khi được thực hiện cùng nhau, là những khái niệm không liên quan. về cơ bản bạn muốn chắc chắn rằng bạn không sử dụng tài nguyên được tìm thấy ở trạng thái không nhất quán và đây là lý do tại sao bạn kiểm tra khóa của nó. vô hiệu hóa ngắt (cũng là quyền ưu tiên) đảm bảo rằng có, không ai sẽ gây rối với sự phục hồi của bạn trong khi bạn đang xử lý nó. nhưng, đối với điều đó, bạn phải chắc chắn rằng tài nguyên đó là miễn phí khi bạn mua nó.
user1284631

1
(sau đó vô hiệu hóa ngắt chỉ để đảm bảo rằng không có nhiệm vụ nào khác đang tấn công bạn và gây rối với tài nguyên). trên UP (bộ xử lý đơn), điều này luôn xảy ra: spinlock đầu tiên (và những cái tiếp theo) chỉ được cấp, ngắt (tức là quyền ưu tiên) bị vô hiệu hóa và tác vụ sử dụng tài nguyên không bao giờ được ưu tiên: nó thực hiện tất cả làm việc với tài nguyên, sau đó kích hoạt ngắt (và do đó, quyền ưu tiên). khi quyền ưu tiên được bật, thì tài nguyên đã miễn phí. về cơ bản, trên UP, không có tranh chấp spinlockkhông phải chờ đợi . trên SMP nó có thể là.
user1284631

25

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.


2
Câu trả lời rất hay! 1
Jayesh Bhoi

18

Đó 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) {};

1
Và / hoặc trong khi (cantGoOn) {sleep (0)};
Jiminion

@Jiminion nếu bạn đặt 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 ý).
Sedat Kapanoglu

"Giá trị bằng 0 làm cho chuỗi chuyển phần còn lại của lát thời gian của nó sang bất kỳ chuỗi nào khác sẵn sàng chạy. Nếu không có chuỗi nào khác sẵn sàng chạy, hàm trả về ngay lập tức và chuỗi tiếp tục thực hiện."
Jiminion


5

Đó 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 .


3

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

3

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


1

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.


Theo định nghĩa, một spinlock không được sử dụng để triển khai bất kỳ thứ gì khóa miễn phí hoặc không chờ đợi.
rdb

0

Đó là một vòng lặp quay xung quanh cho đến khi một điều kiện được đáp ứng.


0

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.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.