2012-05-10 37 views
14

Trong Java hoặc C# hoặc một số ngôn ngữ khác, có các tiện ích IO không chặn, ví dụ: đối với ổ cắm.IO không chặn được triển khai như thế nào?

Vì vậy, tôi có thể cung cấp chức năng gọi lại cho IO không chặn và một khi IO không chặn nhận bất kỳ thứ gì, nó sẽ gọi hàm callback của tôi.

Tôi tự hỏi cách chúng được triển khai. Nếu tôi tạo IO không chặn, đằng sau cảnh, Java hay C# chỉ tạo luồng nền cho chúng? hoặc hệ điều hành cơ bản có hỗ trợ cho họ?

+0

Xem những nhận xét ở đây: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx. Dường như sử dụng chuỗi nền, được lưu trong bộ nhớ cache nếu cùng một ngữ cảnh được sử dụng lại. – mellamokb

+0

@mellamokb nó nói rằng một bối cảnh thực hiện được lưu trữ và tái sử dụng, nó không nói bất cứ điều gì về một sợi. –

Trả lời

18

Trên Windows có hỗ trợ hệ điều hành cơ bản cho I/O không chặn và CLR của Microsoft tận dụng điều đó. Các triển khai CLR khác (mono) có thể làm tốt, nhưng tôi không biết chắc chắn. Khi thực hiện I/O không đồng bộ trên CLR của Microsoft, không có mối tương quan 1-to-1 giữa các hoạt động và các luồng I/O đang chờ xử lý (hoặc ít nhất là các luồng được quản lý) chờ đợi các hoạt động I/O hoàn tất.

Xem http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx để biết chi tiết về chi tiết lớp Win32. Ngoài ra các thông tin trên cổng vào/O hoàn thành ở đây: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

hiểu biết của tôi là thế này:

  1. tôi bắt đầu một hoạt động async I/O trên một số chủ đề ứng dụng.
  2. Nếu chưa, hàng đợi sẽ được tạo (tốt, thật sự là một cấu trúc cấp hạt nhân được gọi là cổng hoàn thành I/O, được kết hợp với hàng đợi trong không gian hạt nhân của ứng dụng của tôi). Trong thế giới .NET, một luồng được chỉ định đặc biệt được gọi là một luồng cổng hoàn thành I/O sẽ bắt đầu chờ thông báo về việc hoàn thành I/O trên hàng đợi đó. Điều quan trọng cần lưu ý ở đây là tôi có thể thực hiện bất kỳ số lượng yêu cầu I/O không đồng bộ nào mà không tăng số cổng hoàn thành I/O.
  3. Hệ điều hành sẽ thông báo cho ứng dụng khi I/O hoàn tất bằng cách enqueueing thông báo hoàn thành I/O trên hàng đợi. Sau đó, luồng cổng hoàn thành I/O sẽ xử lý thông điệp đó bằng cách gọi lại hoàn thành I/O trong ứng dụng .NET của tôi. Trong khi chờ đợi, nếu các I/O khác hoàn thành, kết quả sẽ được xếp sau các kết quả hiện đang xử lý.

Hãy cẩn thận để ở trên:

  1. Tôi chắc chắn tôi có một phần của điều này sai, nhưng tôi tin rằng các ý chính tổng thể của nó là đúng. Eric hoặc ai đó có thể vào và sửa tôi khi tôi đi.

  2. Trong .NET có nhiều luồng cổng hoàn thành I/O. Tôi không có ý tưởng làm thế nào các yêu cầu I/O không đồng bộ được phân bổ giữa các cổng hoàn thành I/O khác nhau. Đây có thể là một tính năng của hệ điều hành (trong đó I/O có thể quay trở lại trên bất kỳ cổng nào mà ứng dụng đã mở).

Đối với Java Tôi chắc chắn nó phụ thuộc vào triển khai JVM và hệ điều hành cụ thể. Tôi không biết nó gần như đủ tốt để suy đoán vượt ra ngoài đó.

EDIT: Cập nhật lịch sử, nhiều chi tiết here

+0

Ý của bạn là gì? Đối với C#, có hỗ trợ hệ điều hành cơ sở ... '. Hệ điều hành không có kiến ​​thức đó.NET đang chạy trên đầu trang của nó và trong lý thuyết. NET có thể chạy trên cả Windows và Linux (thông qua mono). – Tudor

+0

@Tudor Tôi sẽ làm rõ –

+0

Vui lòng viết chi tiết hơn – Jack

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