Архивы: по дате | по разделам | по авторам

Путешествие к ядру

Архив
автор : Алексей Дубовцев   12.02.2004

Предыдущий стабильный релиз Linux под номером 2.4 появился в январе 2001 года. Отметим интересную особенность: все номера версий ядра Linux, оканчивающиеся на четную цифру, считаются стабильными, а на нечетную - тестовыми. Так что делайте выводы по поводу ажиотажа вокруг четной версии Linux, вышедшей около месяца назад, - 2.6.

В далеком 1991 году Линус Торвальдс решил написать собственную операционную систему. У него был 386-й компьютер, для которого он и задумал создать ОС под кодовым именем Freax (уже потом, ближе к первому релизу, Торвальдс переименовал ее в Linux). Впервые система была представлена в 1994 году. Как не трудно догадаться, она поддерживала только однопроцессорные архитектуры i386. Однако уже Linux 1.2, выпущенный в марте 1995-го, умел работать с новыми типами процессоров — Alpha, SPARC, MIPS. Но это был лишь первый тихий звонок — далее с каждым релизом новые архитектуры, в том числе и многопроцессорные, стали налипать на Linux, как снег на снежный ком.

Предыдущий стабильный релиз Linux под номером 2.4 появился в январе 2001 года. Отметим интересную особенность: все номера версий ядра Linux, оканчивающиеся на четную цифру, считаются стабильными, а на нечетную — тестовыми. Так что делайте выводы по поводу ажиотажа вокруг четной версии Linux, вышедшей около месяца назад, — 2.6.

В последние годы бурно развивается рынок встроенных систем. Им находится все больше областей применения, начиная от банальных КПК и заканчивая экзотическими случаями, вроде интеллектуальных микрочипов. Заметив эту тенденцию, разработчики Linux решили включить в основную версию ядра поддержку микроконтроллеров и затеяли проект под кодовым именем uClinux (читается как «you see linux»). Поддержка встроенных систем существовала и раньше, но являлась самостоятельной ветвью эволюции Linux — теперь же она стала ее полноправной частью. Правда, на подобные системы, из-за убогости их аппаратной архитектуры, наложены существенные ограничения: в частности, отсутствие поддержки MMU со стороны большинства микроконтроллеров исключает возможность создания полноценной многозадачной среды.

MMU (Memory Management Unit) — блок управления памятью, обеспечивающий в современных процессорах работу с виртуальной защищенной памятью. Он транслирует виртуальные адреса в физические. Все запросы к памяти в системах, построенных на современных процессорах, осуществляются через MMU. Именно этот блок определяет, находятся ли данные в памяти или требуется их подкачка с диска. В основе механизмов управления памятью чаще всего лежат исключения, с их помощью можно безболезненно вызывать необходимые сервисы MMU.

В новое ядро Linux введена поддержка процессоров m68k от фирмы Motorola, H8/300 от Hitachi и v850 от NEC. Причем одновременно с этим разрабатываются технологии, позволяющие использовать Linux на более древней аппаратуре. Но поскольку эта возможность вряд ли заинтересует широкую аудиторию, говорить о ее включении в будущие версии официального ядра пока рано.

В погоне за облегчением ядра для встроенных систем и микроконтроллеров весь код, отвечающий за взаимодействие с пользователем, был вынесен в отдельный модуль. Что при надобности позволяет «отрезать» его и использовать систему в суперминимальной конфигурации. Взаимодействие с такими системами осуществляется через удаленную консоль.

Разработчики Linux, стараясь не отстать от «темных сил зла» в лице небезызвестной Microsoft, включили в новое ядро полноценную поддержку 64-разрядных процессоров AMD Opteron. Дабы меня не закидали камнями, замечу, что и в последних версиях ядра 2.4 такая поддержка существовала, но была очень куцая. К примеру, для каждой из задач выделялось всего лишь по 512 Мбайт оперативной памяти. Конечно, во многих случаях это вполне приемлемое значение, но в высокопроизводительных серверных приложениях его может оказаться недостаточно. Ведь 64-разрядную архитектуру вводят прежде всего затем, чтобы расширить область доступной памяти, а тут операционная система сводит на нет все преимущества архитектуры.

