Вот так всегда…

Июнь 9th, 2008 по SadKo Оставить ответ »

То, что работает на одном процессоре, может гарантированно не работать на нескольких.
Стоило мне только разделить нагрузку между процессорами, и драйвер клавиатуры+мыши стал глючить.
В чём же прикол? А вот в следующем:
1. на одном проце задачи пытается модифицировать содержимое портов.
2. на другом проце в это время срабатывает прерывание, которому тоже нужны порты.
Следствие: оба проца пытаются биться за один и тот же порт.

Как разрешить данную ситуацию?
1. Ввести мьютекс и блокировать его при попытке обращения к портам. Данный метод очень опасен. Например, в случае, если обращение к портам со стороны задачи и прерывание происходят на одном и том же процессоре. В таком случае Dead Lock обеспечен.
2. Разрешить прерывания в обработчике. Опасна эта вещь повторной входимостью а также Dead Lock’ом, так как в случае однопроцессорной системы не будет приходить прерывание от таймера, пока не будет послан EOI в PIC. Если же слать EOI при входе в обработчик, Dead Lock так же обеспечен (повторная попытка заблокировать мьютекс).
3. Блокиовать прерывания от устройства-инициатора прерываний на время его программирования. Также чревато тем, что, возможно, ответ от устройства приходит именно с прерыванием.

Таким образом, все виды блокировок являются недопустимыми из-за их неполноценности. Обдумываю возможные другие варианты…

Реклама

Добавить комментарий

Blue Captcha Image
Refresh

*