Как работает асинхронный неблокирующий ввод-вывод на уровне ядра ОС?

Читаю как работают асинхронные вызовы

Системные вызовы (system calls) – это интерфейс между операционной системной (ОС) и пользовательской программой. Они создают, удаляют и используют различные объекты. Пользовательская программа запрашивает сервис у ОС, осуществляя системный вызов. При системном вызове задача переходит в привилегированный режим или режим ядра (kernel mode).

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

  1. Не совсем понятно когда у меня поток запросил асинхронный ввод вывод и как бы перешел в режим ядра, как он потом дальше продолжает работу, в обычном режиме? Т.е. если у меня отправлен асинхронный системный вызов из потока, а дальше делается еще какая то логика то в этот момент времени у меня как бы будут работать 2 моих потока, один в режиме ядра получать данные, а другой в обычном режиме работать параллельно как обычные потоки чередуясь?

  2. Допустим у меня есть 3 потока в которых я хочу прочитать 3 разных файла, причем первый существенно больше двух других. Первый поток отправляет в ОС системный вызов на чтение данных с диска и останавливается на их ожидании, второй поток запрашивает чтение с диска и останавливается на их ожидании, третий тоже запрашивает и останавливается. Получается на уровне ОС у меня будет как бы 6 потоков? Три будут ждать окончания операции чтения от ОС, а три будут реально считывать данные с диска параллельно чередуясь как обычные потоки, чередуясь ?

Например

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
moreWork(); // функция будет исполнена до console.log

Ответы (0 шт):