Кстати, о памяти: в новом ядре наконец-то реализована полная поддержка PAE (Physical Address Extensions — расширение физических адресов). Именно эта технология позволяет высокопроизводительным 32-разрядным приложениям адресовать более 4 Гбайт оперативной памяти. Правда, работать с PAE не совсем удобно. Доступ к памяти производится через небольшое «окно», которое приложение двигает в памяти и через которое обращается к нужным участкам (очень напоминает сегментацию памяти в реальном режиме работы процессора, как было в DOS). Эту процедуру можно сравнить с разглядыванием большой картины в темной комнате при помощи фонарика: увидеть полотно целиком нет никакой возможности. В свете тенденций перехода на

64-разрядную архитектуру, которая позволяет адресовать до 16 Тбайт оперативной памяти, введение поддержки PAE в ядро 2.6 выглядит запоздалым.

Правда, есть одна область, в которой разработчикам Linux удалось-таки обогнать Microsoft — полноценная поддержка HyperThreading. Напомню, что эта технология, разработанная корпорацией Intel, позволяет одному процессору маскироваться под два. В Linux 2.6 ее поддержка доведена до блеска. Теперь планировщик научился так хорошо балансировать потоки, требующие внимания процессора, что выигрыш заметен всегда. Ранее же включение режима двойного процессора иногда замедляло работу приложений. Справедливости ради скажем, что дело вовсе не в расторопности команды разработчиков Linux, а лишь в юридической заминке, которая не позволила Microsoft осуществить это раньше.

Следующее новшество в ядре 2.6 — поддержка субархитектуры, благодаря чему процессор может работать в нестандартном окружении. Прежде Linux, обнаруживая некий процессор, априори предполагала, что он работает в стандартном для него окружении (к примеру, все представители семейства i386 должны располагаться в PC/AT-компьютере). Однако на практике процессоры нередко используются сторонними производителями для создания собственных станций — как, скажем, делает SGI.

Наконец, самое глобальное новшество — введение поддержки многопроцессорных серверов, построенных по технологии NUMA (Non-Uniform Memory Access — неоднородный доступ к памяти). Ахиллесовой пятой всех классических многопроцессорных серверов с единой шиной доступа к общей памяти являются взаимные блокировки: поскольку шина одна, то обращаться к памяти может только один процессор, а всем остальным приходится ждать. Конечно, делаются попытки повысить производительность систем, для чего используются специальные механизмы синхронизации чтения/записи в память (по принципу «один пишет, несколько читают»). Но выручают они не сильно. Технология NUMA позволяет решить эту проблему, вводя для каждого процессора персональную память, к которой он может обращаться когда угодно. Помимо этого, всем процессорам выделяется общая память, работа с которой идет по обычной схеме. Фактически NUMA-серверы напоминают тесно связанные кластеры, где роль отдельных серверов выполняют процессоры.

В рамках позиционирования Linux для серверных систем были увеличены многие важные системные показатели. Количество одновременно зарегистрированных процессов в системе может достигать одного миллиарда, против 32 тысяч в предыдущих версиях. Максимальное количество уникальных пользователей и групп достигло четырех миллиардов (против 65 тысяч). Введен механизм масштабирования максимального числа открытых файлов. Если это значение достигает критического, система автоматически увеличивает его до нужного. Наконец, появилась возможность создавать файловые системы размером до двух терабайт.

