Производители микропроцессоров с каждым новым их поколением продолжают увеличивать число ядер, поэтому, возможно, настало время переосмыслить базовую архитектуру современных операционных систем. С таким предложением выступил Дейв Проберт, архитектор ядра, работающий в подразделении Microsoft Windows Core Operating Systems Division.
Существующий подход к управлению ресурсами многоядерных процессоров сложен и далеко не всегда эффективен, считает он. Возможно, задача состоит не в том, чтобы более энергично совершенствовать методики, такие как параллельное программирование, а чтобы полностью переосмыслить базовые абстракции, лежащие в основе операционных систем.
Проберт уверен, что современные компьютеры явно не в полной мере используют производительность своих многоядерных процессоров. "Почему вообще, имея все это параллельное аппаратное обеспечение, мы должны ждать, пока компьютер выполнит то или иное действие?", – удивляется он.
Проберт входит в состав группы, создающей Windows следующего поколения, хотя, по его словам, его идеи пока не нашли отражения в работе этого подразделения. Он признает, что на самом деле многие архитекторы из группы разработки ядра Windows не согласны с его мнением.
Для начала Проберт попытался определить, как новая операционная система, если ее делать "с нуля", могла бы выглядеть сейчас. Он пришел к выводу, что она сильно отличалась бы от Windows или Unix.
В обычном современном настольном компьютере одновременно выполняется множество программ, например, пользователь может писать сообщение электронной почты и при этом слушать музыку.
"Главное – это быстрота отклика, - заметил он. – Именно этого в первую очередь хотят люди".
Отсюда, по его словам, возникает вопрос, каким образом дать знать операционной системе, какая задача является важной. Вы же не хотите ждать, пока запустится Microsoft Word, только потому, что именно в данный момент антивирусная программа решила начать сканирование ваших файлов.
Большинство операционных систем используют ту или иную модель приоритетного планирования, чтобы избежать узких мест, но этот механизм еще очень далек от совершенства. (Проберт даже предложил установить на каждую машину кнопку This Sucks!, которую пользователь может нажать, если его раздражает неповоротливость компьютера. Полученные в результате данные телеметрии, возможно, дадут разработчикам операционной системы лучшие идеи организации планирования.)
Производители микропроцессоров, начав увеличивать число ядер, надеялись, что программисты смогут создавать для них программы. По мнению Проберта, проблема современных программ для настольных ПК заключается в том, что они недостаточно эффективно используют доступные им ядра.
Для того чтобы воспользоваться всеми преимуществами, которые дает наличие нескольких ядер, разработчики должны применять методы параллельного программирования. Это сложно даже для опытных специалистов, и такие методы используют не очень широко, разве только для специальных программ, таких как системы моделирования климата.
Пожалуй, лучшее, что можно сделать в этой ситуации, это переосмыслить то, как операционные системы работают с многоядерными процессорами. "На самом деле вопрос состоит не в том, как использовать параллельность, а том, что нам делать со всеми этими транзисторами", - считает Проберт.
Существующая архитектура операционных систем строится на множестве различных абстракций.
В период возникновения компьютерной отрасли одну программу можно было запускать на одном центральном процессоре. Если же мы хотим, чтобы несколько программ работало на одном центральном процессоре, время процессора необходимо разделить между процессами, причем так, чтобы создавалось впечатление, будто каждое приложение работает на выделенном центральном процессоре.
Как только операционной системе пришлось иметь дело с несколькими программами, ей потребовалось защищенное пространство, куда не может попасть ни пользователь, ни программа. Так появился режим ядра, отделенного от пространства, в котором выполняются программы, - от режима пользователя. По существу, режим ядра и режим пользователя разделили центральный процессор на два, заметил Проберт.
Однако виртуальным центральным процессорам приходится бороться за ресурсы реального центрального процессора. Накладные расходы на переключение между всеми этими центральными процессорами растут, и в результате система начинает медленнее реагировать, особенно в том случае, если используется несколько ядер.
Проберт заметил, что до тех пор, пока Intel и AMD будут многократно увеличивать число ядер в своих микропроцессорах, сообщество разработчиков операционных систем может чувствовать себя уверенно, отказавшись от таких абстракций, как режим пользователя и режим ядра.
"С несколькими ядрами центральные процессоры могут снова стать центральными процессорами, - заметил он. – Если у нас их будет достаточно, то, возможно, мы сможем начать раздавать их отдельным программам".
При таком подходе работа операционной системы больше не будет напоминать работу нынешних ОС в режиме ядра, а вместо этого ОС будет действовать как гипервизор. Гипервизор, как одна из концепций виртуализации, действует в качестве посредника между виртуальной машиной и реальным аппаратным обеспечением.
Программы, или модули времени исполнения, как их называет Проберт, сами могли бы взять на себя многие обязанности, связанные с управлением ресурсами. Операционная система могла бы выделять приложению центральный процессор и какой-то объем памяти, а программа сама, используя метаданные, сгенерированные компилятором, могла бы лучше знать, как использовать эти ресурсы.
Проберт признал, что такой подход протестировать будет очень непросто, поскольку он требует большого количества существующих приложений. Но, возможно, сделать это имеет смысл.
"Это намного более гибкая модель", - утверждает Проберт.