Стенограмма Доклада Дмитрия Завалишина О Phantom Os На Адд-2010



Аннотация Дмитрий Завалишин рассказал о текущем состоянии разработки своего любимого детища — оригинальной операционной системы PhantomOS, близкой по концепции к Microsoft Singularity, но с открытым исходным кодом (большая часть исходных кодов этой операционной системы опубликована).

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



видео

Видео в HD качестве, смотрите на весь экран.

Скачать видео

Подкаст

Ссылка на подкаст .



Стенограмма

Видеотранскрипт записал Стас Фомин.

Как сделать так, чтобы было действительно хорошо? В том смысле, что весь софт, который существует сегодня, сделан по принципу «Давайте возьмем то, что было, и как-нибудь это все заточим, улучшим, перенесем сюда, подправим сюда», и в итоге все у нас на сегодняшний день, это наследие-наследие-наследие, какое-то старье, которое развивалось, развивалось, развивалось, и в итоге оно все в таких слоях, и очень сложное и тяжелое.

Знаете, я пользуюсь компьютерами уже двадцать пять лет, с тех пор у тех, с которых я начинал, было две дискеты по 160 КБ и 48 КБ оперативной памяти.

Так вот, вы знаете, он загружался быстрее, чем тот, что у меня сейчас, но функционально я делаю с ним примерно то же самое: пишу на нем программы, редактирую некоторые тексты, читаю электронную почту.

И при этом поменялись процессор и память, Господи Боже.

Даже не могу сосчитать.

Пять порядков, шесть порядков - куда все это девается? Вот тут-то и попадается, весь софт, который сегодня делается, сделан по принципу исторического развития, чего-то такого старого, страшного и неудачного.

"Фантом" родился по принципу - давайте подумаем, что это было, и попробуем, сделаем с нуля, не будем брать ядро Linux, не будем брать Java, при всей моей любви к ней, не будем развивать существующее , начнем с нуля.

Есть ряд мыслей, которые лежат в основе этой самой идеи, например, задачи.

Я смотрел на современное программное обеспечение, которое мы все разрабатываем.

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

То есть как можно больше взять со стороны, как можно меньше сделать самому и в то же время уметь как-то собрать это все из кубиков.

Даже сама система, сама идея операционной системы, родилась из этого.

Как родилась операционная система? Когда-то люди взяли весь компьютер, взяли одну из своих программ и запустили ее.

Потом оказалось, что писать драйвер принтера в каждой программе — это заноза в заднице; надо сразу, откуда-то взять готовое.

Появились библиотеки.

Потом эти библиотеки превратились в ядро, на котором уже работает прикладная программа.

Так всё постепенно, постепенно всё начало разрастаться, и в конце концов появился Unix. Unix сегодня — это явно победившая операционная система, даже Windows сделана по образу и подобию Unix, концепция, на которой она основана, явно доминирует. Интересно, что когда появилась Unix, а я достаточно взрослый, чтобы помнить эти времена, Unix как операционная система была очень странной и сильно уступала всем существующим операционным системам.

Была машина, над которой мы работали, она называлась PDP-11 (SM-1600), у нее была собственная операционная система и Unix. Родная операционная система работала во много раз быстрее Unix. И все же, она сегодня умерла, а Unix существует! Почему? Потому что Unix сделал очень правильный шаг.

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

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

Можно сделать какие-то скрипты на оболочке, на ходу, что-то собрать вручную, без особой сложности.

Обратите внимание, что современные инструменты администрирования, такие как Perl, работают примерно в том же направлении.

Итак, возможность быстро наклепать что-нибудь на ходу.

В принципе, в основу «Фантома» легла довольно банальная идея, которая начала зарождаться примерно в девяностые годы.

Когда появился язык C++, который появился где-то в 1987 году, все были поклонниками объектного программирования, и возникла мысль типа «Ну и что? Язык объектно-ориентированный, почему операционная система плоская? Необходимо также сделать его объективным».

Причем, вообще говоря, это довольно практичная мысль, которая проистекает не из каких-то колебаний или идеализма, а проистекает из того, что на самом деле иметь объектный интерфейс вполне удобно.

Если посмотреть на текущую ситуацию, то это, очевидно, так.

Тот же C#, та же Java, вполне неплохо заворачивают операционные системы в обёртки объектов, это удобно.

Отлично.

