2013-07-19 56 views
5

Trong chính sách lập lịch RR điều gì sẽ xảy ra nếu chuỗi ưu tiên thấp khóa một mutex và bị xóa bởi trình lên lịch bởi vì một chuỗi ưu tiên cao khác đang đợi?Lập lịch trình chủ đề trong unix

Nó cũng sẽ giải phóng khóa được giữ bởi chuỗi ưu tiên thấp?

Ví dụ: xem xét 3 chuỗi chạy trong tiến trình có mức độ ưu tiên là 10,20 và 30 trong chính sách lập lịch RR.

Bây giờ tại một thời điểm cho trước, chuỗi ưu tiên thấp 1 khóa mutex và vẫn thực hiện nghĩa là thực thi trong khi chuỗi ưu tiên cao bật lên và cũng chờ trên mutex được giữ bởi chuỗi 1. Bây giờ chủ đề 2 đi vào hình ảnh cũng cần cùng một mutex bị khóa bởi thread 1.

Theo như tôi biết theo thuật toán lập lịch, các chủ đề ngủ hoặc chờ mutex, semaphore vv được loại bỏ và những thứ khác, thậm chí có mức độ ưu tiên thấp được phép thực thi. Điều này có đúng không? Nếu đúng như vậy, trong ví dụ trên, các chủ đề ưu tiên cao sẽ chờ hoàn thành chuỗi ưu tiên thấp mà không có ý nghĩa gì. Đây có phải là cách hệ thống hoạt động nếu ở tất cả các luồng được thiết kế như tôi đã nói ở trên không?

hoặc mức độ ưu tiên của luồng phải được đặt theo cách ưu tiên của người ưu tiên cao sẽ không phụ thuộc vào mức độ ưu tiên thấp của người khác?

Ngoài ra, bất kỳ ai cũng có thể giải thích cho tôi cách lập lịch hoạt động ở cấp quy trình? Làm thế nào để chúng tôi đặt ưu tiên cho một quy trình?

+0

Vấn đề được sử dụng là "quá nhiều chủ đề, không đủ lõi" nhưng cuộc cách mạng đa lõi đang nhanh chóng đảo ngược vấn đề đó. Ưu tiên luồng hữu ích khi bạn cần chọn chuỗi nào để chạy, không phải khi các nhà thiết kế chip đang tự hỏi liệu một lõi phụ có thể vẫn làm điều gì đó hữu ích hay không. – MSalters

Trả lời

5

Thông thường, việc lên lịch và khóa không liên quan đến bất kỳ khía cạnh nào khác ngoài "chuỗi chờ đợi không được lên lịch cho đến khi nó kết thúc chờ". Nó sẽ là khá daft để có một MUTEX rằng "dừng thread khác truy cập dữ liệu của tôi" nhưng nó chỉ hoạt động nếu các thread khác có cùng một hoặc thấp hơn so với thread hiện tại.

Hiện tượng "ưu tiên thấp giữ khóa mà chuỗi ưu tiên cao 'cần'" được gọi là đảo ngược ưu tiên và đó là một trường hợp nổi tiếng trong lý thuyết máy tính.

Có một số lược đồ "tạm thời tăng ưu tiên của chuỗi giữ khóa cho đến khi nó mở khóa tới mức ưu tiên cao nhất của chuỗi chờ" (hoặc mức độ ưu tiên của chuỗi chờ đầu tiên nếu nó cao hơn luồng hiện tại, hoặc một số biến thể khác về chủ đề đó). Điều này được thực hiện để chống lại sự đảo ngược ưu tiên - nhưng nó cũng có những hạn chế khác, vì vậy nó không được thực hiện trong tất cả các hệ điều hành/lịch trình (sau khi tất cả, nó ảnh hưởng đến các chủ đề khác so với chủ đề đang đợi).

Edit:

Mấu chốt của một mutex (hoặc ổ khóa tương tự khác) là nó ngăn cản hai luồng truy cập vào các nguồn tài nguyên cùng một lúc. Ví dụ: giả sử chúng tôi muốn cập nhật năm biến khác nhau với một số xử lý khá dài (toán phức tạp, tìm nạp dữ liệu từ cổng nối tiếp hoặc ổ đĩa mạng) hoặc nếu chúng tôi chỉ thực hiện hai biến, một số quy trình khác bằng những thứ này sẽ có kết quả không hợp lệ, sau đó chúng tôi rõ ràng không thể "buông bỏ" khóa.

