> man operating_systems
Ядро Linux 2.6
Краткое описание новинок ядра 2.6
на Воскресенье, 18 Июль 2004, 21:11
добавил: Джозеф Праневич список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи > Unix
комментарии: 0
просмотров: 3747


Интерактивностьи скорость реакции ядра.

Одним из направлений, в котором сфокусировано развитие ядра 2.6., является создание для пользователей настольных систем, и других задач, требующих высокого уровня контроля над происходящими событиями, более интерактивной системы. Каждое из этих целевых направлений имеет свои проблемы, но было внесено много изменений, которые принесут пользу в обоих случаях.

Главное внутреннее изменение, представленное в ядре 2.6. и значение которого не может быть преуменьшено, это то, что теперь само ядро является выгружаемым. В предыдущих версиях Линукса, когда ОС выполняла что-либо в ядре она не могла быть прервана (на многопроцессорнх машинах это было истинно в отношении каждого процессора). Начиная с ядра 2.6., пользовательска задача может прервать работу ядра даже если оно выполняет нечто сложное (чтобы избежать вызванных этим явных коллизий, ядро имеет части, которые не могут быть прерваны в процессе выполнения). Основной выигрыш, достигнутый этими изменениями, заключается в том, что улучшается интерактивная производительноть (например при работе пользователя настольной системы) и таким образом система становится более чувствительной к таким вещам как пользовательски ввод.

Другим изменением, позволившим Линуксу стать более интерактивной ОС в отношении приложений, поддерживающих такую интерактивность стала поддержка новых "futexes" (или "Fast User-Space Mutexes" - быстрые семафоры пользовательскоо пространства). Futexes - это возможность, с помощью которой множественные процессы и нити могут выстраивать последовательноть событий так, что они не будут наступать друг другу на пятки ("состояние "). В отличие от традиционных операций взаимоисключения, поддерживаемых большинством библиотек распараллеливаня процессов, данный способ частично базируется на поддержке ядра (но только в случае возникновения разногласий) и он также поддерживает систему приоритетов, позволяющую приложениям или нитям с более высоким приоритетом, получить первоочередной доступ к запрошенным ресурсам. Программное определение приоритета задач, позволило получить более интерактивную систему, что может быть очень важно в критичных ко времени приложениях.

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

И хотя разработчики приложений "реального " (RTOS) получают максимальный выигрыш от этих изменений, Линукс 2.6. все же не является ядром "реального " исполнения. Однако эти и другие изменения делают возможным создание основы для полностью RTOS-версии Линукса, и уже есть сторонние патчи (пока не утвержденные и не включенные в официальный выпуск ядра), которые обеспечивают поддержку пользователей и разработчиков, нуждающихся в этом сейчас.

Подсистема Модулей - Драйверы Устройств

Другой измененной частью, с выходом ядра 2.6., стала подсистема модулей. Большая часть кода была переписана с целью повышения стабильности и создания более прозрачной системы. Кроме очевидных внешних изменений, многое было изменено "", то есть то как ядро видит и использует модули.

Первое и наиболее очевидное изменение (хотя и наименее функциональное) в драйверах ядра 2.6. - это изменение расширений файлов. Вместо бывшего "." (общее расширение для "" файлов, обычно создаваемые в результате компиляции любой программы до линковки в исполняемый файл) теперь используется расширение ".k" ("kernel object"). Это лишь косметическое изменение, делающее более ясным то, что модули не являются промежуточными объектными файлами.

Абсолютно не косметическое изменение - огромная работа, проделанная для устранения состояний гонки, которые имели место в коде многих предыдущих ревизий. Загвоздка в том, что какое-либо устройство может обратиться к модулю в процессе его выгрузки, но уже после того, как модуль проверит не используется ли он. Новый код модульной части ядра сводит такие состояния к минимуму. Следующий шаг данного решения - возможность простого отключения выгрузки модулей в целом.

