Интервью с Джонатаном Корбетом

TanaT

Xakep, номер #054, стр. 054-080-2


Х: Вы не могли бы подробнее пояснить суть термина «монолитное ядро»?

JC: Это довольно просто. Монолитное ядро – это больший цельный «кусок». При этом существует всего один исполняемый образ и одна большая непрерывная часть памяти, где данный образ хранится. Все привилегированные операции (доступ к аппаратному обеспечению) проходят через образ ядра. В противоположность монолитным существуют микроядра. Микроядра строятся на минимуме требуемой функциональности: механизме прохождения сообщений и контроле над процессами. Все остальные функции берут на себя привилегированные внешние процессы. Таким образом, поддержка сетей, файловой системы и аппаратных драйверов вынесена из ядра и размещена во внешнем коде.

Х: В чем на практике проявляется разница между такими подходами к строению ядра?

JC: Микроядра долгое время претендовали на первое место, но судьба решила по-иному. Микроядра обещали и производительность, и переносимость, и практическую гибкость. Когда система собирается из маленьких кусочков (составных частей ядра), вы можете многое поменять, модифицировав лишь требуемый кусочек. Когда дело дошло до практики, микроядра не оправдали ожиданий. «Микро»-часть ядра на деле является не такой уж и маленькой, а добиться нормального уровня производительности оказалось не так просто. Высокая скорость легко достигается, если ядру не требуется обрабатывать большое число сообщений и переключать контекст для каждой операции. Те, кто действительно интересуется этой темой, могут просмотреть знаменитый спор между Линусом Торвальдсом и Эндрю Танненбаумом (Linus Torvalds и Andrew Tannenbaum): www.oreilly.com/catalog/opensources/book/appa.html.

Х: Можете привести примеры операционных систем, построенных на микроядрах?

JC: Windows 2000 построена на микроядре. Пожалуй, больше я и не знаю :). В мире свободного ПО Mach является известной системой на архитектуре микроядра. Это ядро положено в основу Apples OS X, а также используется в проекте GNU HURD.

Х: Расскажите, пожалуйста, об ошибках и багах, содержащихся в коде ядра.

JC: Огромное количество багов живет в коде годами. И никто их не замечает. Проект Stanford Checker предлагает некоторые средства, позволяющие автоматизировать процесс поиска багов. Хотя большинство багов безобидны, некоторые из них все же могут вызвать серьезные проблемы. Переполнение буфера и тому подобное встречается в ядре довольно редко. Разработчики ядра очень внимательно относятся к таким вещам и делают все возможные и невозможные проверки, чтобы предотвратить любые переполнения. Настоящие проблемы вызывают баги, связанные с аппаратным обеспечением и параллельной обработкой. Очень сложно поддерживать аппаратное обеспечение, которое только появилось на складах магазинов, но которое вот-вот уже установит себе пользователь. К тому же производители железа не всегда следуют предписанным спецификациям и допускают некоторые отклонения. Основная причина необходимости в огромном числе тестеров в том, что у разработчиков просто не может быть всех возможных видов аппаратного обеспечения. Пользователи же легко наткнутся на проблему, когда какая-то определенная сетевая карта или, к примеру, новый дисковод ведут себя немного по-другому. Но этого хватит, чтобы повесить систему. Параллелизм связан с тем, что в ядре многие события происходят одновременно. Вы можете запрограммировать простое выражение вида:

Назад на стр. 054-080-1  Содержание  Вперед на стр. 054-080-3