воскресенье, 29 марта 2009 г.

Почему InterlockedIncrement/Decrement возвращали только знак результата?

Это перевод Why did InterlockedIncrement/Decrement only return the sign of the result? Автор: Реймонд Чен.

Если вы прочтёте старую документацию на функции InterlockedIncrement и InterlockedDecrement, то вы увидите, что на Windows NT 3.51 и младше, а также на Windows 95, возвращаемое значение соответствует только знаку результата увеличения или уменьшения. Почему так?

Набор инструкций 80386 поддерживал атомарное увеличение и уменьшение (interlocked increment and decrement), но результат операции не возвращался. Операция обновляла только процессорные флаги. В результате, единственной доступной вам информацией от CPU была: равен ли результат нулю, больше нуля или меньше (окей, вы также могли узнать чётное или нечётное получилось число, а также установлен ли у него первый бит, но навряд ли это было полезно).

Поскольку эти операционные системы поддерживали процессор 80386, их реализация функций InterlockedIncrement и InterlockedDecrement была ограничена возможностями процессора.

Процессор 80486 добавил инструкцию XADD, которая возвращает начальное значение операнда. С этой дополнительной информацией стало возможным возвращать точный результат операции.

Windows NT 4 не поддерживала процессор 80386, требуя как минимум 80486, так что она могла воспользоваться преимуществами этой инструкции. Windows 98 всё ещё должна была поддерживать 80386, так что она не могла этого сделать.

Так как же Windows 98 умудрялась реализовывать операцию, которая не поддерживалась процессором?

Windows 98 определяла, используете ли вы CPU, который поддерживал новую инструкцию XADD. Если нет - то она использовала альтернативный механизм, который был чудовищно медленным: он делал вызов драйвера при каждом инкременте/декременте. Драйвер мог эмулировать инструкцию XADD, отключая прерывания и производя операцию при заблокированной памяти (locked memory). Поскольку Windows 98 поддерживала только один процессор - ей не приходилось волноваться, что другой процессор мог изменить эту же память в то же время; всё, что надо было сделать - убедиться, что единственный процессор не прервётся при выполнении этой "атомарной" операции.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.