Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Состояние гонки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;
…
}
Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок правильное проектирование многозадачной системы. Просмотров: 4512
|