Câu hỏi về chủ đề và khóa


7

Tôi hiện đang đọc Fuss, Futexes và Furwocks: Khóa người dùng nhanh trong Linux và đã xem qua trích dẫn này:

Trong sơ đồ khóa công bằng, khóa được cấp theo thứ tự được yêu cầu. Điều này có thể có tác động tiêu cực đến thông lượng do số lượng chuyển đổi ngữ cảnh tăng lên. Đồng thời nó có thể dẫn đến vấn đề được gọi là đoàn xe. Vì các khóa được cấp theo thứ tự đến, tất cả đều tiến hành ở tốc độ của quy trình chậm nhất, làm chậm tất cả các quy trình chờ. Một giải pháp chung cho vấn đề đoàn xe là đánh dấu khóa có sẵn khi phát hành, đánh thức tất cả các quy trình chờ đợi và yêu cầu chúng tái sử dụng khóa. Điều này được gọi là công bằng ngẫu nhiên. Tuy nhiên, điều này cũng dẫn đến vấn đề bầy đàn sấm sét. Mặc dù vậy, nó có thể hoạt động tốt trên các hệ thống vi xử lý nếu tác vụ đầu tiên đánh thức giải phóng khóa trước khi bị cấm hoặc lên lịch, cho phép thành viên bầy đàn thứ hai có được khóa, v.v ...

Tôi có một vài câu hỏi về trích dẫn này.

Đầu tiên, liệu một lược đồ khóa công bằng có dẫn đến số lượng chuyển đổi ngữ cảnh tăng lên không vì các tác vụ khác nhau đưa các quy trình vào hàng đợi tại các thời điểm khác nhau và do đó bằng cách phục vụ các quy trình theo thứ tự chúng được nhận, chúng ta sẽ chuyển đổi ngữ cảnh giữa nhiều tác vụ?

Thứ hai, làm thế nào để cấp các khóa theo thứ tự đến khiến các quá trình tiến hành ở tốc độ của quá trình chậm nhất? Đây sẽ không chỉ là trường hợp nếu quy trình chậm nhất được cấp khóa trước các quy trình khác? Tương tự như vậy, làm thế nào để có các quá trình tranh chấp ngẫu nhiên cho khóa giải quyết vấn đề đoàn xe?

Cuối cùng, tôi không hiểu làm thế nào công bằng ngẫu nhiên là tốt hơn trên các hệ thống xử lý đơn so với các hệ thống đa bộ xử lý. Ví dụ, trong cả hai trường hợp, tất cả các bộ xử lý đang chờ đều thức dậy, một cái bị khóa và những cái khác phải đi ngủ lại, phải không? Vậy làm thế nào để nó hoạt động tốt trên các hệ thống vi xử lý?


1
Hãy tập trung vào một câu hỏi nếu bạn có thể. Mỗi câu hỏi nên có trong bài đăng của riêng họ, có thể bị trì hoãn thời gian nếu câu trả lời của một người có thể giúp giải đáp.
Raphael

Câu trả lời:


4

Hãy để tôi trả lời câu hỏi cuối cùng trước. Nó chỉ ra rằng bài báo được viết vào năm 2002, khi bộ xử lý đa lõi đắt hơn nhiều. Tôi nghĩ rằng các tác giả chủ yếu quan tâm đến việc tối ưu hóa cho trường hợp lõi đơn.

... Làm thế nào [là] sự công bằng ngẫu nhiên ... bất kỳ tốt hơn trên các hệ thống xử lý đơn so với các hệ thống đa bộ xử lý.

Trên một bộ xử lý đơn, chỉ có một lịch trình có thể được lên lịch tại một thời điểm. Vì vậy, mọi người đều "thức dậy", nhưng điều đó chỉ có nghĩa là họ được chuyển từ trạng thái chờ sang trạng thái sẵn sàng. Sau đó, bộ lập lịch được gọi và nó chọn một trong các quy trình sẵn sàng để chạy và cho phép quá trình đó chạy trong một khoảng thời gian.

Điều đầu tiên mà quá trình mới thực hiện là có được khóa. Sau đó, nó thực hiện một số xử lý và (nếu bạn không may mắn) phát hành khóa. Trong trường hợp này, lần tới, bộ lập lịch kernel được điều khiển, nó chọn một quá trình "sẵn sàng" khác và bắt đầu chạy. Nếu quy trình đầu tiên phát hành khóa, thì quy trình thứ hai sẽ có được nó, v.v.

Mặt khác, trên nhiều bộ xử lý, tất cả các quy trình có thể bị "đánh thức" và sau đó bộ lập lịch bắt đầu một số / nhiều / tất cả chúng chạy đồng thời trên các bộ xử lý khác nhau. Một trong các quy trình sẽ có được khóa, nhưng tất cả các quy trình khác sẽ cố gắng có được khóa, ngay lập tức thất bại và tự quay trở lại trạng thái ngủ trên hàng đợi. Vì vậy, trên tất cả các bộ xử lý, nhưng bạn chỉ lãng phí một số cuộc gọi kernel và một số chuyển đổi ngữ cảnh để bạn có thể nói với một loạt các quy trình mà không có gì để làm.

Liệu một lược đồ khóa công bằng dẫn đến số lượng chuyển đổi ngữ cảnh tăng lên vì các tác vụ khác nhau đưa các quy trình vào hàng đợi vào các thời điểm khác nhau và do đó bằng cách phục vụ các quy trình theo thứ tự chúng được nhận, chúng ta sẽ chuyển đổi ngữ cảnh giữa nhiều tác vụ?

Tôi nghĩ trường hợp họ có trong đầu là nếu bạn có nhiều quy trình (trên một bộ xử lý), trong đó mỗi quy trình thu được cùng một khóa liên tục trong khoảng thời gian ngắn. Trong trường hợp không công bằng, quy trình đầu tiên có thể chạy trong một thời gian và có được và giải phóng khóa nhiều lần mà không cần thực hiện chuyển đổi ngữ cảnh. Sau đó, quá trình thứ hai chạy trong một thời gian và mua lại và phát hành khóa nhiều lần.

Trong trường hợp "công bằng", quy trình đầu tiên khóa / phát hành và sau đó lần thứ hai cố gắng khóa nó phải được đưa vào chế độ ngủ và hạt nhân phải thực hiện chuyển đổi ngữ cảnh và đánh thức quá trình khác. Các quá trình ping-pong qua lại làm "thức dậy, khóa, mở khóa, làm việc một chút, cố gắng khóa, được đưa vào giấc ngủ."

làm thế nào để cấp các khóa theo thứ tự đến khiến các quá trình tiến hành ở tốc độ của quá trình chậm nhất? Đây sẽ không chỉ là trường hợp nếu quy trình chậm nhất được cấp khóa trước các quy trình khác? Tương tự như vậy, làm thế nào để có các quá trình tranh chấp ngẫu nhiên cho khóa giải quyết vấn đề đoàn xe?

Tôi nghĩ rằng họ đang thực hiện quan sát rằng, trên một bộ xử lý đơn, công việc ngắn nhất (không công bằng) có thời gian chờ trung bình ngắn hơn so với thực hiện vòng tròn (công bằng). Nhưng tôi không hiểu làm thế nào ngẫu nhiên giảm thời gian chờ trung bình so với vòng tròn.


Cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn. Điều này làm cho mọi thứ rõ ràng hơn nhiều!
Tên hiển thị công khai
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.