Впрочем, простым смертным большинство из перечисленных усовершенствований ни к чему — они призваны продвигать Linux в целом, создавая ей репутацию мощной и стабильной системы. Рядовых граждан должно порадовать другое. Во-первых, как заявляют разработчики, новое ядро стало куда более интерактивным — за счет введения принудительного прерывания кода нулевого кольца (кода ядра). Ранее пользовательское приложение, запросив у ядра выполнение какой-либо операции, было обязано дождаться окончания ее исполнения. И если операция была достаточно длительная, то снижалась плавность работы программы. Теперь же приложение может прерывать работу ядра, что, как полагают создатели новой версии, повысит скорость реакции системы на команды пользователя. Кроме того, был добавлен новый объект синхронизации Futex (Fast User-Space Mutexes — быстрые пользовательские мьютексы). От классических они отличаются тем, что реализованы в пользовательском режиме, тем самым позволяя избежать переключения контекста защиты во время синхронизации нитей на данных объектах. А это, в свою очередь, позволит ускорить их работу.

Мьютекс (от англ. mutex — взаимоисключение) — объект синхронизации, который устанавливается в особое сигнальное состояние, когда не занят каким-либо потоком. В любой момент времени только один поток владеет этим объектом, поэтому одновременный доступ к общему ресурсу исключается.

Введены существенные улучшения в планировщик синхронизации ввода/вывода. Теперь происходит четкое таймирование запросов, что резко сокращает время ожидания процессов, запросивших операцию ввода/вывода.

В самом ядре сделано несколько масштабных изменений, переписаны большие участки кода, отвечающие за работу с модулями. Не обошлось и без косметических изменений. Отныне модули будут носить расширение не «.o», а «.ko» (сокращение от Kernel Object), и пользователям будет понятно, что перед ними не простые объектные файлы, а модули ядра.

Множество других внутренних доработок призвано повысить производительность и стабильность системы. В их числе: устранение грубых синхронизирующих блокировок, оптимизация механизма упреждающего чтения файлов, отложенная запись, устранение проблемы стабильности работы malloc в режиме острой нехватки памяти (в прежних версиях Linux использовался весьма странный механизм управления памятью. Иногда он позволял выделить память, даже если фактически она отсутствовала в системе, что приводило к неприятным последствиям в работе приложения).

Очень интересна новая виртуальная файловая система sysfs, монтируемая в /sys. Она является представлением устройств, зарегистрированных в системе, и с ее помощью администратор может получить данные об устройстве, а также изменить его параметры. Что очень удобно для гибкого и динамичного администрирования системы.

В новое ядро наконец-то введена полноценная поддержка Plug’n’Play BIOS и базы данных имен устройств. Были доработаны механизмы управления шиной PCI, появилась поддержка систем с несколькими шинами APG, которые используются в высокопроизводительных графических станциях.

Пару слов хотелось бы сказать об изменении механизмов, обеспечивающих поддержку беспроводных устройств. Здесь улучшения прошли на всех фронтах. Во-первых, основные компоненты для поддерживаемых протоколов были объединены в подсистему со своим API, тем самым устранились некоторые несовместимости при использовании различных устройств. Во-вторых, была усовершенствована поддержка IdDA (стандарта связи через инфракрасный порт) и Bluetooth.

Наверняка обрадую некоторых читателей, сообщив, что Linux сменила давно устаревшую звуковую подсистему OSS (Open Sound System) на долгожданную ALSA (Advanced Linux Sound Architecture). Новая система поддерживает USB и MIDI, полнодуплексное воспроизведение и запись, работает одновременно с несколькими звуковыми картами, имеет аппаратное управление потоками и расширенную поддержку микшера (для реализации всех функций современных звуковых карт). Другой новинкой в области мультимедиа стала полноценная поддержка оборудования для цифрового спутникового телевидения (Digital Video Broadcasting, DVB).

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

На десерт упомяну еще об одной любопытной возможности нового ядра — режиме собственной виртуализации4. Linux обзавелась встроенной виртуальной машиной, которая позволяет загрузить другую копию Linux подобно обычному приложению. Чем-то это похоже на обычную виртуальную машину вроде Virtual PC или VMWare, только работает гораздо быстрее, поскольку напрямую поддерживается ядром.

© ООО "Компьютерра-Онлайн", 1997-2022
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.