Несовместимость программного обеспечения — это характеристика компонентов или систем программного обеспечения , которые не могут удовлетворительно работать вместе на одном компьютере или на разных компьютерах, связанных компьютерной сетью . Это могут быть компоненты или системы, которые предназначены для совместной или независимой работы. Совместимость программного обеспечения — это характеристика компонентов или систем программного обеспечения, которые могут удовлетворительно работать вместе на одном компьютере или на разных компьютерах, связанных компьютерной сетью. Возможно, что некоторые компоненты или системы программного обеспечения могут быть совместимы в одной среде и несовместимы в другой.
Рассмотрим последовательные программы вида:
Запросить ресурс АЗапросить ресурс BВыполнить действие, используя A и BОсвободить ресурс BОсвободить ресурс А
Конкретная программа может использовать принтер (ресурс A) и файл (ресурс B) для печати файла.
Если несколько таких программ P1,P2,P3 ... работают одновременно, то первая из них, которая выполнится, заблокирует остальные , пока не освободятся ресурсы, и программы будут выполняться по очереди. Не будет никаких проблем. Не имеет значения, используется ли однопроцессорная или многопроцессорная система , поскольку именно распределение ресурсов определяет порядок выполнения.
Однако следует отметить, что программисты , как правило, не обязаны писать программы определенным образом, или даже если есть какие-то рекомендации, то некоторые из них могут отличаться от рекомендаций. Вариант предыдущей программы может быть таким:
Запросить ресурс BЗапросить ресурс АВыполнить действие, используя A и BОсвободить ресурс АОсвободить ресурс B
Ресурсы A и B те же самые, что и в предыдущем примере, а не просто фиктивные переменные , так как в остальном программы идентичны.
Как и прежде, если есть несколько таких программ, Q1, Q2, Q3, которые работают одновременно, используя ресурсы, как и прежде, то проблем не возникнет.
Однако, если несколько P настроены на запуск в то же время, что и несколько Q, может возникнуть тупиковая ситуация. Обратите внимание, что тупиковая ситуация не обязательно должна возникнуть, но может возникнуть.
P: Запрос ресурса AВ: Запрос ресурса BВ: Запрос ресурса A (заблокирован P)P: Запрос ресурса B (заблокирован Q)...
Теперь ни P, ни Q не могут продолжить 1 .
Это один из примеров того, как программы могут демонстрировать несовместимость.
Другим примером иного рода может быть ситуация, когда один программный компонент предоставляет услугу другому. Несовместимость может быть такой простой, как изменение порядка параметров между программным компонентом, запрашивающим услугу, и компонентом, предоставляющим услугу. Это будет своего рода несовместимость интерфейса . Это может считаться ошибкой , но ее может быть очень трудно обнаружить в некоторых системах. Некоторые несовместимости интерфейса можно легко обнаружить на этапе сборки , особенно для строго типизированных систем, другие могут быть трудно обнаружить и могут быть обнаружены только во время выполнения , в то время как другие могут быть почти невозможно обнаружить без детального анализа программы.
Рассмотрим следующий пример:
Компонент P вызывает компонент Q с параметрами x и y. Для этого примера y может быть целым числом.
Q возвращает f(x), что является желаемым и никогда не равно нулю, и игнорирует y.
Вариант Q, Q' имеет похожее поведение, но имеет следующие отличия:
если y = 100, то Q' не заканчивается.
Если P никогда не вызывает Q с y, установленным на 100, то использование Q' вместо этого является совместимым вычислением . Однако если P вызывает Q с y, установленным на 100, то использование Q' вместо этого приведет к незавершающемуся вычислению.
Если далее предположить, что f(x) имеет числовое значение, то компонент Q'' определяется как:
Q'' ведет себя как Q, за исключением того, что если y = 100, то Q'' не заканчивается если y = 101, то Q'' возвращает 0,9 * f(x) если y = 102, то Q'' возвращает случайное значение если y = 103, то Q'' возвращает 0.
может вызвать проблемное поведение. Если P теперь вызывает Q'' с = 101, то результаты вычислений будут неверными, но не могут вызвать сбой программы. Если P вызывает Q'' с y = 102, то результаты непредсказуемы, и может возникнуть сбой , возможно, из-за деления на ноль или других ошибок, таких как арифметическое переполнение . Если P вызывает Q'' с y = 103, то в случае, если P использует результат в операции деления, то может произойти сбой деления на ноль.
Этот пример показывает, как одна программа P1 может быть всегда совместима с другой Q1, но могут быть построены другие программы Q1' и Q1'' таким образом, что P1 и Q1' иногда несовместимы, а P1 и Q1'' всегда несовместимы.
Иногда программы P и Q могут работать на одном компьютере, и наличие одной из них будет подавлять производительность другой. Это может произойти, в частности, когда компьютер использует виртуальную память . Результатом может быть перегрузка диска , и одна или обе программы будут иметь значительно сниженную производительность. Такая форма несовместимости может возникнуть, если P и Q должны сотрудничать, но может также возникнуть, если P и Q совершенно не связаны, но просто запускаются одновременно. Примером может быть, если P — это программа, которая создает большие выходные файлы, которые случайно хранятся в основной памяти , а Q — это антивирусная программа, которая сканирует множество файлов на жестком диске. Если кэш памяти используется для виртуальной памяти, то возможно неблагоприятное взаимодействие двух программ, и производительность каждой из них будет резко снижена.
Для некоторых программ P и Q их совместимость производительности может зависеть от среды, в которой они запущены. Они могут быть существенно несовместимы, если они запущены на компьютере с ограниченной основной памятью, однако их можно удовлетворительно запустить на машине с большим объемом памяти. Некоторые программы могут быть несовместимы по производительности практически в любой среде.