Следующий шаг.

Совершенно очевидно, что мы хотим, чтобы программы взаимодействовали.

И вот что интересно.

вот что я забыл сказать в этом разговоре о Java и C#, о том, что в C#, да и в Windows вообще, есть OLE. Это реально.

несмотря на всю, простите, ублюдочность этого инструмента, лучшего, к сожалению, пока нет. И этот инструмент действительно решает вполне значимую задачу.

Эта задача состоит в том, чтобы построить среду компонентов, которую можно фактически собрать из этого стека объектов.

То есть получать собранные, скомпилированные модули от разных сторон, и делать из них что-то унифицированное, как-то собирая работающую систему.

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

все они созданы как COM-объекты.

COM — вполне выигрышная технология, они от нее выигрывают, она им нужна.

Или есть другой пример, это возможность.

кстати, используется не очень часто, но очень вкусно, возможность вставлять документы Word, например, в таблицу Excel, или как-то по-другому их связывать , такие документальные вещи.

Отлично, правда? Я когда-то, в один из первых раз, когда рассказывал о Phantom, был большой зал, там было около двухсот программистов — «Кто знает, что такое OLEЭ» И тридцать рук поднялись.

Я спрашиваю: «Сколько людей на нем программируютЭ» Вы действительно создали какой-нибудь OLE-инструментЭ» И так, эти трое неуверенных людей, и видно, что двое из них составили «Hello World», примерно, а третий действительно что-то взломал и сделал это [ 1 ] .

Почему? - Очень сложно.

Очень, очень, очень тяжело.

Даже если не брать OLE, просто брать другие инструменты, если есть два процесса на одной машине или на разных машинах, то с возможностью реально связать их с помощью данных очень.

плохо с этим.

Более того, в чем еще проблема? Нормальным, естественным представлением внутреннего устройства программы является граф объектов.

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

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

И реально дать где-то такой инструмент, чтобы можно было вместе работать над общими данными.

ну OLE как-то это позволяет, но опять же очень сложно.

Но в то же время совершенно очевидно, что это ценная возможность.

Почему это сложно? Потому что много лет назад какой-то умный человек сказал, что операционная система — это ядро, запускающее процессы.

Эти процессы работают в отдельных адресных пространствах.

И с тех пор эта гениальная идея постоянно повторялась за ним.

Хотя на самом деле для управляемых языков, какими являются и Java, и C#, и вообще все, что сейчас делается, - это управляемые языки.

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

Поэтому если двигаться, делать шаг в сторону управляемых языков, то можно отказаться от адресных пространств на уровне операционной системы.

А дальше мысль такая - ну ладно, взяли, написали.

(смотрит на экран) это там Фантом работает.

Загрузка?
Нет, он уже загрузился, это он работает. Мы с вами взяли две программы, запустили их, и они подружились.

Один отправил другому указатель, поскольку у нас общее адресное пространство, общаться очень легко.

Указатель кидается, изменяется, за него можно потянуть, что-то отобрать, что-то передать, чужие данные становятся как свои, в буквальном смысле.

Очень дешевый IPC. Есть только одна проблема: вы остановили эту программу, а куда смотрит Пойнтер? Кажется, что идти в никуда.

Перезапустились, и даже если ваш указатель смотрит на старые данные, эта программа снова запускается, данные в другом месте, соединение прерывается.

Каждый раз, когда я говорю это, я привожу один пример.

При запуске фотошопа все запустили фотошоп, вылезает такое окно, там начинает бегать такая строчка - сейчас загружает это, потом сюда дошло, потом нашло что-то такое.

и так каждый раз.

Какого черта! Почему он не может один раз найти его и запомнить Пойнтер? Потому что существующие сегодня операционные системы не позволяют как-то оставить в памяти то, что вы когда-то в нее загрузили.

Вы вынуждены закрыть приложение, а при закрытии приложения теряется вся память.

Это значит, что вы не сможете их соединить обычным способом, только через файлы, только через странные, очень сложные вещи, которые работают сложно и медленно.

Можно ли сделать так, чтобы программа не останавливалась? Да, на самом деле это возможно.

Фактически программа живет внутри операционной системы и может легко притвориться, что операционная система живет вечно.

Даже если вы его перезагрузили и запустили заново, сообщать об этом программе совершенно не нужно.

