2015-02-25 2 views
1

Я новичок в узле и пытаюсь понять неблокирующий характер узла.
На картинке ниже я создал диаграмму высокого уровня запроса.NodeJS: понимание неблокирования/очереди событий/одной нити

enter image description here

Как я понимаю, все процессы от одного пользователя для одного приложения работать на одном потоке.
Что я хотел бы понять, так это то, как логика цикла событий соответствует этой диаграмме. Является ли цикл событий таким же, как конвейер процессора, где находятся команды в очереди?
Представьте себе, что мы загрузить страницу приложения в оперативную память, которая создает поток для чтения из программы:

readstream.on('data', function(data) {}); 

Инструкция по созданию ReadStream и ждем данные происходят: делает эту команду «повесить» в регистре (ожидая завершения ввода-вывода) в процессоре, тогда как в многопоточной среде процессор просто не принимает новые инструкции из ОЗУ до тех пор, пока результат предыдущего запроса ввода-вывода не будет возвращен в ОЗУ?
Или так я вижу это полностью/частично неправильно?

Только дополнительный (связанный, возможно, глупый) вопрос: запускать разных пользователей на разных потоках на сервере и не однопользовательское преимущество только для одного пользователя?

Я новичок в этом типе деталей, поэтому извините, если этот вопрос не имеет для вас никакого смысла. Но понимание этого кажется для меня важным, прежде чем двигаться вперед.

+1

К сожалению, почти все об этом не так. – Pointy

+0

Не могли бы вы уточнить? – Trace

+1

Трудно уточнить; это буквально все неправильно. Цикл событий не имеет ничего общего с архитектурой процессора - ничего не происходит. Концепции совершенно не связаны. – Pointy

ответ

0

Резьбы и операции ввода-вывода связаны с реализацией операционной системы и услугами, а не с архитектурой ЦП.

Операции, в которых задействованы устройства ввода/вывода любого типа — массовое хранилище, сети, последовательные порты и т. Д. — структурированы в виде запросов от ЦП к внешнему устройству, которое одним из нескольких возможных механизмов впоследствии выполнено.

В дополнение к этой реальности операционные системы предоставляют альтернативные модели программирования. В одной модели фактический характер операций ввода-вывода по существу замаскирован таким образом, что исполняемым программам предоставляется API, который представляется синхронным. В программе C вызов системного вызова write() заставит весь процесс задерживаться до завершения операции.

Другая модель программирования более подробно раскрывает асинхронную реальность системы. Это то, что использует Node. Операционные системы предоставляют способы запуска длительных асинхронных операций, а также способы для процесса либо проверять результаты, либо блокировать и ждать результатов. В узле система времени выполнения может манипулировать множеством отдельных операций, потому что вся модель основана на коде, запущенном в ответ на события. Событие может быть синтетическим (например, «событие» модуля Node, загружаемого и выполняемого изначально), или это может быть что-то, что является результатом фактических асинхронных внешних событий. В случае операций ввода/вывода среда выполнения узла ожидает уведомления операционной системы и переводит ее в событие, которое вызывает запуск некоторого кода JavaScript.

+0

Ooh ok Я полностью не знал, что это то, что сделала ОС, и что так оно и было! Благодарность за разъяснение, это имеет смысл сейчас. – Trace

1

Управляемый событиями неблокирующий ввод-вывод основывается на том, что современные операционные системы имеют метод «select», который выполняет опрос на уровне O/S (не тратя время на циклы процессора). Метод select позволяет вам регистрировать обратные вызовы для определенных событий ввода-вывода. Это, как правило, намного эффективнее, чем модель «нить за соединение», обычно используемая в языках с поддержкой потоков. Для получения дополнительной информации сделайте «man select» в ОС Unix/Linux.

+0

Большое спасибо. Я не знал, что это произошло на уровне ОС, но, думая об этом, это логично. – Trace