Linux - статьи



              

Реализация спин-блокировки для процессоров i386


#define spin_lock_string \ "\n1:\t" \ /*A*/"lock ; decb %0\n\t" \ /*B*/"js 2f\n" \ LOCK_SECTION_START("") \ /*C*/"2:\t" \ "cmpb $0,%0\n\t" \ "rep;nop\n\t" \ /*D*/"jle 2b\n\t" \ /*E*/"jmp 1b\n" \ LOCK_SECTION_END

Спин-блокировка полностью реализована в виде макроопределения, которому в качестве параметра передается ссылка на блокируемый объект. В строке A делается атомарная попытка захватить объект. Если она не удается, то (строка B) управление передается в отдельную секцию ядра, аналогично тому, как это было сделано в функции down. После этого процесс попадает в жесткий цикл между строками C и D, где постоянно проверяется, освободился объект или нет. Причем эта проверка выполняется не атомарно, т. е. не блокирует шину памяти. Как только объект освободился (строка E) управление передается в начало до строки A для повторной атомарной попытки его захвата.




Содержание  Назад