В этом вообще нет необходимости даже в Linux. Что вы можете получить от этого? От этого можно многое получить.

Как только эта мысль пришла мне в голову, я сразу подумал: «Ладно, отлично, если сделать так, то есть запустить программу один раз, а потом она работает всю жизнь, как бы висит в память и живет там».

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

Я называю это сохранением души мертвой программы.

Если программу не убить, то ее душа бессмертна.

В этом случае файлы не нужны.

То есть, наверное, с их помощью можно передать данные куда-нибудь, записать на флэшку, отправить в сеть.

или что-то еще, но во-первых это не обязательно, а во-вторых, это можно сделать очень по-разному.

Недавно на ум пришел пример: есть программы, которые используют музыканты, называемые секвенсорами.

Все эти программы работают с двумя типами файлов - один свой тип, личный, в котором они хранят все свое состояние, обычно это какой-то проприетарный формат, который обычно никому неизвестен.

А второй — какой-то «.

midi».

Файл, в который можно что-то записать, чтобы потом передать куда-нибудь, в другую программу - это формат обмена.

Так вот, в данном случае вообще не обязательно делать первый формат. Программа запустилась и сохранила свое состояние в памяти.

Машина была выключена, при выключении машина как будто в Hibernate все это сохраняла, включал - все программы просыпались, как ни в чем не бывало.

То есть они могут спокойно оставаться в этом состоянии, свою работу вы не потеряете, подключить эту программу можно любым удобным для вас способом, такое подключение получается очень дешевым и эффективным.

Выяснилось еще несколько забавных вещей.

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

Из-за того, что контексты переключаются, а память программы может быть выгружена, ввод-вывод не может осуществляться непосредственно в нее; Ввод-вывод не может выполняться напрямую, его можно выполнять отдельно в буфере.

Ну, короче, есть некоторые проблемы.

В данном случае этого можно избежать.

Почему этого нельзя было сделать давным-давно? Потому что для того, чтобы делать такие вещи, нужны машины с очень большим виртуальным адресным пространством, 32 бита.

Фантом не имеет особого смысла, то есть имеет, но понятно, что 32 бита — это пространство, в которое должен уместиться весь диск, но это не очень много, это всего лишь четыре гигабайта, и оно не помещается дальше.

Поэтому, по большому счету, Phantom, как идея, ориентирован на 64-битные машины, а если 32-битные, то это скорее всего телефон, или что-то простое, маленькое.

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

Рассматриваются два пути для этого.

Первый способ — нативные правила.

Система Phantom имеет собственный байт-код, интерпретатор, строящий объектную модель, аналогичный Java и C#, имеет собственный компилятор языков, в нее записаны трансляторы с байт-кода Java и C#.

То есть теория гласит, что туда код Java и C#, а также весь код, который написан на языках, компилирующихся в JVM и CLR, можно перетащить в Фантом.

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

Вторая среда, которая изначально не планировалась, но возникла идея, что она наверняка нужна — это POSIX-совместимая среда, такая как UNIX внутри Фантома, которую мы планируем сделать в двух вариациях, одна вариация простая и элементарная.

Просто запустите приложения Unix, скомпилированные для Phantom. То есть среда POSIX, обычная, обычная среда POSIX. Второй более интересен, очень надеюсь, что получится, потому что его сложнее сделать, но здесь есть большая прелесть — это согласованная среда POSIX, то есть приложение представляет собой обычное UNIX-приложение, как есть, только снапшотируется системой, и тоже работает как будто вечно, то есть закрывать это приложение не надо.

С файлами он по-прежнему будет работать, можно просто на этом этапе выключить аппарат, включить, и все начнется с того же места, где его оставили.

И конечно, между ними будет какая-то развязка, которую тоже планируется сделать очень интересным образом.

Понятно, что современная операционная система не может не быть микроядерной; естественно, тащить все в ядро может быть несерьезно; понятно, что микроядро — это прежде всего средство связи между компонентами, включая ядро, драйверы и приложения.

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

Если кто-нибудь знает, была такая операционная система, она называлась BeOS. Довольно давно ушедшие из Apple французы сделали довольно интересную платформу, сделали для нее операционную систему, она не очень пошла, хотя где-то ее использовали, компания развалилась, а операционная система перешла в открытый исходный код и с тех пор используется.

