Книга с прошлого раза:《Моя первая неделя повторного знакомства с Node.js - Особенности стиля Node.js". На этот раз прочитайте что-нибудь о базовой реализации:
- Глава 3. Асинхронный ввод-вывод. Как Node.js реализует асинхронный ввод-вывод
- Udemy «Изучите и поймите NodeJS Изучите и поймите NodeJS», раздел 2 и 3
V8 двигатель
Прежде всего, чтобы изучить node.js, вы должны понимать движок V8, который может напрямую компилировать js в (распознаваемый процессором) машинный код.
Чтобы быть более конкретным, V8 является
- Открытый исходный код
- написан на С++
- Внедрение JavaScript в соответствии со стандартами ECMA
- Может компилировать JavaScript в машинный код, понятный процессору.
- может работать независимо
- Также может быть встроен в другие приложения C++.
JavaScript-движок.
Node.js и движок V8
Обычная молодежь использует V8: запускаем V8, JavaScript -> V8 — компилируем —> Машинный код
У литературной молодежи есть такая смелая мысль:
Эти обычные методы js слишком скучны, прежде всего способности. Было бы еще лучше, если бы я мог написать код на C++ и добавить его в V8 в качестве надстройки, чтобы V8 мог распознавать больше команд Javascript. Например, вещи, связанные с файлом, которые js изначально не мог сделать, теперь я использую c++ для его реализации внизу, а затем говорю V8, когда пользователь пишет file.open(xxx) в js, используйте c++ для выполнения функция открытия файла, чтобы ваш js (два б) был js (коровьим б), который имеет возможность обрабатывать файлы.
Идея литературной молодежи — это на самом деле наш Node.js: приложение на C++, в которое встроен движок V8.Это приложение на C++ реализует множество настраиваемых новых функций, которые делают это приложение (Node.js) очень подходящим для серверной разработки.
Какие новые функции необходимы для разработки серверов === Какие новые функции реализованы в Node.js:
- Управление повторно используемым кодом
- файлы обработки
- база данных процессов
- интернет-связь
- Принять запрос, отправить ответ
- Процесс работы, который занимает определенное время для завершения
Архитектура Node.js
- Первый уровень — это ядро C++, представляющее собой недавно добавленные настраиваемые функции (в других пояснениях, таких как цикл обработки событий, libuv и т. д., будут упомянуты позже).
- Второй уровень — это ядро JS, которое реализовано с помощью js, основанного на ядре C++ или вызывающего его, чтобы пользователи могли лучше использовать эти функции C++, а также реализовывать многие часто используемые функции.
В исходном коде node.js ядро C++ находится в папке src. Ядро JS находится в папке lib. Это показывает иерархическую связь между ними.
Асинхронный ввод-вывод Node.js
Как Node.js реализует асинхронный ввод-вывод и какие шаги были предприняты от JS до ОС (это сводка интегрированной версии udemy + «Deep»)
- Код js, который вы написали, вызывает ядро JS node.js (например, функции, связанные с fs:GitHub.com/node будет /node…), и вы устанавливаете функцию обратного вызова
- Основная часть JS вызывает ядро C++ (один из .cc, вызываемый fs.js:GitHub.com/node будет /node…)
- Ядро С++ вызывает libuv
- Ядро C++ вызывает метод libuv для инкапсуляции объекта запроса (важный промежуточный продукт в процессе асинхронного ввода-вывода, середина относится от js к os), который содержит одну из самых важных вещей в асинхронном вводе-выводе: функцию обратного вызова.
- libuv отправляет инкапсулированный объект запроса в ОС
- Отправляется в пул потоков в ОС (пул потоков), ожидающий выполнения
- Поток в пуле потоков выполняет операцию ввода-вывода, содержащуюся в отправленном объекте запроса, и результат сохраняется в атрибуте req->result объекта запроса. Затем отправьте статус завершения, который похож на уведомление о том, что «Я готов!», а затем верните поток в пул потоков.
- Объект запроса в завершенном состоянии, наблюдатель (два человечка на рисунке, у разных типов событий разные наблюдатели) поднимает запрос в цикле событий (Event Loop: большой цикл while, каждый цикл называется тиком) out (проверить есть ли выполненный запрос через метод в libuv), а затем поставить его в очередь (Completed Events Queue)
- Цикл событий удаляет завершенный объект запроса из очереди наблюдателя.
- Выньте результат выполнения операции ввода-вывода и содержащуюся в нем функцию обратного вызова и отправьте его в V8 для выполнения. На этом этапе цель вызова функции обратного вызова, установленная в #1, достигнута.
Примечание:
а. JavaScript, выполняемый движком V8, является синхронным (sync) (stackoverflow.com/questions/2…) и однопоточный
б) #1-#9 и #10 работают одновременно, события ввода-вывода выполняются одно за другим, а затем, наконец, отправляются в движок V8 для выполнения функций обратного вызова одна за другой (поскольку JS является синхронным).
C. Из-за b весь Node.js имеет возможность асинхронного ввода-вывода.
г. Можно объяснить характеристики управляемого событиями и неблокирующего ввода-вывода. Управляемый событиями относится к # 7 - # 10. После того, как событие завершено и запущено, различные шаги выполняются до тех пор, пока функция обратного вызова не будет окончательно выполнена. Неблокирующий ввод-вывод — это весь процесс #1-#10. Код JavaScript, который мы выполняем в V8, не остановится из-за выполнения события. #1-#9 и #10 работают одновременно, и один выполняет событие ввода/вывода, функцию обратного вызова, которая получает уведомление о выполнении.
е. Из объяснения пункта d вы можете лучше понять последний абзац предыдущей статьи о том, что Node.js является однопоточным/многопоточным.
В следующий раз напишу про события (Event) и эмиттеры событий (Event Emitter). Приветствую всех, чтобы общаться и исправлять ~