Направления работ в 5-STABLE
Пред. |  | След.

# 2. Основные вопросы

Успех линейки 5.`X` зависит от возможности предоставить высокоточное управление потоками выполнения и повторяемость вызовов в ядре (что известно как SMPng), а также поддержки на уровне ядра POSIX-потоков выполнения пользовательского уровня, не жертвуя при этом общей стабильностью или производительностью системы.

## 2.1. SMPng

Работам над SMPng и блокировками на уровне ядра уделяется самое большое внимание для 5.`X`. На текущий момент было выпущено несколько версий системы с глобальными семафорами на всё ядро, известными как ''Giant''. Страница о состоянии работ над SMP по адресу http://www.FreeBSD.org/smp содержит исчерпывающую информацию об общем состоянии SMPng. Информация по конкретно работам над SMPng в драйверах устройств может быть найдена на странице http://www.FreeBSD.org/projects/busdma. В целом:

- VM: функция ядра malloc изолирована и освобождена от Giant. Аллокатор зон UMA также не использует Giant. Изоляция vm_object находится в работе и является важным шагом в исключении Giant из работы с буферами/кэшем. Изоляция pmap ещё не реализовывалась.

- GEOM: уровень блоков GEOM был разработан с учётом работы без Giant и он позволяет работать модулям GEOM и низлежащим драйверам блочных устройств без Giant. На данный момент только драйверы ata(4) и aac(4) разделены и работают без Giant. Работа над остальными драйверами блочных устройств ведётся. Изоляция CAM-подсистемы требует отказа от использования Giant практически во всех драйверах SCSI; работа над этим ещё не начиналась.

  Кроме того, в GEOM имеется опасность снижения производительности из-за обработки ею вышестоящих и нижестоящих потоков данных в потоках выполнения ядра. В решении этой проблемы может помочь улучшение и упрощение технологии переключения контекстов выполнения.

- Сеть: работа по переводу на изоляцию сетевого стека была начата заново. Изначально целями были таблицы маршрутизации, ARP, функции моста, IPFW, Fast-Forward, TCP, UDP, IP, Fast IPSEC и уровни интерфейсов, а также некоторые драйверы устройств Ethernet. Позже были поставлены цели по изоляции уровней сокетов, IPv6 и других сетевых протоколов. Основной задачей этой работы является восстановление производительности, достигнутой во FreeBSD 4.`X`. Затраты на переключение контекстов на ithreads и netisr в драйверах устройств всё ещё сильно влияют на производительность.

- VFS: начата предварительная подготовка.

- Буфер/кэш: закончена начальная работа по изоляции буферов.

- Proc: начальное изоляция proc уже есть, во FreeBSD 5.2 ожидается ещё больший прогресс.

- CAM: на уровне CAM SCSI значительной работы не проделано.

- Newbus: была проделана некоторая работа по изоляции структуры device_t.

- Pipes: завершено

- Файловые дескрипторы: завершено.

- Process accounting: jails, credentials, MAC labels и планировщик не используют Giant.

- Технология MAC: завершено

- Timekeeping: завершено

- Kernel encryption: криптографические драйверы и ядро технологии crypto(4) не используют Giant. KAME IPsec не отделяются.

- Аудио-подсистема: завершено, однако остаются проблемы с обратным порядком изоляций.

- Вытесняемость ядра: включена вытесняемость для потоков выполнения прерываний. Однако несогласованность из-за того, что Giant используется в большинстве кода ядра и подпрограммах обработки прерываний драйверов устройств, вызывает множество лишних переключений контекста и может сказаться на производительности. Ведётся работа по выяснению того, как сделать вытесняемость условной.

## 2.2. Задержки на прерывания и их обработка

