wiki:Actor_Model

Version 1 (modified by andy, 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. Только теперь аппаратный ввод не обязателен а им может заниматься ядро в соседнем потоке.

Note: See TracWiki for help on using the wiki.