| 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. Только теперь аппаратный ввод не обязателен а им может заниматься ядро в соседнем потоке.
![(please configure the [header_logo] section in trac.ini)](/ceasy/chrome/site/your_project_logo.png)