В SMPng появилась концепция выделенных потоков выполнения ядра, известных под названием ithreads, для обслуживания прерываний. С ними подпрограммы обслуживания прерываний от устройств могут создавать блокировки для выставления семафоров, выделения памяти и так далее. Хотя это облегчает написание драйверов, при этом понижается реактивность системы из-за полного переключения контекста процесса, которое должно быть выполнено для обслуживания ithread. Это усугубляется значительным использованием ядром семафора Giant, и часто приводит к множеству пауз и переключений контекстов для обслуживания прерывания. Драйверы, которые зарегистрировали свои прерывания как INTR_MPSAFE, меньше всего почувствуют этот эффект, однако потери на переключение контекста останутся. Подпрограммы обслуживания прерываний, зарегистрированные как INTR_FAST, работают непосредственно из контекста прерывания, и на них вовсе не сказываются эти проблемы. Однако указание свойства INTR_FAST заставляет линию прерываний стать эксклюзивной; её нельзя использовать одновременно с чем-то. Большое количество совместно используемых прерываний на PC-системах делает это нежелательным.

Для помощи в решении этой проблемы были предложены несколько идей:

- Как вариант -- задействовать особый вид легковесных ithread. Это могло бы привести к уменьшению количества сохраняемых контекстов для ithread, к заимствованию стека из другого kthread и/или к созданию нового быстрого пути, исключающего вызов mi_switch().

- Можно ввести новую модель обработки прерываний, которая позволит драйверам регистрировать 'фильтр прерываний' вместе с обычной процедурой обработки. Это будет похоже на модель, используемую сейчас в Mac OS X. Процедуры фильтрации прерываний позволят драйверу определять, должен ли он участвовать в обработке прерывания, позволят ему подавлять источник прерываний и, возможно, определять и планировать действия по его обработке. Она будет работать в том же самом контексте, что и низкоуровневая процедура обслуживания прерывания, так что паузы будут жёстко запрещены. Если требуются действия, которые приводят к паузам или блокировке на долгий период, фильтр будут сигнализировать об этом вызывающей стороне, что должна быть запланирована обычная ithread-процедура.

## 2.3. Потоки приложений, поддерживаемые ядром

В процессе работы над FreeBSD 5.1 пакет KSE был доведён до весьма пригодного к использованию состояния. Также появился THR, альтернативный пакет по управлению потоками выполнения, основанный на некоторых примитивах KSE уровня ядра, но реализующий исключительно подход планирования задач 1:1, также находится в подобном экспериментальном, но пригодном к работе состоянии. Пользователи могут менять эти две библиотеки со старой библиотекой libc_r посредством перекомпоновки своих приложений или при помощи новой техники libmap компоновщика времени выполнения. Такой значительный прогресс в ходе работ должен привести к их завершению до момента появления ветки `RELENG_5`, так что пакет libc_r может оказаться ненужным.

- Компоненты уровня ядра и пользовательского уровня для KSE и THR должны быть созданы для всех платформ уровня Tier-1. Решение о том, какой пакет реализации потоков выполнения будет использоваться по умолчанию, будет, скорее всего, приниматься для каждой платформы отдельно, в зависимости от стабильности и завершённости каждого пакета.

  Таблица 1. Состояние KSE

  Платформа | Уровень ядро | Пользовательский уровень | Работает?
  --- | --- | --- | ---
  i386 | ДА | ДА | ДА
  alpha | НЕТ | ДА | НЕТ
  sparc64 | ДА | НЕТ | НЕТ
  ia64 | ДА | ДА | ДА
  amd64 | ДА | ДА | ДА

  Таблица 2. Состояние THR

  Платформа | Уровень ядра | Пользовательский уровень | Работает?
  --- | --- | --- | ---
  i386 | ДА | ДА | ДА
  alpha | ДА | ДА | ДА
  sparc64 | ДА | ДА | НЕТ
  ia64 | ДА | ДА | ДА
  amd64 | НЕТ | НЕТ | НЕТ

- KSE должен пройти набор тестов ACE на всех платформах статуса Tier-1. Чтобы убедиться в том, что все библиотеки на самом деле работоспособны, необходимо выполнить дополнительное тестирование на реальных задачах. Как минимум, должны быть протестированы следующие пакеты:

  - OpenOffice

  - KDE Desktop

  - Apache 2.x

  - BIND 9.2.x

  - MySQL

  - Java™ 1.4.x

Пред. | Начало | След.
Направления работ в 5-STABLE |  | Требования к 5-STABLE

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.