2011-08-15 43 views
6

Tôi biết rằng trong Linux mutexes được thực hiện như futexes xuống bên dưới và futex sử dụng so sánh-và-swap cơ chế. Và thường là để có được khóa, một luồng không gian người dùng không cần thực hiện cuộc gọi hệ thống khi khóa được giải quyết trong không gian người dùng.Mutex truy cập và hệ thống gọi

Bây giờ câu hỏi của tôi là những gì sẽ xảy ra khi có tranh chấp cao và nhiều chủ đề đang cố gắng khóa một mutex cùng một lúc. Có một cuộc gọi hệ thống xảy ra sau đó cho hạt nhân để quyết định chủ đề để cấp mutex? Đặc biệt là khi ưu tiên luồng khác nhau? Bản thân tôi cũng nghĩ thế.

Trả lời

7

Miễn là không có tranh chấp, không có cuộc gọi hệ thống nào được thực hiện. Nếu có tranh chấp, sau đó một cuộc gọi hệ thống được thực hiện để đặt các chủ đề trong một hàng đợi ngủ mà sau đó sẽ được sử dụng để tìm thread đầu tiên để thức dậy khi mutex trở nên miễn phí. Ngoài ra, điều chỉnh được thực hiện trong syscall với giá trị của futex để chủ sở hữu hiện đang sở hữu sẽ không đi qua quy trình mở khóa "đường dẫn nhanh" của người dùng (chỉ đơn giản là đặt lại futex về 0 hoặc "mở khóa") giá trị), nhưng thay vào đó sẽ thực hiện một cuộc gọi hệ thống khác để kiểm tra hàng đợi ngủ cho các chuỗi chờ đợi để chuyển quyền sở hữu khóa cho. Với nhiều chủ đề cạnh tranh cho một khóa, có tất nhiên sẽ là một cơ hội cao hơn của một ganh đua được tìm thấy, nhưng một lần nữa, nếu không có tranh chấp, sau đó không có sys-gọi được thực hiện.

3

Chỉ thực hiện một số lượng nhỏ các vòng trước khi quay trở lại syscall, do đó, trong trường hợp có khóa cao, có khả năng cao là các chuỗi sẽ dự phòng thành syscall.

Các vấn đề liên quan