Психономика
Каждому компьютерщику знаком авторитарный стиль вездесущей номенклатуры: стоит кому-то заделаться хоть минимальным начальством — у него в голове происходит фазовый сдвиг, и все происходящее во Вселенной выстраивается под одну доминирующую потребность. Такой мини-, макси-, или мега-босс требует от якобы подчиненных беспрекословного выполнения начальственных указаний, немедленного удовлетворения любых прихотей. Разумеется, ни о каком ожидании речи быть не может: все нужно не сходя с места и прямо сейчас. Любимое словечко всякого руководства — "срочно". Дескать, я сейчас хочу. А буду ли хотеть через энное время — неизвестно.
Разумеется, относится это не только к компьютерному хозяйству. Это болезнь классовой экономики как таковой. Когда все равно заинтересованы в труде на общее благо, никому и в голову не придет работать локтями и пропихивать свои задачи в ранг приоритетных. Но когда за непослушание могут уволить с волчьим билетом — приходится делать поправку на бесноватость, и начинается вульгарное затыкание дыр: экстремальное программирование, заплаточное администрирование, наращивание вычислительных мощностей и уплотнение коммуникаций, и т. д. — полный букет производственных авралов. Иногда поиски путей выживания порождают новые технологические решения. От этого господа еще больше надувают щеки и провозглашают: вот, видите, какая от нас польза! Ущерб жизненным интересам и здоровью персонала в расчет можно не принимать.
Архитектура компьютерных систем во многом копирует классовое устройство общества. Однако на ранних этапах развития надо было еще и вписаться в собственно технологические ограничения, и это создавало своеобразную зону безопасности для инженеров, программистов и сисадминов: обосновать конкретную реализацию можно было, ссылаясь на недоразвитость техники, — и неумеренные аппетиты руководству приходилось переводить в другое русло, перекладывать проблему на другие плечи. Сейчас такой номер не пройдет: практически все технические ограничения в компьютерной области отменены, и любой запрос принципиально выполним — за соответствующие деньги. Стремительный рост компьютерной образованности создает ту самую "резервную армию труда", из которой черпают дешевые мозги, и куда продвинутому айтишнику никак не хочется попасть. Приходится изворачиваться. Изобретать технологии адекватного реагирования. В том числе, в области архитектуры.
Как известно, традиционная парадигма машины Тьюринга предполагает переработку ресурсов (данных) и производство чего-то еще по некоторому алгоритму. Не принципиально, будет обработка последовательной или параллельной, локализованной или распределенной, дискретной или аналоговой, детерминированной или стохастической. В итоге должно получиться то, что можно предъявить заказчику и потребовать причитающихся за работу знаков стоимости. Часть результата каждой операции может быть конвертирована в данные. Другая часть встраивается в алгоритм работы (включая аппаратные решения). Остальное — непроизводительное потребление, издержки производства (хотя заказчику именно это важнее всего).
Поскольку возможности машины ограниченны (а это предполагается самим актом выделения ее из окружающей среды), поток запросов на обработку данных приходится регулировать. Скорость подачи данных должна соответствовать скорости их переработки. Дикому капиталисту объяснить это почти невозможно: он же хозяин — а рабы должны исполнять приказы. Для смягчения противоречий вводят буферные устройства, которые в реальной жизни называются управленческим персоналом, а в компьютерной индустрии — очередями. На эту тему вариаций — немеряно. Два древнейших архитектурных решения: FIFO (first in first out) и LIFO (last in first out). То есть, в первую очередь выполняем либо то, что раньше заказали — либо актуальное на данный момент (стековая организация). Начальство, конечно, знает только второй вариант. Для каждого начальника его приказ — главнее всех. Дали команду — тут же начинайте выполнять, а все остальное побоку. Армейские уставы устроены по тому же принципу — хотя подчиненный обязан предупредить начальника о наличии указаний от вышестоящей инстанции. Однако приоритет стековой обработки в компьютерных системах неизбежно приводит к неприятным последствиям: если не разгребать завалы, стек переполняется, и система подвисает. Нужны радикальные решения, перезагрузка. В рыночной экономике это называется кризисом. И решения не менее радикальны: море крови и груды костей.
Очередь FIFO с точки зрения кризисов намного благополучнее: мы просто пропускаем мимо ушей запросы, которые переполняют очередь, — и спокойно обрабатываем то, что уже успели принять. Среда вынуждена регулироваться сама; многие запросы устаревают к моменту, когда в очереди появилось для них местечко. Однако начальству очень не по душе, когда приходится прикручивать аппетиты. С другой стороны, бывает и объективная необходимость по-настоящему срочных мер, откладывать которые на потом — себе дороже. Как быть?
Заметим, что распараллеливание машины Тьюринга не дает существенного выигрыша в части оперативности обработки. Растет быстродействие — но очередь-то на всех одна, и появляются накладные расходы: синхронизация потоков, разграничение доступов, обработка конфликтов, агрегирование результатов и т. д. То есть, решать каждую задачу в отдельности мы можем быстрее — а система в целом все равно буксует.
Естественный ход — переход к архитектуре с несколькими очередями. Например, при критическом заполнении стека можно отправлять запросы в очередь FIFO. Здесь есть свои заморочки — но в целом станет легче дышать. Еще спокойнее — иерархический вариант FIFO, когда поступающие задачи сразу сортируются по приоритетам, и есть очередь в режиме ожидания (pending), есть очередь регламентных процедур, есть очередь срочных задач, очередь супер-срочных, очередь жизненно важных (критических) и т. д. Исполнитель (какой угодно архитектуры) выбирает задания из этой иерархической очереди по определенному правилу. Алгоритмы можно выстраивать в зависимости от обстановки — однако в любом случае проблем с начальством уже нет: на любой запрос можно сообщить о постановке задания в очередь; если начальник скажет: еще быстрее, — прекрасно, сообщаем о переводе в очередь более приоритетных задач. Тонкость в том, что далеко не всегда срочные задачи выполняются раньше низкоприоритетных — но начальство-то об этом не знает!
Действительно, посмотрим на простейшую логику обработки иерархических очередей — технику мультиплексирования в потоках типа FIFO. Приоритетным очередям выделяется больше временных слотов (тактов выборки) или больший процент общей полосы пропускания. Однако необходимость выполнения менее приоритетных задач никто не отменял, и они вклиниваются в поток срочных дел, в пределах отведенной квоты. Тем самым вся система постоянно на ходу, и не застревает ни в одном из звеньев. Допустим, один слот регулярных задач приходится на 3 слота срочных. Тогда каждая четвертая операция — низкоприоритетная. Если в срочной очереди 10 заданий — семь из них однозначно выполнятся после первого в неприоритетной очереди. То есть, наш исполнитель лишь предрасположен обрабатывать срочные задачи в первую голову — но вовсе не обязательно будет поступать именно так.
Иерархическая очередь эффективно соответствует введению еще двух промежуточных звеньев между заказчиком и исполнителем: сортировщик запросов и обработчик очередей. Найти соответствие этим уровням в производственной сфере — несложное упражнение для заинтересованного собеседника. Однако в реальной жизни существенна неоднородность экономических потоков: сейчас заказов полно — через месяц их совсем нет, приоритеты меняются на каждом шагу, по итогам работы. Соответственно, производственные мощности могут быть либо заняты под завязку — либо недогружены. Какие-то из уровней очереди переполнены — другие пустуют. Эффективное мультиплексирование требует гибких алгоритмов с динамическим распределением слотов. С другой стороны, исполнитель в большинстве случаев отнюдь не элементарен, и его внутренние состояния будут влиять на порядок работы. Кроме того задания на практике оказываются взаимозависимыми, и каждое следует обрабатывать с оглядкой на другие. Например, банк получил распоряжение оплатить счет — но, пока это задание ждет своей очереди, вступает в силу закон, запрещающий перевод средств между указанными счетами, — и поставленную в очередь задачу приходится обрабатывать иначе (отказ вместо исполнения). Возможна тонкая игра на приоритетах обработки распоряжений — и платеж пойдет, если реализация запрета по каким-то причинам запоздает. Этот трюк нам хорошо известен из истории; он всесторонне обыгран в литературе, особенно детективной направленности.
Другой пример: всякая операция требует определенных ресурсов; если необходимых предпосылок нет на момент выборки задания из очереди, исполнитель бессилен — и надо ставить задание в другую очередь, и здесь тоже возможны разные алгоритмические решения.
Таким образом, как помещение задания в очередь, так и выборка очередного задания чаще всего производятся не единообразно, а в зависимости от ситуации. В частности, порядок выборки заданий очереди может быть изменен. Такую очередь можно было бы назвать CICO (conditional in conditional out). Массовое применение этого принципа в экономике ("CICO-номика", или, в соответствии с английским произношением, "психономика") не меняет ее рыночной основы, однако регулируемость и стабильность каждой относительно замкнутой хозяйственной системы будет значительно выше. Понятно, что глобальная экономика требует столь же глобальной психономики. В общем случае, иерархичность очереди должна соответствовать масштабам экономических проектов; например, экспансия человечества в космос на каком-то этапе потребует согласования планетарных приоритетов.
Лирическое отступление: при капитализме технологии нужны не для улучшения чего бы то ни было, а для сохранения социального неравенства. Поэтому полноценная психономика здесь попросту невозможна, и можно говорить лишь о частичных реализациях.
Для рядовых программистов, системных администраторов и IT-менеджеров очереди CICO полезны в плане противодействия стрессам и перехода от экстремальности к нормальным производственным отношениям. В любой компании работник "сервисного" подразделения формально оказывается "слугой многих господ". Минимальная формализация множественной "подчиненности" эффективно выводит подчиненного на вершину иерархии, а всем остальным приходится считаться с его манерой работы, которая теперь представляется объективной необходимостью. Эффект особенно важен для работающих во вневедомственных структурах, сервисных службах, юридически независимых от заказчика (хотя экономическую зависимость, конечно же, никто не отменял). Скажем, если сисадмин поддерживает базы данных десятков компаний, он вправе наложить ограничения на использование этих баз — и это можно (при необходимости) оговорить в официальных документах. Не всякую работу мы готовы взять на себя — но если уж взялись, то делаем честно, в соответствии с нашими технологическими возможностями, и давить на нас — никакого смысла.
Особый интерес представляет психономика распределенных процессов. С одной стороны, каждый исполнитель представляет собой относительно замкнутую CICO-систему, выбирая для себя что-то из имеющихся в среде задач и запуская выполнение при наличии необходимых ресурсов. С другой стороны, среда каждого исполнителя — часть среды процесса в целом, с его собственной иерархией ресурсов и приоритетов. Это означает, что постановка задач и порядок их решения на уровне процесса обусловлены возможностями задействованных исполнителей. Простейший пример: поступает глобальный запрос — глобальная очередь структурирует его и рассылает широковещательный запрос исполнителям; если в каком-то звене активного исполнителя нет, запрос отвергается. Если задача уже включена в глобальную очередь, взаимоотношения исполнителей могут принимать разный характер. "Классическая" парадигма — конкурентная (соревновательная) обработка: кто первым захватил задание, тот монополизирует ресурсы и средства производства, и всем остальным надо ждать конца работы. Частный случай — создание рабочих групп ("коллективный исполнитель"). Но есть и альтернативная, "квантовая" архитектура: несколько исполнителей параллельно работают над проблемой, каждый решает ее своим способом — а в итоге есть набор вариантов (путей решения). Заказчику все равно, как именно получен результат. Однако, как и в кантовой физике, бывают нежелательные пути решения ("запрещенные переходы"), и приходится задействовать многоступенчатые схемы.
На практике используют разного рода гибридные архитектуры, когда параллельное развитие допускается на этапе создания прототипов — однако в итоге принимается классическое решение, и работа выстраивается по одной из возможных схем (мистически настроенные физики воспринимают это как "коллапс волновой функции"). Ничего сверхъестественного здесь нет, поскольку, в силу обращаемости иерархий, каждая иерархическая структура может быть свернута и развернута по-другому, в зависимости от того, что в данной ситуации "энергетически выгодно". Речь не идет об абстрактной оптимальности: ни у кого нет желания гоняться за идеалом — достаточно какого-нибудь решения, а жажда совершенства — категория не экономическая. Пока дело движется, пусть даже не совсем так, как хотелось бы, — мало кто будет рисковать готовым ради лишь теоретически возможного. Так психономика, с одной стороны, поддерживает кадровую стабильность, а с другой — создает предпосылки для переосмысления экономической "вертикали": не персонал подчинен хозяину, а наоборот, всякое предприятие существует лишь как совместная деятельность свободных людей.
|