Он был реализован пару раз и сейчас существует под названием Haiku. Вот в нем есть такой приличный механизм, передача сообщений существует, и мы собственно это посмотрели и перетащили в Фантом.

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

Здесь.

Я здесь ничего не вижу, что на экране, думаю, ты тоже ничего не видишь [ 2 ]

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

Но некоторые вещи занимают значительно больше времени, чем следовало бы.

Собственно, как работает ядро Phantom. Это, в отличие от. Говоря простым языком, если вы знаете, что такое подкачка в Unix, то Phantom — это операционная система, имеющая консистентную подкачку, то есть файл подкачки, в котором сохраняется состояние виртуального адресного пространства, а не теряется при перезагрузке, и правильно структурируется, и при перезагрузке система поднимает из него все свое состояние.

То есть, когда он просто работает, он не записывает ничего существенного, кроме обычного подкачки.

По его завершению делается снимок, фиксирующий полное состояние системы, а затем начинается оттуда, практически полностью восстанавливая ее состояние.

Здесь есть два момента.

Вообще очень часто спрашивают, чем это отличается от Hibernate, это от спящего режима отличается тем, что спящий режим нужно делать явно, иначе ты все потеряешь, а структура фантомной памяти устроена таким образом, что время от времени она делает снимки само собой, прозрачно для вас и совершенно безболезненно.

И в принципе, если его просто отключить, то при включении он снова встанет со старым состоянием, но с каким-то лагом, сколько минут назад, секунд. зависит от многого.

Итак, время снимка Phantom, во-первых, сильно отличается для первого запуска системы, и для последующих.

Если вы только что установили систему с нуля, то в снапшот нужно положить много чего, потому что все новое.

Если система сработала.

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

А если мы удалим все наши проверки и утверждения, то это, вероятно, происходит секунд пять.

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

ох, замолчала, отлично.

у нас будет честный эксперимент, виртуальная машина, в которой работает Фантом, почему-то решила сломаться.

Соответственно, будем считать, что его выдернули из розетки совершенно неожиданно.

Сейчас ломается, винда очень продуманная штука, почему-то сразу убивать ее не хочет, т.к.

В чем еще ценность такой конструкции? Дело в том, что Фантом очень быстро запускается.

что такое поднятие снапшотов? Это значит, что ядро загрузилось, а ядро очень маленькое, после чего ядро нашло карту памяти на диске, занесло ее в память и запустило дальше.

Все остальные обращения к диску происходят как часть обычных ошибок страниц, вызванных доступом к памяти, которая еще не загружена.

Почему это важно? Потому что современные компьютеры постоянно мигрируют с настольных ноутбуков на какие-то встроенные приложения.

Например, на моем телевизоре установлен Linux. Более того, этот линукс почему-то запускается за восемь секунд, меня это совершенно раздражает. Современные машины используют компьютеры, и даже если это Linux. если это Windows, то это конечно катастрофа, очень долго вставать.

Даже если это Linux, даже если он очень компактный, все равно запускается довольно долго.

На самом деле такая необходимость есть.

Нужна система, которая, во-первых, быстро запускается и не предъявляет никаких претензий по выключению.

Он вышел из машины, щелкнули ключи, выключил зажигание, положил ее в карман и уехал.

Система была убита.

Включили - система должна работать там же, где и была, потому что вы что-то с ней делали, там карту смотрели, что-то такое, какие-то операции происходили.

Разумно оставлять каждую транзакцию в том же состоянии, в котором вы ее оставили.

Если говорить о каких-то серверных системах, например, для медицины, то вот мой любимый пример — системы искусственного дыхания — мимо прошла уборщица, выдернула вилку.

, включил обратно, и говорит - "Я сейчас проверю диски.

, загружу туда что-нибудь".

, я сделаю что-нибудь еще».

Посмотрите на мужчину, он больше там не ждал.

Соответственно, мы еще как-то пытаемся проникнуть в эту сферу, я думаю, что это для нас довольно хорошая задача.

Итак, винда согласилась, что приложение надо убить, теперь попробуем.

По идее, он теперь должен подняться из того же состояния, в котором он находился в момент падения, по этому можно определить.

Будет такое белое окошко с цифрами, если там цифры не начинаются с единицы,.

это значит. ох, ох, ох.

Какая виртуальная машина?
Это ТПЛ.

Понятно, это белое окно, это на самом деле приложение Phantom, оно очень простое, у меня три строчки, там около

