Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Состояние гонки23 января 2011Оглавление: 1. Состояние гонки 2. Случай с Therac-25 3. Взломы путём эксплуатирования состояния гонки Состояние гонки ошибка проектирования многозадачной системы, при которой работа системы зависит от того, в каком порядке выполняются части кода. Название ошибка получила от похожей ошибки проектирования электронных схем). Состояние гонки специфическая ошибка, проявляющаяся в случайные моменты времени и «затихающая» при попытке её локализовать. ПримерРассмотрим пример кода int x; // Поток 1: while { x++; … } // Поток 2: while { if System.out.println; … } Пусть x=0. Предположим, что выполнение программы происходит в таком порядке:
Способы решенияЛокальная копияСамый простой способ решения копирование переменной x в локальную переменную. Вот исправленный код: // Поток 2: while { int cached_x = x; if System.out.println; … } Естественно, этот способ работает только тогда, когда переменная одна и копирование производится за одну машинную команду. СинхронизацияБолее сложный, но и более универсальный метод решения синхронизация потоков, а именно: int x; // Поток 1: while { synchronized { x++; } … } // Поток 2: while { synchronized { if System.out.println; } … } Комбинированный способПредположим, что переменная x имеет тип не Эти способы можно скомбинировать, копируя «опасные» переменные в синхронизированном блоке. С одной стороны, это снимет ограничение на одну машинную команду, с другой позволит избавиться от слишком больших синхроблоков. long x; // Поток 1: while { synchronized { x++; } … } // Поток 2: while { long cached_x; synchronized { cached_x = x; } if //System.out.println; DoSomethingComplicated; … } Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок правильное проектирование многозадачной системы. Просмотров: 4040
|