Существующий подход к управлению ресурсами многоядерных процессоров сложен и далеко не всегда эффективен, считает он. Возможно, задача состоит не в том, чтобы более энергично совершенствовать методики, такие как параллельное программирование, а чтобы полностью переосмыслить базовые абстракции, лежащие в основе операционных систем.
Проберт уверен, что современные компьютеры явно не в полной мере используют производительность своих многоядерных процессоров. «Почему вообще, имея все это параллельное аппаратное обеспечение, мы должны ждать, пока компьютер выполнит то или иное действие?», — удивляется он.
Для начала Проберт попытался определить, как новая операционная система, если ее делать «с нуля», могла бы выглядеть сейчас. Он пришел к выводу, что она сильно отличалась бы от Windows или Unix.
«Главное — это быстрота отклика, — заметил он. — Именно этого в первую очередь хотят люди».
Отсюда, по его словам, возникает вопрос, каким образом дать знать операционной системе, какая задача является важной. Вы же не хотите ждать, пока запустится Microsoft Word, только потому, что именно в данный момент антивирусная программа решила начать сканирование ваших файлов. Большинство операционных систем используют ту или иную модель приоритетного планирования, чтобы избежать узких мест, но этот механизм еще очень далек от совершенства.
Производители микропроцессоров, начав увеличивать число ядер, понадеялись, что программисты смогут создавать для них программы. По мнению Проберта, проблема современных программ для настольных ПК заключается в том, что они недостаточно эффективно используют доступные им ядра.
Для того чтобы воспользоваться всеми преимуществами, которые дает наличие нескольких ядер, разработчики должны применять методы параллельного программирования. Это сложно даже для опытных специалистов, и такие методы используют не очень широко, разве только для специальных программ, таких как системы моделирования климата.
Пожалуй, лучшее, что можно сделать в этой ситуации, это переосмыслить то, как операционные системы работают с многоядерными процессорами. Существующая архитектура операционных систем строится на множестве различных абстракций.
В период возникновения компьютерной отрасли одну программу можно было запускать на одном центральном процессоре. Если же мы хотим, чтобы несколько программ работало на одном центральном процессоре, время процессора необходимо разделить между процессами, причем так, чтобы создавалось впечатление, будто каждое приложение работает на выделенном центральном процессоре.
Как только операционной системе пришлось иметь дело с несколькими программами, ей потребовалось защищенное пространство, куда не может попасть ни пользователь, ни программа. Так появился режим ядра, отделенного от пространства, в котором выполняются программы, — от режима пользователя. По существу, режим ядра и режим пользователя разделили центральный процессор на два, заметил Проберт.
Однако виртуальным центральным процессорам приходится бороться за ресурсы реального центрального процессора. Накладные расходы на переключение между всеми этими центральными процессорами растут, и в результате система начинает медленнее реагировать, особенно в том случае, если используется несколько ядер.
Проберт заметил, что до тех пор, пока Intel и AMD будут многократно увеличивать число ядер в своих микропроцессорах, сообщество разработчиков операционных систем может чувствовать себя уверенно, отказавшись от таких абстракций, как режим пользователя и режим ядра.
«С несколькими ядрами центральные процессоры могут снова стать центральными процессорами, — заметил он. — Если у нас их будет достаточно, то, возможно, мы сможем начать раздавать их отдельным программам».
При таком подходе работа операционной системы больше не будет напоминать работу нынешних ОС в режиме ядра, а вместо этого ОС будет действовать как гипервизор. Гипервизор, как одна из концепций виртуализации, действует в качестве посредника между виртуальной машиной и реальным аппаратным обеспечением.
Программы, или модули времени исполнения, как их называет Проберт, сами могли бы взять на себя многие обязанности, связанные с управлением ресурсами. Операционная система могла бы выделять приложению центральный процессор и какой-то объем памяти, а программа сама, используя метаданные, сгенерированные компилятором, могла бы лучше знать, как использовать эти ресурсы.