я = я + 1 распечатать я
Но дело в том, что его состояние показывает, насколько.

какое условие было поднято системой.

После перезагрузок видно, что он сохраняет свое состояние и восстанавливает его.

Какой? А виртуальная машина - ответил я.

Здесь.

Каков примерный статус проекта? Мы занимались этим около двух лет, ну я не в счет, были годы раздумий и метаний, в течение которых были написаны экспериментальные куски кода, которые сегодня все либо переписаны, либо по какой-то другой причине выброшены проекта.

Около двух лет. На реализацию доказательства концепции ушло около года, в котором я очень активно использовал внешний код, ну грубо говоря собрал из интернета всё, что подходило из стандартного вызова, типа управления процессором, управления памятью, всё что не было специфичным для Phantom, все было стандартным.

И поверх этого была написана операционная система, реализующая основные идеи.

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

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

И сегодня ядро, кроме стека TCP/IP, который был целиком взят из другой системы под нормальной лицензией, все остальные системы были написаны с нуля.

Сам стек TCP/IP доведен до какого-то внятного уровня, есть графические драйвера, есть базовые драйвера для стандартных сетевых карт, которые были наиболее популярны десять лет назад, например NE2000, или всем известных RTL. Тесты на снапшоты, разработку ядра, вообще говоря, все это нужно постоянно тестировать, мы сделали тест-сьют, который запускается практически в каждой сборке, на предмет регрессии.

По совпадению был создан компилятор собственного языка, также названный Phantom, и такие вещи сейчас находятся в разработке.

Кое-как дорабатывается ядро, хотя в целом оно в основном готово, и ведется работа над транслятором с Java-байткода на Phantom. Меня часто спрашивают, почему у Phantom свой байт-код, почему они не использовали Java, причин много, одна из них - это байт-код Phantom, как бы это сказать по-научному.

но в Java есть нативные типы типа int, float, это своего рода типы контента, но в Phantom их нет, там есть все объекты, абсолютно, абсолютно, полностью.

В принципе, можно наследовать от int и сделать.

разработку inta-интерфейсов, хотя и не понятно зачем, но это возможно.

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

Почему? Потому что виртуальная машина Java, по большому счету.

это Java, сишарпская, беспринципная, она работает в отдельном процессе, и это личная проблема этого отдельного процесса.

Даже если он вдруг сделает что-то не так, упадет, вылетит, допустит ошибку, испортит данные, это все равно ваши данные, и никто их больше не тронет. Виртуальная машина Phantom, все виртуальные машины, все процессы, все пользователи работают в одном общем адресном пространстве.

Это накладывает некоторые весьма специфические требования к системе.

Например, обычная виртуальная машина на основе стека — это просто стек, в котором выполняются все вызываемые функции.

То есть была вызвана следующая функция — она работает на том же стеке.

В «Фантоме» этого нет; в Phantom каждая отдельная функция создает себе отдельный стек и в нем живет. Почему? Потому что ты можешь вызвать метод чужого класса, и если он ошибется, испортит что-то со стеком, то именно он тебе его испортит. То есть это будет ущерб между разными пользователями.

Это то, чего мы не хотели допускать, поэтому там все очень-очень-очень строго разграничено, а сам этот код, в виртуальной машине, менее эффективен, чем Java, но очень строгий.

Кроме того, я не знаю, правильное ли это решение или нет, может быть, откажемся от этого, виртуальная машина Java такая, как она сделана? Он имеет фазу проверки байт-кода и фазу выполнения.

Байт-код загружается, она смотрит на него — «это возможно, это возможно, это возможно.

а это невозможно — они это не запустят».

Или «можно, можно, можно, можно, все нормально, я запущу».

Во время работы это не проверяется.

В Phantom сделано по-другому, проверки вообще нет, но все проверяется во время работы байт-кода.

Попытка выйти за границы массива, попытка выйти за размер стека, все-все-все, все это проверяется на лету.

Это, очевидно, влияет на эффективность, и весьма заметно.

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

Еще одна проблема, огромная, проблема, от которой я ужасно страдал, потому что система была во многом написана, и проблема была реализована, когда система по большей части уже работала, это вопрос сборки мусора.

Первые полгода, а то и год система работала без сборки мусора, тратилась, тратилась, тратилась, а потом все рухнуло.

