В КУРСЕ?

Разбираемся в теме

Указатель есть, а объекта уже нет: как думать о времени жизни данных в ядре Linux

При программировании ядра недостаточно знать адрес структуры. Нужно понимать, существует ли объект в этот момент, кто отвечает за его сохранение и кто завершит его время жизни. Если несколько участников используют общие данные, освобождение памяти становится частью общего протокола. Для первого знакомства полезно отдельно рассмотреть три задачи: получить память, удержать нужный объект и согласовать изменение его содержимого. Их легко смешать, хотя каждая требует своего обоснования.

Начните с путей создания и отказа

Выбор способа выделения памяти зависит от размера, требуемых свойств памяти и контекста выполнения. Некоторые варианты допускают ожидание, другие предназначены для условий, где спать нельзя. Поэтому перенос знакомого вызова в другой участок кода требует проверки контекста. Также нужно учитывать возможность отказа выделения. Учебная схема должна показывать, какие ресурсы уже получены к каждому шагу и что будет освобождено при неудаче следующего. Например, если создана первая структура, а создание второй завершилось ошибкой, выход из функции не должен оставлять первую без владельца. Таблица таких переходов часто выявляет проблему раньше, чем чтение только успешного пути.

Учитывайте каждого владельца

Механизм kref позволяет учитывать ссылки, удерживающие объект. Инициализация задаёт начальную ссылку, получение дополнительной ссылки увеличивает счётчик, а отказ от неё уменьшает его. При освобождении последней ссылки вызывается предусмотренная функция завершения. Важен порядок: если новая долговременная ссылка передаётся другому участнику, её необходимо учесть до передачи. Представим условный объект задания, которым владеет создатель. Он добавляет ссылку для обработчика, затем передаёт задание и отказывается от своей ссылки. Обработчик продолжает пользоваться объектом, пока сам не завершит работу. Наличие просто скопированного адреса без соблюдения протокола не даёт такой гарантии.

Отделяйте сохранность объекта от согласованности полей

Удерживаемая ссылка помогает обосновать время жизни, но сама по себе не запрещает двум участникам одновременно менять одно поле. Для общих изменяемых данных отдельно разбирают конкурентные обращения и подходящую синхронизацию. Встречается и обратная ошибка: краткая блокировка защищает поиск объекта, но после её снятия сохранённый адрес используется без надёжного удержания. Здесь надо согласовать поиск, получение ссылки и возможное удаление. Нельзя просто увеличить счётчик в уже освобождённой памяти. Перед выбором конкретного примитива выпишите, кто читает, кто меняет и в каком контексте работает. Одна универсальная блокировка на все случаи не заменяет этого анализа.

Попробуйте на практике

Проследите время жизни вымышленного задания на бумаге. Это упражнение по рассуждению о владении, без сборки модулей и изменения работающей системы.

  1. Нарисуйте три колонки: событие, владельцы, число удерживаемых ссылок. Начните с созданного задания и одного владельца, его создателя.
  2. Добавьте получение ссылки для обработчика до передачи задания. Затем отметьте отказ создателя от своей ссылки и завершение работы обработчика.
  3. В отдельном варианте предположите, что передача не состоялась после получения дополнительной ссылки. Укажите, кто возвращает эту ссылку и кто завершает владение исходной.
  4. Для каждого варианта найдите момент, когда владельцев больше нет. Проверьте, отсутствуют ли после этого чтения полей, дополнительные освобождения и попытки получить новую ссылку по старому адресу.

Как проверить результат. В успешном варианте счётчик проходит состояния один, два, один, ноль. В варианте отказа каждая полученная ссылка тоже должна быть возвращена ровно один раз. Ни одна дальнейшая операция не должна обращаться к завершённому объекту.

Частые вопросы

Заменяет ли счётчик ссылок все блокировки?

Нет. Время жизни и согласованное изменение содержимого являются разными задачами. Конкретный способ синхронизации выбирают с учётом обращений к данным и контекста выполнения.

Достаточно ли проверить только успешное выполнение?

Нет. Отказы создания, отмена передачи и другие ранние выходы меняют набор оставшихся ресурсов. Полезно отдельно проследить каждый путь и объяснить, кто отвечает за завершение владения.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов