sự khác biệt giữa khóa spin và semaphores là gì?


15

Sự khác biệt cơ bản giữa khóa spin và semaphores trong hành động là gì?



@Gilles Tôi cũng đã xem cái đó, nhưng đề cập duy nhất về semaphores trên trang là Warren nhận xét rằng "Nếu người ta muốn biết sự khác biệt giữa khóa xoay và, nói, một semaphore, đó là một câu hỏi khác."
Michael Mrozek

@Michael: ok, tôi nghĩ rằng câu trả lời đã giải quyết vấn đề chính, nhưng bạn nói đúng rằng không ai nói rõ rằng semaphores là một trong những loại khóa khác.
Gilles 'SO- ngừng trở nên xấu xa'

Giải thích của Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut 20/03/2015

Bản sao của stackoverflow.com/questions/195853/spinlock-versus-semaphore Nhiều lời giải thích hay được trình bày trong chủ đề mà tôi đã hỏi.
iankits

Câu trả lời:


13

Cả hai quản lý một nguồn lực hạn chế. Trước tiên tôi sẽ mô tả sự khác biệt giữa semaphore nhị phân (mutex) và khóa spin.

Khóa xoay thực hiện một chờ đợi bận rộn - tức là nó tiếp tục chạy vòng lặp:

while (try_acquire_resource ());
...
release();

Nó thực hiện khóa / mở khóa rất nhẹ nhưng nếu luồng khóa sẽ bị chặn bởi người khác sẽ cố gắng truy cập cùng một nguồn, thì thứ hai sẽ chỉ đơn giản là cố gắng lấy lại tài nguyên cho đến khi hết lượng tử CPU.

Mặt khác, mutex hành xử giống như:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Do đó, nếu luồng sẽ cố gắng thu được tài nguyên bị chặn, nó sẽ bị treo cho đến khi nó có sẵn cho nó. Khóa / mở khóa nặng hơn nhiều nhưng chờ đợi là 'miễn phí' và 'công bằng'.

Semaphore là một khóa được phép sử dụng nhiều lần (được biết từ khởi tạo) số lần - ví dụ 3 luồng được phép đồng thời giữ tài nguyên nhưng không còn nữa. Nó được sử dụng ví dụ trong vấn đề nhà sản xuất / người tiêu dùng hoặc nói chung trong hàng đợi:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

Giải thích tốt, tôi chỉ muốn nhấn mạnh một điểm. Semaphore vs mutex là một vấn đề về giao diện: một mutex có được giữ hay không, trong khi một semaphore được giữ bởi tối đa N luồng; một mutex là một trường hợp đặc biệt của semaphores với N = 1. Spinlock so với các loại khóa khác là một vấn đề thực hiện: một spinlock tiếp tục cố gắng để có được khóa, trong khi các loại khác chờ thông báo. Trong ngữ cảnh nhân Linux, khóa duy nhất có cài đặt spin có giao diện mutex.
Gilles 'SO- ngừng trở nên xấu xa'

Trong ngữ cảnh nhân Linux, khóa duy nhất có cài đặt spin có giao diện mutex. Tôi không hiểu dòng này. Bạn có thể vui lòng mở rộng về nó?
Sen

@Sen: Ông có nghĩa là khóa spin trong Linux hoạt động nhị phân (nó có bị khóa hay không). Có thể có một khóa quay hoạt động như semaphor.
Maciej Piechotka

Nhưng nếu chủ đề khóa sẽ bị chặn bởi người khác sẽ cố gắng truy cập cùng một nguồn, thì người thứ hai sẽ đơn giản cố gắng lấy lại tài nguyên cho đến khi nó hết lượng tử CPU. Điều gì sẽ xảy ra nếu một nhiệm vụ có nhiều ưu tiên hơn cần truy cập vào tài nguyên. Nó chỉ được xếp hàng? Có thể tốt hơn để vô hiệu hóa việc chia sẻ tài nguyên giữa các nhiệm vụ với các ưu tiên khác nhau.
Hibou57

@ Hibou57: Có, nó bị chặn vì trạng thái không nhất quán và sử dụng tài nguyên sẽ có hiệu ứng 'buồn cười' (giả sử luồng ưu tiên thấp nằm ở giữa thêm hoặc xóa thứ gì đó vào / từ danh sách được liên kết). Điểm của tuyên bố này là nếu luồng bị chặn thì nó không được lên lịch nên nó không tiêu tốn tài nguyên trong khi luồng chờ trên spinlock thì không. Khóa cho các hệ thống thời gian thực (đặc biệt khó) là chủ đề khác nhau và tôi không có đủ kiến ​​thức để trả lời nó - tuy nhiên những hệ thống đó đôi khi thực hiện quyên góp ưu tiên hoặc các kỹ thuật khác.
Maciej Piechotka

2

Spinlocks được sử dụng trong một bối cảnh gián đoạn, nơi không được phép ngủ. Họ thăm dò trong một vòng lặp chặt chẽ, không làm gì khác cho đến khi có được tài nguyên. Chủ yếu được sử dụng trong ISR, và an toàn và hiệu quả hơn.

Semaphores có thể được sử dụng trong một bối cảnh quá trình, trong đó ngủ là ok.


1

Đây là câu trả lời nhanh của tôi về một câu trả lời: khóa xoay và một semaphore nhị phân (quản lý một tài nguyên chỉ có thể được sử dụng bởi một thứ) gần như giống hệt nhau. Điểm khác biệt của chúng là các khóa spin quản lý mã được chạy trong khi các ngữ nghĩa nhị phân quản lý một số loại tài nguyên số ít (ví dụ: thời gian cpu, đầu ra hiển thị)

Tuy nhiên, một semaphore thông thường có thể quản lý một số luồng truy cập vào một tài nguyên có thể được phân chia giữa một số, nhưng bị giới hạn (ví dụ: bộ nhớ, băng thông mạng)

Nói tóm lại, khóa xoay có khả năng tiếp tục hỏi một semaphore nếu nó có thể sử dụng tài nguyên. (Hãy tưởng tượng một đứa trẻ phải sử dụng phòng tắm và chờ người khác kết thúc.)

Nguồn: Giới thiệu về lập trình hệ thống, hệ điều hành và wikipedia

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.