2012-08-14 26 views
16

Trong một bình luận về câu hỏi Automatically release mutex on crashes in Unix trở lại trong năm 2010, jilles tuyên bố: mutexes mạnh mẽĐiều kiện chủng tộc trong glibc/NPTL/Linux mạnh mẽ mutexes?

glibc của rất nhanh vì glibc mất phím tắt nguy hiểm. Không có gì đảm bảo rằng mutex vẫn tồn tại khi hạt nhân đánh dấu nó là "sẽ gây ra EOWNERDEAD". Nếu mutex bị phá hủy và bộ nhớ được thay thế bởi một tập tin ánh xạ bộ nhớ có chứa ID của chủ sở hữu cuối cùng ở đúng vị trí và chủ sở hữu cuối cùng chấm dứt ngay sau khi viết từ khóa (nhưng trước khi gỡ bỏ hoàn toàn mutex khỏi danh sách sở hữu mutexes), tệp bị hỏng. Solaris và will-be-FreeBSD9 mạnh mẽ mutexes là chậm hơn bởi vì họ không muốn chấp nhận rủi ro này.

Tôi không thể thực hiện bất kỳ khiếu nại nào, vì phá hủy một mutex không hợp pháp trừ khi nó được mở khóa (và do đó không nằm trong danh sách mạnh mẽ của bất kỳ chủ đề nào). Tôi cũng không thể tìm thấy bất kỳ tài liệu tham khảo nào tìm kiếm lỗi/vấn đề như vậy. Đơn kiện chỉ đơn giản là sai lầm?

Lý do tôi hỏi và tôi quan tâm là điều này có liên quan đến tính chính xác của việc triển khai của chính tôi được xây dựng dựa trên cùng một nguyên tắc mạnh mẽ của Linux-mutex.

+3

omg, tên lỗi có NERD trong đó –

+0

Dường như phương pháp tiếp cận dựa trên VMA cũ có một số vấn đề ít nhất; http://www.kernel.org/doc/Documentation/robust-futexes.txt. Tuy nhiên, nếu tôi đọc nó một cách chính xác danh sách được duy trì trong bộ nhớ không gian người dùng - vì vậy bạn phải làm gì nếu bộ nhớ đó bị hỏng? Mặc dù điều đó có lẽ chỉ có thể được xem như một trường hợp đặc biệt làm hỏng bộ nhớ dùng chung. – nos

+0

Có, tôi thấy rằng danh sách hoặc thậm chí nội dung mutex có thể bị hỏng nếu quá trình chạy amok và ghi đè chúng. Đây có phải là vấn đề đang được mô tả không? Tôi không lo lắng về việc đảm bảo hành vi thích hợp khi một quá trình với quyền truy cập vào mutex đã gọi hành vi không xác định; Tôi chỉ quan tâm đến khả năng của một số điều kiện chủng tộc trong việc sử dụng rõ ràng của mutex mạnh mẽ. –

Trả lời

6

Mô tả cuộc đua của nhà phát triển FreeBSD pthread David Xu: http://lists.freebsd.org/pipermail/svn-src-user/2010-November/003668.html

Tôi không nghĩ rằng chu trình munmap/mmap là bắt buộc đối với cuộc đua. Các mảnh bộ nhớ chia sẻ có thể được đưa vào một sử dụng khác nhau là tốt. Điều này là không phổ biến nhưng hợp lệ.

Như cũng được đề cập trong thông báo đó, nhiều "vui" xảy ra hơn nếu các chủ đề có đặc quyền khác nhau truy cập một mutex mạnh mẽ thông thường. Bởi vì nút cho danh sách các mutex mạnh được sở hữu nằm trong chính mutex, một chuỗi có đặc quyền thấp có thể làm hỏng danh sách luồng của đặc quyền cao.Điều này có thể được khai thác một cách dễ dàng để làm cho sự cố thread đặc quyền cao và trong trường hợp hiếm hoi điều này có thể cho phép bộ nhớ của đặc quyền cao bị hỏng. Rõ ràng các mutex mạnh mẽ của Linux chỉ được thiết kế để sử dụng bởi các luồng có cùng đặc quyền. Điều này có thể tránh được dễ dàng bằng cách làm cho danh sách mạnh mẽ trở thành một mảng hoàn toàn trong bộ nhớ của luồng thay vì một danh sách liên kết.

+1

