= Паралеллизм на акторах Надо начать издалека, чтобы было понятно == Режимы I/O === DOS PIO {{{ foo = read() }}} во время `read()` наш основной поток никуда не девается, и занимается вводом-выводом сам (читает из регистров через инструкцию `IN` в цикле) === DOS DMA {{{ read() while (!isCompleted()) { doSomethingElse(); } foo = getResult() }}} Тут сам ввод происходит аппаратно, мы только запускаем его и опрашиваем факт завершения. Идея в том, что если мы не опрашиваем флаг завершения - то ввод всё равно завершается удачно. В случае DOS DMA нам надо читать постоянно, дабы не потерять байты. А тут мы можем заниматься какой-то работой, пока идет ввод-вывод, и опрашивать "редко". == UNIX Blocking IO Идея та же, что в DOS PIO: {{{ foo = read() }}} Только теперь когда мы делаем read() мы даем команду ядру нас остановить и продолжить, когда придёт ответ. В принципе идентично `yield` из JS. Отличие от DOS PIO в том, что пока мы остановлены, ядро может исполнять кого-то другого. == UNIX nonblocking IO {{{ read() while (!isCompleted()) { doSomethingElse(); } foo = getResult() }}} Те же яйца что в случае DOS DMA. Только теперь аппаратный ввод не обязателен а им может заниматься ядро в соседнем потоке.