Sự khác biệt cơ bản giữa khóa spin và semaphores trong hành động là gì?
Sự khác biệt cơ bản giữa khóa spin và semaphores trong hành động là gì?
Câu trả lời:
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)
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.
Đâ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