Всему виной теневое копирование.
Теневая копия по сути позволяет процессу делать моментальный снимок тома (C :, D: и т. д.) В любой момент времени. Пока теневая копия активна, записи на этот жесткий диск не перезаписывают существующее содержимое тома. Вместо этого они перенаправляются в специальную часть файловой системы. Другими словами, том, по сути, разделен на две части: одна содержит содержимое файловой системы в момент запроса теневой копии, а другая содержит все изменения, которые были сделаны с тех пор. Как правило, программа, которая создала теневую копию, является единственной, которая видит ее неизменное содержимое. Все остальные программы обычно не знают, что теневая копия существует, и они видят изменения, сделанные после создания теневой копии. Это происходит потому, что когда одна из этих программ говорит «Дайте мне данные в файле X», Windows начинает с чтения версии файла X с теневой копией, но затем проверяет, были ли внесены какие-либо изменения; если так, то эти изменения применяются до того, как данные возвращаются в копию.
Теневые копии обычно используются для продуктов резервного копирования. Проблема с программами резервного копирования Windows до реализации теневого копирования заключалась в том, что резервное копирование иногда было несовместимым, поскольку резервное копирование содержало версию каждого файла, которая, как оказалось, присутствовала в момент получения программой резервного копирования. Если, скажем, вы устанавливали программу во время резервного копирования, резервная копия могла бы содержать только половину файлов программы со всеми видами плохих результатов. Используя теневую копию, программа резервного копирования знает, что она захватывает согласованное представление системы в один момент времени (момент, когда началось резервное копирование).
Таким образом, сразу возникает некоторое несоответствие между тем, как работают теневые копии, и тем, что нужно сделать Центру обновления Windows. Теневая копия не меняется, и обычно ее видит только одна программа. Предполагается, что Центр обновления Windows хотел бы сделать наоборот: он хотел бы вносить изменения в каталог Windows, в то время как все остальные видят его неизменную версию с момента до начала обновления. Конечно, мы могли бы создать «обратную теневую копию», которая работает таким образом; но есть другая проблема. Помните, что теневая копия работает на всем томе и делит его на «содержимое тома в тот момент» и «изменения с тех пор». В случае Центра обновления Windows Windows будет вносить изменения, которые не будут видны другим программам, но эти другие программы так же будут вносить изменения. Таким образом, нам действительно нужно создать две теневые копии одновременно - одну для Центра обновления Windows, другую для всех остальных. Это может оказать некоторое влияние на производительность.
Теперь предположим, что Центр обновления Windows завершает свое обновление и говорит Windows закрыть свою теневую копию - другими словами, записать все свои изменения в «обычную» версию системы и позволить другим программам увидеть их. И теперь все разваливается. Потому что эти другие программы уже имеют некоторые библиотеки Windows DLL, загруженные в память, и эти копии в памяти являются старыми версиями. И если эти программы открывают компоненты Windows, которые они ранее не использовали - или, возможно, даже если они используют ранее неиспользованную функциональность компонентов, которые они уже использовали- тогда вдруг в памяти одновременно смешиваются старые и новые компоненты Windows (или даже старые и новые части одного и того же компонента Windows). И у них потенциально есть совершенно разные представления о том, какие вещи располагаются в памяти или как различные части системы взаимодействуют друг с другом (в конце концов, внесение изменений в эти вещи является одной из основных причин, почему обновления выпускаются в первую очередь) , И программы начинают терпеть крах, и данные теряются, и пользователь глубоко несчастен.
Можем ли мы сказать: «Хорошо, программы, которые уже работали, последовательно используют старую версию Windows, а недавно запущенные программы используют новую версию Windows?» Да. Это было бы немного неудобно для реализации и имело бы больше влияния на производительность. Но в современных Windows программы постоянно общаются (обмениваются данными) друг с другом. Вы могли бы иметь чрезвычайно сложную смесь старых программ Windows, говорящих с новыми программами Windows, говорящими со старыми или новыми частями Windows, которые не связаны с определенной программой, и так далее. А что, если старые и новые версии Windows имеют разные взгляды на то, как следует планировать общий ресурс, скажем, реестр?
Это так скажем технологических барьер. Для полного понимаю необходимо обратиться к дополнительным ресурсам.
Теперь вы понимаете, почему Windows требуется перезагрузка для завершения установки обновлений. Независимо от того, насколько умно мы пытаемся записать изменения на диск во время выполнения обновления, в настоящее время мы можем гарантировать, что программы будут работать согласованно друг с другом, и единственный способ избежать апокалипсиса тестирования, который описан, - это скажем: «Хорошо, как только мы подготовим обновленные файлы, мы полностью выключим старую версию Windows и запустим новую».
Таким поведением подвержены не только MS Windows, но и: MacOS, iOS и Android, как правило, требуют перезагрузки после любого значительного обновления.
Linux - большая сложная проблема; Linux-блок обычно может обновлять все, кроме ядра, без перезагрузки, а некоторые варианты могут даже применять обновления ядра без перезагрузки. Linux зародился в Unix, и Unix с самого начала была спроектирована как многопользовательская ОС, в отличие от большинства других операционных систем ПК (которые начинались как однопользовательские ОС и могли иметь многопользовательские функции, привитые позже) и в отличие от телефонных ОС (которые почти всегда однопользовательские). Во многом из-за необходимости одновременной многопользовательской поддержки Unix (и Linux) были разработаны с большим количеством уровней изоляции, абстракции и безопасности, которые отделяют программы друг от друга, отделяют программы от ОС и отделяют компоненты ОС друг от друга.