Введение
Операционная система IBM в реальном времени Transaction Processing Facility (TPF) – это операционная система IBM в реальном времени для мейнфреймов, произошедшая от семейства IBM System/360, включая zSeries и System z9. TPF обеспечивает быструю, высокопроизводительную обработку больших объемов транзакций, справляясь с непрерывными нагрузками, состоящими в основном из простых транзакций, в крупных и географически распределенных сетях. Хотя существуют и другие надежные системы обработки транзакций, такие как CICS и IMS от IBM, TPF специализируется на обработке экстремально больших объемов, поддержке большого количества одновременных пользователей и обеспечении очень быстрого времени отклика. Например, TPF используется для обработки транзакций по кредитным картам VISA в период пиковых праздничных продаж. Близкий по архитектуре к TPF монитор транзакций ALCS был разработан IBM для интеграции сервисов TPF с более распространенной операционной системой мейнфреймов MVS, теперь z/OS.
Transaction Processing Facility (TPF) is an IBM real time operating system for mainframe computers descended from the IBM System/360 family, including zSeries and System z9. TPF delivers fast, high volume, high throughput transaction processing, handling large, continuous loads of essentially simple transactions across large, geographically dispersed networks. While there are other industrial strength transaction processing systems, notably IBM's own CICS and IMS, TPF's specialty is extreme volume, large numbers of concurrent users, and very fast response times. For example, it handles VISA credit card transaction processing during the peak holiday shopping season. A close cousin of TPF, the transaction monitor ALCS, was developed by IBM to integrate TPF services into the more common mainframe operating system MVS, now z/OS.
История
TPF выросла из программы управления авиалиниями (ACP) – бесплатного пакета, разработанного в середине 1960-х годов компанией IBM в сотрудничестве с крупными североамериканскими и европейскими авиакомпаниями. В 1979 году IBM представила TPF как замену ACP, а также как коммерческий программный продукт. Новое название отражает расширение области ее применения и эволюцию в организации, не связанные с авиационной отраслью. Традиционно TPF была средой программирования на ассемблере IBM System/370, что обусловлено требованиями к производительности, и многие приложения на ассемблере TPF до сих пор используются. Однако, более поздние версии TPF стимулируют использование языка C. Другой язык программирования, SabreTalk, был создан и прекратил свое существование на платформе TPF. Компания IBM объявила о выпуске текущей версии TPF, получившей название z/TPF V1.1, в сентябре 2005 года. Наиболее важным нововведением z/TPF является поддержка 64-битной адресации и обязательное использование 64-битных инструментов разработки GNU. Компилятор GCC и DIGNUS Systems/C++ и Systems/C – единственные поддерживаемые компиляторы для z/TPF. Компиляторы Dignus позволяют минимизировать изменения исходного кода при переходе с TPF 4.1 на z/TPF.
Пользователи
Текущие пользователи включают Sabre (бронирования), VISA Inc. (авторизации), American Airlines, American Express (авторизации), DXC Technology SHARES (бронирования), Amtrak, Marriott International, Travelport (Galileo, Apollo, Worldspan), Citibank, Trenitalia (бронирования), Delta Air Lines (бронирования и операционная деятельность) и Japan Airlines.
Плотная связь
Хотя IBM 3083 был разработан для запуска TPF на "быстром однопроцессорном устройстве", TPF способен работать и на многопроцессорной системе, то есть на системах с более чем одним процессором. В среде LPAR процессоры именуются потоками инструкций или просто I-потоками. При запуске TPF на LPAR с несколькими I-потоками говорят, что TPF работает в режиме плотной связи. TPF соответствует концепциям SMP; разделения памяти на основе NUMA не существует. Глубина очереди готовых процессоров определяется при получении каждой входящей транзакции и помещается в очередь для I-потока с наименьшей загрузкой, обеспечивая тем самым непрерывное балансирование нагрузки между доступными процессорами. В случаях, когда слабосвязанные конфигурации состоят из многопроцессорных CPC (Центральный вычислительный комплекс, то есть физическая машина, заключенная в один системный шкаф), SMP происходит внутри CPC, как описано здесь, а совместное использование меж-CPC ресурсов осуществляется в соответствии с описанием в разделе "Слабосвязанные конфигурации", представленном ниже. В архитектуре TPF вся память (за исключением префиксной области размером 4 КБ) совместно используется всеми I-потоками. Если данные, находящиеся в памяти, должны или предпочтительно храниться раздельно для каждого I-потока, программист обычно выделяет область хранения, разделенную на подсекции, количество которых равно числу I-потоков, а затем обращается к нужной области I-потока, используя базовый адрес выделенной области и добавляя к нему произведение относительного номера I-потока на размер каждой подсекции.
Свободно сцепленные
TPF способен поддерживать несколько мейнфреймов (любого размера – от одного потока I до нескольких потоков I), подключающихся и работающих с общей базой данных. В настоящее время 32 мейнфрейма IBM могут совместно использовать базу данных TPF; если бы такая система была в эксплуатации, она называлась бы 32-way loosely coupled. Самая простая система с гибкой связью состояла бы из двух мейнфреймов IBM, совместно использующих одно DASD (устройство хранения с прямым доступом). В этом случае управляющая программа была бы загружена в память одинаково, и любой из мейнфреймов мог бы потенциально получить доступ к любой программе или записи на DASD. Для последовательной обработки доступа к записям данных в системе с гибкой связью необходимо использовать механизм блокировки записей. Это означает, что когда один процессор мейнфрейма получает доступ к записи, механизм должен предотвратить доступ к ней со стороны всех остальных процессоров и уведомить запрашивающие процессоры о том, что они находятся в ожидании. В любой системе с тесной связью это легко управлять между потоками I с помощью таблицы хранения блокировок записей. Однако, когда блокировка получается не на процессоре TPF, а в блоке управления DASD, необходимо использовать внешний процесс. Исторически блокировка записей осуществлялась в блоке управления DASD с помощью RPQ, известного как LLF (Limited Locking Facility), а затем ELLF (расширенный). LLF и ELLF были заменены Multipathing Lock Facility (MPLF). Для запуска кластеризованного (с гибкой связью) z/TPF требуется либо MPLF во всех блоках управления дисками, либо альтернативное блокирующее устройство, называемое Coupling Facility.
Общие записи процессора
Записи, которые обязательно должны управляться механизмом блокировки, – это записи, совместно используемые несколькими процессорами. В TPF большинство обращений к записям осуществляется по типу записи и порядковому номеру. Если в системе TPF существует тип записи 'FRED', содержащий 100 записей или порядковых номеров, то в схеме совместного использования процессорами запись типа 'FRED' с порядковым номером '5' будет однозначно соответствовать одному и тому же адресу файла на DASD, что и требует использования механизма блокировки. Все совместно используемые записи в системе TPF будут обращаться к одному и тому же адресу файла, который будет указывать на одно и то же местоположение.
Уникальные записи процессора
Уникальная запись процессора определяется так, что каждый процессор, который предполагается включенным в слабосвязанный комплекс, имеет тип записи "FRED" и, возможно, 100 порядковых номеров. Однако, если пользователь на любом из двух или более процессоров проверит адрес файла, соответствующий типу записи "FRED" и порядковому номеру "5", он обнаружит, что используется отличный физический адрес.
Что такое ТПФ и чем он не является
TPF не является операционной системой общего назначения. Специализированная роль TPF заключается в обработке входящих сообщений транзакций и последующем возврате выходных сообщений в соотношении 1:1 с чрезвычайно высокой скоростью и строгими ограничениями по времени выполнения. TPF не имеет встроенной функциональности графического пользовательского интерфейса и никогда не предлагал средств прямого графического отображения: реализация такой функциональности на хосте была бы признана ненужным и потенциально вредным использованием ресурсов системы реального времени. Пользовательский интерфейс TPF управляется командной строкой с использованием простых текстовых терминалов, отображающих информацию последовательно сверху вниз, и не предусматривает курсоры, окна или значки, управляемые мышью, в TPF Prime CRAS (комплекс программ обслуживания вычислительного зала, который лучше всего рассматривать как "консоль оператора"). Текстовые сообщения предназначены для взаимодействия с пользователями-людьми. Вся работа выполняется посредством командной строки, аналогичной UNIX без X Window System. Существует ряд продуктов, подключаемых к Prime CRAS и предоставляющих оператору TPF функции графического интерфейса, например, TPF Operations Server. Графические интерфейсы для конечных пользователей, при необходимости, должны обеспечиваться внешними системами. Эти системы анализируют текстовое содержимое (см. Screen scrape) и преобразуют сообщения в требуемый графический формат и обратно, в зависимости от контекста. Будучи операционной системой специализированного назначения, TPF не содержит компилятора/ассемблера, текстового редактора и не реализует концепцию рабочего стола, привычную для операционных систем общего назначения. Исходный код приложений TPF обычно хранится во внешних системах и компилируется "оффлайн". Начиная с z/TPF 1.1, Linux является поддерживаемой платформой для сборки; исполняемые программы, предназначенные для работы в z/TPF, должны соответствовать формату ELF для s390x IBM Linux. Для работы с TPF необходимо знание его Руководства по командам, поскольку отсутствует поддержка онлайн-справочника команд или системы помощи в стиле "man", к которым привыкли пользователи. Команды, разработанные и поставляемые IBM для системного администрирования TPF, называются "функциональными сообщениями" и обычно именуются "Z-сообщениями", поскольку все они начинаются с буквы "Z". Другие буквы зарезервированы для того, чтобы клиенты могли создавать собственные команды. TPF реализует отладку в распределенной клиент-серверной архитектуре, что обусловлено беспроцессорной, многопроцессорной природой системы: приостановка всей системы для перехвата одной задачи была бы крайне неэффективной. Пакеты отладчиков были разработаны сторонними поставщиками, которые использовали различные подходы к операциям "разрыв/продолжение", необходимым на хосте TPF, реализуя уникальные протоколы связи, используемые при обмене данными между разработчиком, запускающим клиент отладчика, и сервером отладки, а также определяя форму и функциональность операций программы отладки на стороне клиента. Два примера пакетов отладчиков сторонних разработчиков – Step by Step Trace от Bedford Associates и CMSTPF, TPF/GI и zTPFGI, все от TPF Software, Inc. Ни один из этих пакетов не полностью совместим друг с другом или с собственным предложением IBM. Клиентская часть отладчика IBM поставляется в составе интегрированной среды разработки (IDE) под названием IBM TPF Toolkit.
Что такое TPF
TPF обладает высокой оптимизацией, позволяющей сообщениям из поддерживаемой сети либо переключаться на другое местоположение, либо направляться в приложение (определенный набор программ), либо обеспечивать чрезвычайно эффективный доступ к записям базы данных.
Записи данных
Исторически все данные в системе TPF должны были помещаться в фиксированные записи (и блоки памяти) размером 381, 1055 и 4K байт. Это было частично обусловлено физическими размерами блоков записей на DASD. Значительная экономия достигалась за счет освобождения операционной системы от необходимости разбивать большие объемы данных на более мелкие при операциях с файлами и последующей сборки при чтении. Поскольку аппаратное обеспечение IBM осуществляет ввод/вывод через каналы и канальные программы, TPF генерировал очень небольшие и эффективные канальные программы для операций ввода/вывода – все ради скорости. В первые годы также большое значение придавалось размеру носителей информации – будь то память или диски, поэтому приложения TPF развивались, выполняя сложные задачи при минимальном использовании ресурсов. Сегодня многие из этих ограничений сняты. Фактически, записи размером менее 4K все еще используются только для обеспечения обратной совместимости. Благодаря прогрессу в технологии DASD, чтение/запись 4K записи так же эффективна, как и 1055-байтовой записи. Те же достижения увеличили емкость каждого устройства, поэтому больше нет необходимости максимально плотно упаковывать данные.
Программы и резидентство
TPF также имел свои сегменты программ, выделенные в виде записей размером 381, 1055 и 4K байт на разных этапах своей истории. Каждый сегмент состоял из одной записи; при этом типичное комплексное приложение могло требовать десятков или даже сотен сегментов. В течение первых сорока лет существования TPF эти сегменты никогда не подвергались линковке. Вместо этого, перемещаемый объектный код (непосредственный вывод ассемблера) размещался в памяти, его внутренние (самореферентные) перемещаемые символы разрешались, а затем весь образ записывался в файл для последующей загрузки в систему. Это создало сложную среду программирования, в которой сегменты, связанные друг с другом, не могли напрямую обращаться друг к другу, а передача управления между ними осуществлялась посредством системной службы ENTER/BACK. В первые годы существования ACP/TPF (около 1965 года) объем памяти был строго ограничен, что привело к разграничению между программами, резидентными в файлах, и программами, резидентными в памяти: только наиболее часто используемые прикладные программы записывались в память и никогда не удалялись (резидентность в памяти); остальные хранились в файле и загружались по требованию, при этом их буферы резервной памяти освобождались после выполнения. Введение языка C в TPF в версии 3.0 изначально было реализовано в соответствии с сегментными соглашениями, включая отсутствие линковки. Эта схема быстро показала свою непрактичность для чего-либо, кроме самых простых программ на C. В TPF 4.1 были представлены полноценные связанные загрузочные модули для TPF. Они компилировались с помощью компилятора z/OS C/C++ с использованием специфичных для TPF файлов заголовков и связывались с помощью IEWL, в результате чего получался загрузочный модуль, соответствующий стандартам z/OS, который ни в коем случае нельзя было считать традиционным сегментом TPF. Загрузчик TPF был расширен для чтения уникального формата файла загрузочного модуля z/OS, а затем для размещения разделов загрузочных модулей, резидентных в файлах, в памяти; в то же время программы на языке ассемблера оставались ограниченными сегментной моделью TPF, что создавало очевидное различие между приложениями, написанными на ассемблере, и приложениями, написанными на языках высокого уровня (HLL). В z/TPF 1.1 все типы исходного языка были концептуально унифицированы и полностью подверглись линковке в соответствии со спецификацией ELF. Концепция сегмента устарела, что означает, что любая программа, написанная на любом исходном языке, включая Assembler, теперь может быть любого размера. Кроме того, стали возможны внешние ссылки, и отдельные программы исходного кода, которые когда-то были сегментами, теперь могли быть напрямую связаны друг с другом в общий объект. Важным моментом является то, что критически важные устаревшие приложения могут получить выгоду от повышения эффективности за счет простой переупаковки: вызовы, выполняемые между членами одного общего объектного модуля, теперь имеют значительно меньшую длину пути во время выполнения по сравнению с вызовом системной службы ENTER/BACK. Члены одного и того же общего объекта теперь могут напрямую совместно использовать записываемые области данных благодаря функциональности копирования при записи, также представленной в z/TPF 1.1; что, в свою очередь, усиливает требования TPF к повторному входу. Концепции резидентности в файле и в памяти также устарели в связи с конструкторским решением z/TPF, которое стремилось к тому, чтобы все программы постоянно находились в памяти. Поскольку z/TPF должен был поддерживать стек вызовов для программ на языках высокого уровня, что позволяло программам HLL использовать распределение памяти на основе стека, было признано целесообразным расширить стек вызовов для программ на языке ассемблера на необязательной основе, что может снизить нагрузку на память и упростить рекурсивное программирование. Все исполняемые программы z/TPF теперь упаковываются как общие объекты ELF.
Использование памяти
Исторически, как и предыдущие основные блоки, блоки памяти также имели размер 381, 1055 и 4 КБ. Поскольку все блоки памяти должны были быть именно такого размера, большая часть накладных расходов на выделение памяти, характерных для других систем, была исключена. Программисту достаточно было определить, какой размер блока соответствует его потребностям и запросить его. TPF поддерживал список используемых блоков и просто выдавал первый доступный блок из этого списка. Физическая память была разделена на секции, зарезервированные для каждого размера, поэтому блок размером 1055 байт всегда выделялся из соответствующей секции и возвращался обратно, а единственной накладной операцией было добавление его адреса в список таблицы физических блоков. Сжатие или сборка мусора не требовались. С ростом сложности приложений и увеличением требований к памяти, а также с появлением языка C, возникла потребность в блоках памяти переменного или большого размера. Это привело к использованию динамической памяти (heap) и некоторых подпрограмм управления памятью. Для снижения накладных расходов память TPF была разбита на фреймы размером 4 КБ (1 МБ в z/TPF). Если приложению требуется определенное количество байт, ему предоставляется необходимое количество последовательных фреймов.