Version 1 (modified by 6 years ago) ( diff ) | ,
---|
Паралеллизм на акторах
Надо начать издалека, чтобы было понятно
Режимы 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. Только теперь аппаратный ввод не обязателен а им может заниматься ядро в соседнем потоке.