2012-05-10 4 views
14

В Java или C# или на некоторых других языках существуют неблокирующие объекты ввода-вывода, например, для сокетов.Как осуществляется блокировка ввода-вывода без блокировки?

Поэтому я могу дать свои функции обратного вызова неблокирующему IO, и как только неблокирующий IO получит что-либо, он вызовет мои обратные вызовы.

Мне интересно, как они реализованы. Если я создаю неблокирующий IO, за сценой, Java или C# просто создают фоновые потоки для них? или ОС, лежащий в основе, поддерживает их?

+0

Смотрите замечания здесь: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx. Похоже, что используется фоновый поток, который кэшируется, если один и тот же контекст повторно используется. – mellamokb

+0

@mellamokb говорит, что контекст выполнения кэшируется и повторно используется, он ничего не говорит о потоке. –

ответ

18

В ОС Windows есть базовая поддержка ОС для неблокирующих операций ввода-вывода, и CLR от Microsoft использует это. Другие реализации CLR (mono), вероятно, тоже делают, но я точно не знаю. При выполнении асинхронного ввода-вывода в Microsoft CLR не существует корреляции между ожиданиями асинхронного ввода-вывода и потоками (или, по крайней мере, управляемыми потоками), ожидающими завершения этих операций ввода-вывода.

Для получения подробной информации о деталях слоя Win32 см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx. Кроме того, информация о портах завершения ввода/вывода здесь: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

Мое понимание таково:

  1. Я начинаю операцию асинхронного ввода/вывода на некотором потоке приложения.
  2. Если он еще не создан, будет создана очередь (ну, действительно, конструкция уровня ядра, называемая портом завершения ввода-вывода, связанная с очередью в пространстве ядра моего приложения). В .NET-среде специально назначенный поток, называемый потоком портов завершения ввода-вывода, начнет ждать уведомлений о завершении ввода-вывода в этой очереди. Важно отметить, что я могу сделать любое количество запросов асинхронного ввода-вывода без увеличения количества портов завершения ввода-вывода.
  3. ОС сообщит об этом при завершении ввода-вывода, поставив в очередь сообщение о завершении ввода-вывода в очереди. Поток портов завершения ввода-вывода затем обработает это сообщение, вызвав обратный вызов завершения ввода-вывода в моем приложении .NET. Тем временем, если другие операции ввода/вывода завершатся, результаты будут занесены в очередь за результатами обработки в настоящее время.

Предостережения к выше:

  1. Я уверен, что я получил часть это неправильно, но я считаю, что в целом суть его правильно. Эрик или кто-то может войти и исправить меня, где я прочь.

  2. В .NET существует несколько потоков портов завершения ввода-вывода. Я понятия не имею, как асинхронные запросы ввода-вывода распределяются между различными портами завершения ввода-вывода. Это может быть функция операционной системы (где I/O может вернуться на любой порт, открытый приложением).

Для Java Я уверен, что это зависит от реализации JVM и конкретной ОС. Я не знаю, что это достаточно хорошо, чтобы размышлять над этим.

EDIT: Историческое обновление, многие другие детали here

+0

Что значит «Для C# есть базовая поддержка ОС ...». ОС не знает об этом.NET работает поверх нее, и теоретически .NET может работать как на Windows, так и на Linux (через моно). – Tudor

+0

@Tudor Я уточняю –

+0

. Пожалуйста, напишите более подробную информацию. – Jack

Смежные вопросы