2013-02-17 10 views
8

Tôi muốn biên soạn một danh sách tất cả các điều kiện có thể làm cho Màn hình đi tới đối tượng đồng bộ hạt nhân/chế độ sử dụng hạt nhân.Khi nào Màn hình .NET chính xác chuyển sang chế độ lõi?

Khối đồng bộ có trường để tham chiếu đối tượng hạt nhân do đó tôi đã khấu trừ rằng lock sẽ chuyển sang chế độ lõi đôi khi.

Tôi thấy điều này: Lock (Monitor) internal implementation in .NET

nhưng nó có quá nhiều câu hỏi để được giải đáp và các thông tin hữu ích duy nhất là OP đã trả lời câu hỏi của riêng mình bằng cách đơn giản nói rằng lock sẽ đi đến kernel-mode lúc nào. Ngoài ra không có liên kết đến bất cứ điều gì để hỗ trợ câu trả lời đó.

Câu hỏi của tôi khác - Tôi muốn biết khi nào chính xác lock sẽ chuyển sang chế độ lõi (không phải và không phải lý do - khi nào).

Tôi quan tâm nhiều hơn nữa để nghe về .NET 4 và 4,5 nếu có bất kỳ sự khác biệt với các phiên bản cũ

EDIT: Từ cuốn sách Richter: "Một khối đồng bộ chứa các lĩnh vực cho một đối tượng hạt nhân, sở hữu ID của chủ đề, số lượng đệ quy và chuỗi chủ đề chờ. "

Trả lời

19

Hầu hết các loại câu hỏi này có thể được trả lời bằng cách xem mã nguồn CLR có sẵn qua SSCLI20 distribution. Đó là nhận được khá ngày bởi bây giờ, nó là NET 2.0 cổ điển, nhưng rất nhiều tính năng cốt lõi CLR đã không thay đổi nhiều.

Tệp mã nguồn bạn muốn xem là clr/src/vm/syncblk.cpp. Ba lớp học đóng một vai trò ở đây, AwareLock là thực hiện khóa cấp thấp để đảm bảo việc mua khóa, SyncBlock là lớp thực hiện hàng đợi các luồng đang chờ để nhập khóa, CLREvent là trình bao bọc cho đồng bộ hóa hệ điều hành đối tượng, cái bạn đang hỏi.

Đây là mã C++ và mức trừu tượng khá cao, mã này tương tác rất nhiều với bộ thu gom rác và có rất nhiều mã kiểm tra được bao gồm. Vì vậy, tôi sẽ đưa ra một mô tả ngắn gọn về quy trình.

SyncBlock có thành viên m_Monitor lưu trữ phiên bản AwareLock. SyncBlock :: Enter() gọi trực tiếp AwareLock :: Enter(). Nó đầu tiên cố gắng để có được khóa càng rẻ càng tốt. Trước tiên hãy kiểm tra xem chủ đề đã sở hữu khóa chưa và chỉ tăng số lượng khóa nếu trường hợp đó xảy ra. Tiếp theo sử dụng FastInterlockCompareExchange(), một hàm bên trong rất giống với Interlocked.CompareExchange(). Nếu khóa không được tranh thì điều này thành công rất nhanh và Monitor.Enter() trả về. Nếu không thì một luồng khác đã sở hữu khóa, AwareLock :: EnterEpilog sẽ được sử dụng. Có một nhu cầu để có được trình lập lịch trình thread của hệ điều hành có liên quan để CLREvent được sử dụng.Nó được tạo động nếu cần thiết và phương thức WaitOne() của nó được gọi. Mà sẽ liên quan đến một chuyển đổi hạt nhân.

Vì vậy, đủ để trả lời câu hỏi của bạn: lớp Màn hình chuyển sang chế độ hạt nhân khi khóa bị khóa và chuỗi phải đợi.

+0

cảm ơn bạn rất nhiều. đặc biệt là đối với SSCLI - tôi không biết điều này đã có sẵn công khai. –

+3

Cảm ơn nhận xét đã chỉ cho tôi phần liên quan trong nguồn CLR. Tôi đặc biệt quan tâm đến việc quay một phần: nó thường được yêu cầu Giám sát ở lần đầu tiên quay trước khi đi đến hạt nhân. Và tôi quan tâm chính xác nó quay như thế nào (số lần lặp lại, ...). Tôi không thể nhìn thấy quay trong đường dẫn mã bạn đã mô tả, tuy nhiên, tôi thấy quay logic có trong AwareLock :: Contention được gọi là bởi AwareLock :: TryEnter. Bây giờ có vẻ như, rằng điều này chỉ áp dụng cho TryEnter khi thời gian chờ được sử dụng, vì vậy tôi đoán quay không được sử dụng khi sử dụng từ khoá khóa C#. Tôi có đúng không? –

1

Sau bước quay của nó.

thông minh bổ sung có thể tồn tại, chẳng hạn như bỏ qua spinwait trên các máy lõi đơn vì khóa chỉ có thể được giải phóng sau khi phát hành luồng.

+0

Andrew Tôi cần phải có tất cả các bước trong chế độ xem mặt phẳng để xem cách điều này trả lời câu hỏi. Câu trả lời của bạn giống như - khi mọi người chết nếu bị sét đánh - khi họ chết. –

+0

@BoppityBop: Đi lấy cho mình một chiếc máy bay và một đường băng, sau đó chúng ta thảo luận về điểm này –

+0

Ya. Nếu bạn muốn một cái gì đó chính xác hơn, làm thế nào về "tại 5: 04: 02.008"? Nghiêm túc, một câu trả lời tuyệt đối là vô ích, và một câu trả lời tương đối khác nhau. Điều duy nhất còn lại là một câu trả lời hợp lý. Sau khi bước trước được hoàn thành, câu hỏi của bạn thiếu điểm mà bạn đang theo dõi. Bạn quan tâm làm gì? Nếu bạn đã cung cấp điều đó, chúng tôi có thể cung cấp câu trả lời hữu ích hơn. –

2

Khi khóa bị khóa nhiều.

Nếu khóa được khóa nhẹ, có một vòng xoay CPU nhanh để chờ khóa được tự do trở lại, nhưng nếu điều này không chờ đủ lâu để khóa được miễn phí, luồng sẽ chặn chờ trên mutex, trong đó bao gồm một cuộc gọi chế độ hạt nhân để đình chỉ các chủ đề và quản lý như vậy.