Решение для блокировки системного вызова рабочим потоком в Node.js

#node.js #multithreading #process #operating-system #libuv

#node.js #многопоточность #процесс #операционная система #libuv

Вопрос:

Недавно я узнал о потоках пользовательского уровня и потоках уровня ядра в книге Таненбаума «Операционная система». Поскольку потоки пользовательского уровня обрабатываются библиотечными пакетами и поскольку работали с node.js немного, я пришел к выводу, что node.js использует libuv для обработки рабочих потоков и, следовательно, использует потоковую обработку на уровне пользователя.

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

Комментарии:

1. Какие системные вызовы, по вашему мнению, блокируют весь процесс, даже другие потоки в процессе?

2. @jfriend00 Если поток вызывает ошибку страницы, ядро, даже не подозревая о существовании потоков, естественным образом блокирует весь процесс до завершения дискового ввода-вывода, даже если другие потоки могут быть запущены. Ошибка страницы вызывает блокировку, поскольку страницу необходимо перенести в память с диска.

3. И когда вы ожидаете, что nodejs будут вызывать ошибки страницы?

4. @jfriend00 как вы думаете, что такое страница? Если вы чувствуете, что я в чем-то не прав, пожалуйста, сообщите. Если вы знаете ответ или есть какая-либо путаница, сообщите. Но мне не нравится этот круговой способ задавать вопросы и отвечать.

5. Вы тот, кто первым использовал «ошибку страницы». Как вы думаете, что это в вашем комментарии? Здесь нет никаких усилий ходить по кругу. Вы, кажется, думаете, что nodejs могут блокироваться на длительные периоды времени, и я пытаюсь заставить вас сказать, как / когда, по вашему мнению, это может произойти? Я никогда не слышал об этом как о проблеме в nodejs на уровне ОС / системы, как вы описываете, поэтому я прошу вас объяснить, почему вы считаете это проблемой? Здесь на вас лежит ответственность за создание четкого вопроса, с которым мы можем попытаться помочь. Поскольку ваш вопрос стоит сейчас, я никогда не слышал, чтобы эта проблема была проблемой в nodejs.

Ответ №1:

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

Это не то, что происходит в современной ОС. Только потому, что один поток в процессе выполняет чтение / запись с диска, ОС НЕ блокирует весь процесс от каких-либо действий с другими потоками.

Современное оборудование использует DMA (прямой доступ к памяти) для чтения / записи на диски точно так, чтобы процессор не блокировался, пока блок данных считывается с диска или записывается на диск.