Казалось бы, с мобильными гаджетами и их операционной системой у Apple всё идёт как нельзя лучше: айфоны, айподы и айпады продаются миллионами, для них создаётся множество программ, пользователи довольны, и нет никаких причин беспокоиться о будущем. На самом деле причина для этого есть, и кроется она в самом нутре мобильной операционной системы iOS. Мало того, с тех пор, как в Apple стали переносить особенности iOS в настольную Mac OS X, её будущее тоже оказалось под угрозой.

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

В своё время появление поддержки виртуальной памяти позволило (до какой-то степени) не обращать внимания на ограничения, накладываемые объёмом ОЗУ. Cистема сама выгружает неиспользуемые фрагменты оперативной памяти на диск, а затем восстанавливает их, когда возникает необходимость. Персистентность приложений, в сущности, развивает ту же идею, но позволяет системе выгружать не просто информацию из памяти, а замораживать целые процессы, впустую тратящие ресурсы, и затем так же автоматически восстанавливать их. Если виртуальная память скрывает от пользователей и программистов разницу между ОЗУ и диском, то персистентность приложений скрадывают отличия между запущенными и выключенными процессами.

Очень примитивная и ненадёжная форма персистентности приложений имеется в iOS и других современных мобильных системах, которые без участия пользователя завершают работу неактивных приложений, чтобы сэкономить память или заряд батареи. Ту же цель преследует функция Resume, появившаяся в последней версии Mac OS X. И в том и в другом случае роль системы сводится к тому, что перед закрытием приложения она передаёт ему сообщение, призывающее сохранить текущее состояние и приготовиться к немедленному отключению. Как реагировать на это сообщение, решают разработчики приложения.

Это очень простой и экономичный метод, но он терпим лишь до тех пор, пока конкуренты не реализовали полноценную персистентность приложений. Тогда Apple придётся снова перестраивать внутренности системы, а перестраивать, как известно, нередко труднее, чем строить с нуля. Пятнадцать лет назад подобная перестройка завела оригинальную Mac OS в такой тупик, что выбираться из него пришлось путём приобретения другой операционной системы – NeXTstep.

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

В Unix и Windows NT переключением управления между процессами заведует система. Процесс может быть в любой момент остановлен, уничтожен и так далее.

Сейчас та же история повторяется с персистентностью приложений. И iOS, и OS X Lion пытаются сохранять состояние приложений, но вместо того, чтобы сделать это самостоятельно, они опять устраивают “кооперацию”. Приложения должны сами сохранять своё состояние и сами восстанавливать его, пользуясь специальными программным интерфейсом. Если приложение не справляется с этим, то никакой персистентности не выходит – данные теряются.

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

На ранних скриншотах OS X Lion у приложений нет индикации состояния (запущено или нет). Все программы должны были просто работать. Но фокус не удался - теперь даже на apple.com показывают огоньки под значками

Можно, конечно, винить разработчиков приложений в лени, но это бессмысленно. Порочен сам подход. О персистентности данных, как и о многозадачности, должна заботиться система, а не чужой программист. Причина, по которой этого не происходит, в современных системах Apple и в оригинальной Mac OS одна и та же: система изначально разрабатывалась под железо, которого “не хватало” для того, чтобы сделать правильно.

Классическая Mac OS разрабатывалась в начале восьмидесятых, когда даже шестнадцатиразрядные процессоры считались роскошью. Но к середине девяностых железо, вполне пригодное для полноценной реализации многозадачности, было распространено повсеместно, Mac OS же осталась прежней. Windows 95 с вытесняющей многозадачностью превосходила устаревающую систему Apple во всех отношениях. Проект Copeland, цель которого состояла в том, чтобы устранить отставание, продолжался несколько лет, но так ничем и не закончился. Десять лет форы не помогли, а наоборот, помешали Apple.

Очень вероятно, что история повторится. Рано или поздно кто-нибудь, безнадёжно отстающий (и потому не связанный по рукам и ногам старыми наработками), сделает всё как надо, а не как было можно несколько лет назад – и Apple опять окажется в глубоком тылу. iOS и Mac OS X – сложные системы с множеством тонкостей и особенностей. Не в последнюю очередь важно, что на эти особенности ориентируются разработчики приложений. И выпутаться из всего того, что было нагорожено за последние три года, окажется не так легко.

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

Ещё один вариант, дающий гарантированный результат, – поддержка персистентности на уровне ядра операционной системы. Об этом уже думают, к примеру, в Microsoft, работая над ядром Singularity. Над похожей системой работает и наш соотечественник Дмитрий Завалишин.

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