Что на самом деле сводится к асинхронному вводу-выводу в Windows (например, NodeJS, EventMachine и т. Д.)? - PullRequest
2 голосов
/ 19 января 2012

Я провел большое исследование по этой теме «цикла обработки событий», который выполняет асинхронный ввод-вывод с использованием одного потока.Насколько я понимаю, например, код nodeJS выполняется в однопоточном окружении, но передает параллельные потоки за кулисы.Это означает, что все выполняется одновременно, за исключением кода и интерпретатора, который просто передает задания и управляет обратными вызовами однопоточным способом.

Мой вопрос касается конкретно IO в Windows и ThreadPool, особенно файлового IOи база данных читает / пишет.Обычно в среде .NET, которая использует многопоточность, вы можете увидеть это:

lock(sync)
{
          // do some IO
}

Для защиты определенных функций от проблем параллелизма, например, двух потоков, пытающихся сохранить записи в одной и той же таблице или файле sql.

Мой вопрос двоякий,

1) Когда nodeJS говорит, что выполняет «асинхронный ввод-вывод», означает ли это, что он фактически выполняет запись в базу данных или файл одновременно ?Я думаю, что это было бы до базового устройства / операционной системы, а не nodeJS, но я пытаюсь уточнить.

2) Если некоторые операции ввода-вывода должны быть или, по крайней мере, должны быть атомарными (не выполняются одновременно), чем может помочь «Асинхронный ввод-вывод»?Разве не может быть бесполезно порождать потоки для выполнения ввода-вывода, если вам просто все равно придется блокировать () многие из этих операций?

Ответы [ 4 ]

2 голосов
/ 19 января 2012

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

Это было бы полезно в серверной среде, где вы получаете несколько запросов.Пока вы ожидаете завершения операции ввода-вывода, вы можете обслуживать другого клиента.

2 голосов
/ 19 января 2012

Когда nodeJS говорит, что выполняет «асинхронный ввод-вывод», означает ли это, что он фактически выполняет запись в базу данных или файл одновременно?Я думаю, что это будет зависеть от базового устройства / операционной системы, а не nodeJS, но я пытаюсь уточнить.

Это зависит от nodeJS, выполняет ли он другие действия во время записи вбаза данных или файл.Параллельность не относится к выполнению операций одного и того же типа на одной и той же цели.Это относится к выполнению различных типов операций или операций с различными целями.

Если некоторые операции ввода-вывода должны быть или, по крайней мере, должны быть атомарными (не выполняются одновременно), как называется «Асинхронный ввод-вывод» любогоПомогите?Разве не может быть бесполезно порождать потоки для выполнения ввода-вывода, если вам просто все равно придется блокировать () многие из этих операций?

Опять тот же ответ.Конфликты блокировок могут возникать только в том случае, если это один и тот же тип операции с той же целью.В противном случае, если они запрашивают блокировки, они будут запрашивать разные блокировки и не будут мешать друг другу.

Особенности реализации зависят от типа операции.Например, поток может стать владельцем определенного ресурса и обрабатывать операции с этим ресурсом, пока у него не закончатся дела.Пока он обрабатывает этот ресурс, другие операции с этим же ресурсом могут быть направлены в тот же поток.Таким образом, вы не запускаете поток только для того, чтобы дождаться завершения другого потока, просто для принудительного переключения контекста.

2 голосов
/ 19 января 2012

Любая форма асинхронного ввода-вывода основывается на двух предпосылках:

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

Опция 2.3 не подрывает полезность асинхронного ввода-вывода, поскольку предположительно только утвержденияпроисходят для небольшой части всех запросов ввода-вывода.

1 голос
/ 19 января 2012

около 2., операции могут быть упорядочены , так что одна операция начинается только после завершения тех, от которых она причинно зависит, и большинство систем, обслуживающих операции io, являющиеся результатом асинхронного ввода-вывода, должныподдержка большого числа операций в полете, и те системы, которые обеспечивают атомарные операции, могут предварительно блокировать внутреннюю блокировку, но они также имеют гораздо меньшую вероятность ошибок блокировки, чем ваша программа .но опять же атомарные операции лучше, когда они могут быть составлены в атомарные транзакции.

...