Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 5.1. Pitfalls in scull

Оглавление
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

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

hardorsoft 06.12.10 в 02:40

0

if (!dptr->data[s_pos]) {
    dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);
    if (!dptr->data[s_pos])
        goto out;
}

hardorsoft 06.12.10 в 02:41

0

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

hardorsoft 06.12.10 в 02:42

0

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

hardorsoft 06.12.10 в 02:42

0

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

hardorsoft 06.12.10 в 02:42

0

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

hardorsoft 06.12.10 в 02:43

0
Минутку...