И когда я начал заниматься сбором мусора, я понял неприятную вещь.

Обычный Фантом, вот обычный, который будет на 64-битных машинах, будет оперировать адресным пространством, объектом, размером диска.

То есть сегодня – терабайт, два терабайта, завтра – примерно десять терабайт. И сборку мусора, которую нужно провести, нужно провести на всем этом терабайте или десяти терабайтах.

И нужно понимать, что сегодня никакого сбора мусора не происходит. Вся сборка мусора, которая реализована сегодня, — это сбор «хороших объектов» и выбрасывание остальных.

Я вижу, да? То есть, чтобы собрать мусор, нужно пройтись по всем нужным объектам на диске.

А никак, как-то так.

даже все существующие частичные сборщики мусора, не важно, они либо некомплектные - кто-то за ними подбирает, либо они останавливают всю машину к чёрту, в этом случае можно удалить все, но в этом проблема.

Казалось, что это неразрешимая проблема, ведь терабайт, и не только это терабайт, но этот терабайт не весь находится в памяти, на самом деле система загружает в оперативную память только те объекты, которые действительно нужны, остальные - валяется там, на диске.

Если мы начнем заниматься сборкой мусора во всей этой каше, то это значит, что нам придется подцепить с винта все, что, вообще говоря, на нем есть.

К ОЗУ.

Ну не совсем, ведь нас в основном интересует заголовок объекта, а нам нужно его не только поднять, но и записать.

Война и немцы! Просто, конкретно, абсолютная катастрофа.

Я начал задаваться вопросом, ну, может быть, я не знаю, она сделает это ночью.

в тихом месте.

Полные, жуткие страдания, я действительно думал о том, стоит ли убивать проект, потому что это было не понятно, что делать.

Меня спасли две вещи.

Сначала я прочитал о Азул , что реально, эти ребята научились делать сборку мусора на терабайте, на стоке.

Есть даже три выхода из ситуации.

Второй выход из ситуации мы пока не приняли, потому что все эти алгоритмы, как оказалось, были кем-то довольно злонамеренно лицензированы, в чем тонкость? Есть очень старый, хороший и простой способ сбора мусора.

Это называется подсчет ссылок.

Подсчитываем количество обращений к объекту; если он упадет до нуля, объект выбрасывается.

Солидный, дубовый, работает довольно просто, очень жизнеспособен, но опять же все знают, что это не поможет, если у вас есть циклы объектов.

Сделали кольцо, у всех ссылка больше нуля, они все будут валяться где-то в углу, никакой внешней ссылки на это нет, вечно потерянная память, ее не собрать.

Оказывается, существуют алгоритмы, называемые прерывателями циклов.

Они как-то анализируют, понемногу ходят по объектам в системе и как-то смотрят, цикл ли это? Если цикл, то его обрезают, а потом его добивает обычная сборка мусора.

Вещь хорошая, но с лицензиями непонятно, поэтому тоже решили отложить.

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

тема.

Какая самая большая проблема при сборе мусора? Если мы можем все остановить, спокойно выключить программу и спокойно все обойти, то сбор мусора сделать очень легко.

А если программа продолжает работать, то сбор мусора может быть неправильным, причем неправильным в неправильном направлении.

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

Даже здесь, пока шла, она его не увидела, его перенесли, она его вообще не выдала, а ведь он был вполне нормальный, живой.

Чтобы с одной стороны не останавливать программу, а с другой стороны позволить себе собрать все объекты, делают. для этого используют много разных вещей, например, делают такую штуку .

Благодаря системе виртуальной памяти все объекты, к которым прикасается программа во время работы, помечаются как живые.

Вполне нормальная схема.

Но, обсуждая эту проблему, автор статьи сказал следующую забавную вещь, от которой я просто ухватился - «если бы у нас была полная копия всего состояния всей программы» - и тут меня щелкнуло - «Ой Боже мой, я пишу операционную систему, в которой всегда есть полная копия всего государства, всей программы в стране».

И это естественная, естественная жизнь этого самого компьютера, не нуждающаяся в дальнейшей реализации.

А идея очень проста — то, что было мусором во вчерашней версии, сегодня тоже мусор.

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

Это привело к очевидному решению.

В Фантоме две фигни Теги: #Программное обеспечение #Phantom OS #завалишин #цифровая зона #дни разработчиков приложений

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.