Улучшенная прозрачность - еще одна возможность новой подсистемы модулей. Почти во всех предыдущих версиях Линукса модули были достаточно умными для определения устройств, поддерживающих определение ID устройства сканированием шин (таких как PCI, ISA PnP, и PC Card). В ядре 2.6. большая часть такой поддержки была стандартизованаи вынесена вне ядра, что позволило внешним программам и загрузчикам модулей определять какие устройства поддерживает конкретный модуль. Это позволит различным программам управления оборудованием (таким как "kudzu") принимать интеллектуальны решения об оборудовании, даже если они его не "знаю". И если вы уверены, вы можете "" драйвер попытаться работать с устройством, которое он не поддерживает (посредством интерфейса новой файловой системы `sys`, описанной ниже).

Другие Усовершенствоваия

В дополнение ко многим изменениям, описанным выше, было сделано много других основных изменений внутри Линукса, повышающих производительноть во многих случаях. В них вошло много устранений "Big Kernel Lock" ("" блокировки, использовавшиес в ранних версиях Линукса, поддерживающих несколько процессоров), оптимизация упреждающего чтения файловой системы, отложенная запись, манипуляции с маленькими файлами и другое.

В Линуксе 2.6. решена одна из серьезных проблем стабильности: более невозможно выделить памяти больше, чем есть в системе ОЗУ (плюс своп). Раньше, в некоторых случаях, Линукс мог позволить успешно вызвать malloc() ("выделение памя") даже если память была исчерпана. Была пересмотрена логика выделения ресурсов и подобные случаи сделаны невозможными (конечно если вы исчерпаете системное ОЗУ - даже без превышения максимума - у вас возникнут серьезные проблемы).

Линукс всегда был выгодной платформой открытых стандартов. Одним из больших внутренних изменений стала полностью переписанная инфраструктура нитей, позволившая использовать поверх себя Native POSIX Thread Library (NTPL). Это дало серьезное увеличение производительноти на процессорах Pentium Pro и лучше в сильно "распараллеленны" приложениях, многие крупные игроки уровня предприятия требовали этого (фактически, Red Hat портировала эту возможность в ядро 2.4., входящее в состав Red Hat Linux начиная с версии 9.0). Это изменение привнесло новые концепции в Линукс включая группы нитей, локальная память отдельных нитей, сигналы в стиле POSIX и многое другое. Одним из главных недостатков является то, что приложения (такие как Sun Java) написанные без учета данной спецификации и опирающиеся на старый Linux-isms, не будут поддерживаться. Поскольку преимущества оказываются довольно дороги (и учитывая множество крупных игроков в игре) , становится ясным, что большинство важных приложений включат поддержку изменений задолго до выхода нового ядра.

И, наконец, хотя большинство приложений Линукса не получат прямой выгоды, ядро 2.6. теперь включает возможность полностью отказаться от поддержки свопа при компиляции ядра. Это позволит Линуксу работать в немного меньшем объеме памяти, что может быть полезно во встраиваемых устройствах, где маловероятно использование свопа.

Модель Унифицированног Устройства

Очень часто принимаемая за отдельный компонент ОС, принятая в ней модель устройств очень важна для ОС, спроектированно для работы с широким спектром оборудования. Если коротко, то модель устройств представляет собой внутреннюю инфраструктуру ядра, обнаруживающую и определяющую использование ресурсов всех дополнительных компонент системы. Всем ОС (и разновидностям Линукса) свойственно иметь какую-либо концепцию представления устройства. Предыдущие версии Линукса (2.2. и старше) имели низкоуровневое представление об устройствах. Существовали драйверы для различных устройств с шинной архитектурой и различные драйверы устройств знали как опрашивать поддерживаемую ими шину для определения подключенных к ней устройств. Такая система постоянно расширялась и различные шинные архитектуры имели различные и не совместимые API для выполнения разнообразных операций. Линукс 2.4. стал первым шагом к "" модели устройств объединив PCI, PC Card и ISA Plug-and-Play в единую структуру устройств с общим интерфейсом. Линукс 2.6. приложил значительные усилия для того, чтобы сделать завершенное новое видение того, как ядро Линукса видит оборудование с которым работает - универсальное видение для всей системы.



© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.