Ловушки в scull

Предыдущая  Содержание  Следующая V*D*V

Давайте кратко рассмотрим фрагмент кода управления памятью в scull. Глубоко внутри логики write, scull должен решить, требуется ли выделение памяти или нет. Фрагмент кода, который решает эту задачу:

 

if (!dptr->data[s_pos]) {

    dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);

    if (!dptr->data[s_pos])

        goto out;

}

 

Предположим на минуту, что два процесса (назовём их "А" и "Б") независимо друг от друга пытаются записать по тому же самому смещению в то же самое устройство scull. Каждый процесс доходит до проверки if в первой строке вышеприведённого фрагмента в одно и то же время. Если указатель в запросе является NULL, каждый процесс примет решение о выделении памяти, каждый в результате присвоит указателю значение для dptr->data[s_pos]. Поскольку оба процесса указывают на одно и то же место, ясно, что лишь одно из присвоений будет преобладать.

 

Что приведёт, конечно, к тому, что процесс, который завершает установку вторым и будет "победителем". Если процесс А делает присвоение первым, его назначение будет перезаписано процессом Б. В этот момент scull полностью забудет о памяти, которая выделяется А; он имеет только указатель на память процесса Б. Память, выделенная таким образом процессом А, будет потеряна и никогда не вернётся к системе.

 

Такая последовательность событий является демонстрацией гонок условий (или состояния гонок). Состояния гонок являются результатом неконтролируемого доступа к общим данным. Неправильная модель доступа приводит к неожиданным результатам. Для гонки условий, обсуждаемой здесь, результатом является утечка памяти. Это плохо, но состояния гонок часто могут привести к падениям системы, повреждённым данным, а также к проблемам с безопасностью. Программисты могут поддаться искушению игнорировать состояния гонок как событие с крайне низкой вероятностью. Но в компьютерном мире события "одно на миллион" могут происходить раз в несколько секунд и последствия могут быть серьёзными.

 

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

Предыдущая  Содержание  Следующая