Chủ đề ưu tiên cao chỉ đơn giản là phải chờ tất cả năm biến được cập nhật và khóa ưu tiên thấp.

Không có giải pháp đơn giản nào mà ứng dụng có thể thực hiện để "khắc phục" sự cố này - không giữ khóa nhiều hơn mức cần thiết của khóa học [và có thể thực sự khắc phục được sự cố được mô tả ở trên, bằng cách thực hiện xử lý kéo dài bên ngoài của khóa, và chỉ làm cuối cùng "lưu nó trong 5 biến" với khóa trên. Điều này sẽ làm giảm thời gian tiềm năng mà thread ưu tiên cao phải chờ đợi, nhưng nếu hệ thống thực sự bận, nó sẽ không thực sự khắc phục vấn đề. Có toàn bộ luận án tiến sĩ viết về chủ đề này và tôi không phải là chuyên gia về "cách viết lịch trình" - tôi có ý tưởng công bằng về cách hoạt động, giống như tôi biết động cơ trong xe của tôi hoạt động như thế nào - nhưng nếu ai đó đưa cho tôi một loạt các hình dạng cơ bản của thép và nhôm, và các công cụ/không gian làm việc cần thiết và bảo tôi xây dựng động cơ, tôi nghi ngờ nó sẽ hoạt động tốt ... được gọi, nhưng không phải cách xây dựng một cái.

+0

Bây giờ tôi hiểu rằng những gì tôi nghĩ có thể xảy ra trong thế giới thực. Bây giờ câu hỏi là hệ điều hành có quan tâm đến các điều chỉnh ưu tiên này hay chúng ta phải xử lý nó trong phần mềm của chúng ta. Nếu vậy, bạn có thể vui lòng chỉ cho tôi một ví dụ nhỏ không? Về mutex bạn khóa chính xác chỉ được cấp nếu không có chuỗi ưu tiên cao cạnh tranh. Nhưng câu hỏi của tôi là sau khi khóa được mua lại bởi chủ đề ưu tiên thấp và sau đó đến lượt sợi ưu tiên cao. – suresh

+0

@suresh, AFAIK hạt nhân Linux cổ phần không tạm thời tăng mức độ ưu tiên của một chuỗi để xóa khóa trên một tiếng bị tắt mà một chuỗi ưu tiên cao hơn muốn. Tuy nhiên, bản vá hạt nhân PREMPT_RT làm điều đó. Nói cá nhân tôi nghĩ rằng đó là một trình lên lịch tốt hơn, nhưng khi tôi đang làm các hệ thống thời gian thực, tôi sẽ nghĩ rằng ... đối với các Unix khác, tôi không nghĩ có nhiều thứ ở đó có độ phân giải đảo ngược ưu tiên; nó là một tiêu chuẩn trong thế giới thời gian thực. – bazza

+0

+1 to Mats, câu trả lời hay nhất – bazza

2

Nếu chuỗi có mức độ ưu tiên cao cần đợi trên chuỗi ưu tiên thấp (chuỗi bán dẫn mutex vv), chuỗi ưu tiên thấp tạm thời được nâng lên cùng mức ưu tiên với chuỗi ưu tiên cao.

+0

Điều này được định nghĩa là "luôn luôn" ở đâu đó mà tôi không biết? Theo hiểu biết của tôi, "ưu tiên tăng" là một thủ thuật được triển khai ở một số nơi, nhưng chắc chắn không có trong tất cả các hệ điều hành/lịch trình. –

+0

Không theo mặc định, bạn cần sử dụng thuộc tính mutex 'PTHREAD_PRIO_INHERIT'. Xem http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html –

+0

Cảm ơn bạn đã liên kết..nó rõ ràng rằng nếu một chuỗi đang chờ cùng một nội dung với PTHREAD_PRIO_INHERIT được đặt thì chuỗi đang giữ cùng một mutex sẽ được thực hiện để thực hiện ở mức độ ưu tiên cao hơn so với chuỗi chờ. Về cơ bản, điều này được thực hiện bằng cách xác định các ưu tiên cho mutexes. – suresh

0

Chuỗi mức độ ưu tiên cao sẽ không có khóa yêu cầu cho đến khi chuỗi ưu tiên thấp sẽ mở khóa.

Để tránh điều này, chúng tôi có thể sử dụng semaphore nơi bất kỳ chủ đề nào khác có thể bắt đầu mở khóa nhưng trong mutex, điều đó là không thể.

+0

Chính xác bạn đang nói gì vậy? Tôi nghĩ rằng có một spurios "không" trong đó ... –

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