Мобильность программного обеспечения. Платформенно-независимый интерфейс POSIX

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

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

Для написания переносимой программы нужно следовать некоторым правилам. Во-первых, большая часть программы должна быть написана на языке, который имеется на всех системах, на которые планируется в дальнейшем ее переносить. Это, прежде всего, означает, что программа должна быть написана на языке высокого уровня, предпочтительно стандартизованном, на­пример на языке С. Программа, написанная на ассемблере, не является в общем случае переносимой. Во-вторых, важно минимизировать или, если возможно, исключить те части кода, которые непосредственно взаимодействуют с аппарат­ными средствами. Зависимость от аппаратуры может иметь много форм. Неко­торые очевидные формы зависимости включают прямое манипулирование реги­страми и другими аппаратными средствами. Наконец, если аппаратно-зависимый код не может быть полностью исключен, то он должен быть изолирован в не­скольких хорошо локализуемых модулях. Аппаратно-зависимый код не должен быть распределен по всей программе. Например, можно спрятать аппаратно-зави­симую структуру в программно задаваемые данные абстрактного типа. Другие модули программы будут работать с этими данными, а не с аппаратурой, используя набор некоторых функций. Когда ПО переносится, то изменяются только эти данные и функции, которые ими манипулируют.

Введение стандартов POSIX преследовало цель обеспечить переносимость создаваемого программного обеспечения.

POSIX (Portable Operating System Interface for Computer Environments) – платформенно независимый системный интерфейс для компьютерного окружения. Это стандарт IEEE, описывающий системные интерфейсы для открытых опера­ционных систем, в том числе оболочки, утилиты и инструментарии. Помимо этого, согласно POSIX, стандартизированными являются задачи обеспечения безопасности, задачи реального времени, процессы администрирования, сетевые функции и обработка транзакций. Стандарт базируется на UNIX-системах, но допускает реализацию и в других ОС.

POSIX возник как попытка всемирно известной организации IEEE (Institute of Electrical and Electronical Engineers – американский Институт инженеров по электротехнике и радиоэлектронике) пропаганди­ровать переносимость приложений в UNIX-средах путем разработки абстракт­ного, платформенно-независимого стандарта. Однако POSIX не ограничивается только UNIX-системами; существуют различные реализации этого стандарта в системах, которые соответствуют требованиям, предъявляемым стандартом IEEE Standard 1003.1-1990 (POSIX.1). Например, известная ОС реального времени QNX соответствует спецификациям этого стандарта, что облегчает перенос приложе­ний в эту систему, но UNIX-системой не является ни в каком виде, ибо ее архи­тектура использует абсолютно иные принципы.

Этот стандарт подробно описывает VMS (virtual memory system, систему вирту­альной памяти), многозадачность (МРЕ, multiprocess executing) и технологию переноса операционных систем (CTOS). Таким образом, на самом деле POSIX представляет собой множество стандартов, именуемых POSIX.1 – POSIX.12.

В табл. 4.1 приведены основные направления, описываемые данными стандар­тами. Следует также особо отметить, что POSIX.1 предполагает язык С как ос­новной язык описания системных функций API.

Таким образом, программы, написанные с соблюдением данных стандартов, будут одинаково выполняться на всех POSIX-совместимых системах. Однако стандарт в некоторых случаях носит лишь рекомендательный характер. Часть стандартов описана очень строго, тогда как другая часть только поверхностно раскрывает основные требования. Нередко программные системы заявляются как POSIX-совместимые, хотя таковыми их назвать нельзя. Причины кроются в формально­сти подхода к реализации POSIX-интерфейса в различных ОС. На рис. 4.2 изо­бражена типовая схема реализации строго соответствующего POSIX приложе­ния.

Рис. 4.2. Приложения, строго соответствующие стандарту POSIX

 

Из рис. 4.2 видно, что для взаимодействия с операционной системой программа использует только библиотеки POSIX.1 и стандартную библиотеку RTL языка С, в которой возможно использование лишь 110 различных функций, также опи­санных стандартом POSIX.1.

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

Реализации POSIX API на уровне операционной системы различны. Если UNIX-системы в своем абсолютном большинстве изначально соответствуют специфи­кациям IEEE Standard 1003.1-1990, то WinAPI не является POSIX-совместимым. Однако для поддержки данного стандарта в операционной системе MS Win­dows NT введен специальный модуль поддержки POSIX API, работающий на уровне привилегий пользовательских процессов. Данный модуль обеспечивает конвертацию и передачу вызовов из пользовательской программы к ядру систе­мы и обратно, работая с ядром через WinAPI. Прочие приложения, написанные с использованием WinAPI, могут передавать информацию POSIX-приложениям через стандартные механизмы потоков ввода/вывода (stdin, stdout).