Cảm ơn bạn đã bắt gặp vấn đề về việc đưa bộ nhớ vào một mục đích sử dụng khác mà không cần phải vạch ra nó. Điều này nên tránh được bằng cách đặt một số loại đồng bộ hóa trong 'pthread_mutex_destroy' ... –

+0

Thực ra, tôi đặt câu hỏi liệu có thể tránh được vấn đề đó hay không. Trong cùng một quá trình, nó chắc chắn có thể tránh được, nhưng giữa nhiều quá trình, không có cách rõ ràng để "chờ đợi cho bất kỳ quá trình vẫn có thể có một con trỏ đang chờ xử lý cũ để mutex để thả nó". Tôi không nghĩ vấn đề này khá nghiêm trọng như vấn đề "lập bản đồ mới" (vì nó chỉ ảnh hưởng đến trường hợp sử dụng rất đặc biệt, tái sử dụng cùng một bộ nhớ dùng chung cho một mục đích khác), nhưng nó vẫn còn khá rắc rối. –

+1

Về câu cuối cùng của bạn, giải pháp "dễ dàng" bằng cách sử dụng một mảng thay vì một danh sách liên kết là không thực sự dễ dàng. Bạn không có bộ nhớ cho một mảng. Yêu cầu lưu trữ tăng tuyến tính với số lượng các mutex mạnh mà thread giữ và cách duy nhất để có được lưu trữ đó mà không cần phân bổ bổ sung (có thể thất bại) tại thời gian khóa là đặt nó vào chính mutexes. Tôi đồng ý nó không may, nhưng dường như không có cách nào khác. Hầu hết các giải pháp không gian hạt nhân cũng yêu cầu phân bổ tại thời gian khóa, có thể không thành công, hiển thị khóa thay vì vô ích ... –

8

Tôi nghĩ rằng tôi đã tìm thấy cuộc đua, và nó thực sự rất xấu xí. Nó giống như thế này:

Chủ đề A đã tổ chức mutex mạnh mẽ và mở khóa. Quy trình cơ bản là:

  1. Đặt nó vào vị trí "đang chờ xử lý" của tiêu đề danh sách mạnh mẽ của chuỗi.
  2. Xóa sách khỏi danh sách liên kết các mutex mạnh được tổ chức bởi chuỗi hiện tại.
  3. Mở khóa mutex.
  4. Xóa khe "đang chờ xử lý" của tiêu đề danh sách mạnh mẽ của chuỗi.

Vấn đề là giữa các bước 3 và 4, một chuỗi khác trong cùng một quy trình có thể có được mutex, sau đó mở khóa và (đúng) tin tưởng là người dùng cuối cùng của mutex, hủy và miễn phí/munmap nó. Sau đó, nếu bất kỳ luồng nào trong quá trình tạo bản đồ được chia sẻ của một tệp, thiết bị hoặc bộ nhớ dùng chung và nó sẽ xảy ra để được chỉ định cùng một địa chỉ và giá trị tại vị trí đó sẽ khớp với pid của chuỗi vẫn còn giữa các bước 3 và 4 của mở khóa, bạn có một tình huống theo đó, nếu quá trình này bị giết, hạt nhân sẽ làm hỏng các tập tin ánh xạ bằng cách thiết lập bit cao của một số nguyên 32-bit nó nghĩ là id chủ sở hữu mutex.

Giải pháp là để tổ chức một khóa toàn cầu về mmap/munmap giữa bước 2 và 4 trên đây, hoàn toàn giống như trong giải pháp của tôi để các vấn đề rào cản được mô tả trong câu trả lời của tôi cho câu hỏi này:

Can a correct fail-safe process-shared barrier be implemented on Linux?

+0

@r Tôi có hiểu rằng bạn chỉ có thể giải quyết vấn đề này khi bạn đang thực hiện việc thực hiện mutex của riêng mình và kiểm soát các cuộc gọi 'mmap' /' munmap' (để bạn có thể chèn khóa giữa bước 2 và 4))? Điều đó có nghĩa là các mutex mạnh mẽ của POSIX (pthreads) sẽ luôn luôn bị ảnh hưởng bởi vấn đề này? Có nên coi đó là lỗi pthreads trên Linux không? Ngoài ra, bạn sẽ làm gì khi người giữ khóa mmap toàn cầu (mạnh mẽ hoặc không mạnh mẽ) không thành công? – nh2

+0

Có một lỗi trong glibc. Xem https://sourceware.org/bugzilla/show_bug.cgi?id=14485 –

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