В этой статье вместе с техническим экспертом Ауриги Владимиром Суворовым рассказываем о переносе программ на С++ из Windows в Linux. Эта тема включает в себя ряд особенностей, которые будут особенно актуальны для разработчиков, занимающихся портированием приложений. Мы рассмотрим основные различия между Windows и Linux в контексте работы с потоками, а также предоставим рекомендации по выбору библиотек в зависимости от задач проекта.
Поехали!
Для чего нужен перенос программ на Linux?
Миграция на Linux может быть необходима для обеспечения стабильности и непрерывной работы инфраструктуры компаний, особенно в ситуациях, когда становится сложнее продлить или приобрести новые лицензии и получить техническую поддержку от вендоров.
Типы многозадачности
Windows поддерживает два типа многозадачности: преемственную (preemptive multitasking) и кооперативную (cooperative multitasking). В преемственной многозадачности операционная система равномерно распределяет время процессора между потоками, переключая контексты выполнения. В кооперативной многозадачности каждый поток должен явно передавать управление другим потокам. Linux использует только преемственную многозадачность.
Процессы
В операционной системе Windows процессы более изолированы друг от друга благодаря использованию отдельных адресных пространств. При этом каждый поток имеет собственный стек и уровень приоритета выполнения. Кроме того, в Windows существует понятие «фибров», которые являются легковесными потоками и используют стеки других потоков.
В операционной системе Linux также обеспечивается изоляция процессов путем выделения каждому процессу своего собственного адресного пространства. Многопоточность в Linux реализована на уровне библиотеки, при этом ядро операционной системы предоставляет механизмы для управления потоками и распределения ресурсов. В Linux также существуют «процессы-потомки», которые создаются родительским процессом и имеют свои собственные адресные пространства. Это позволяет процессу-предку создавать и управлять отдельными процессами, которые могут выполнять свои задачи независимо друг от друга.
Кроссплатформенные библиотеки для работы с потоками
Как это работает: при переносе программы из Windows в Linux рекомендуется сначала выбрать подходящую кроссплатформенную библиотеку, перенести код на нее, а затем скомпилировать код для работы в Linux.
Ниже приведены примеры библиотек, которыми инженеры из Ауриги активно пользуются при портировании и миграции проектов. Они подходят для большинства задач, но у каждой из них мы указали наиболее распространенные.
1. C++ Standard Thread Library — это библиотека, предоставляемая стандартом языка C. Она предоставляет переносимый и удобный интерфейс для работы с потоками в C++. Хорошо интегрируется с другими компонентами языка, но имеет ограниченные возможности: не поддерживает некоторые специфические функциональности и требует хорошего понимания многопоточности для безопасного использования. Для более сложных сценариев могут потребоваться дополнительные библиотеки или фреймворки.
2. Intel Threading Building Blocks – кроссплатформенная библиотека для разработки приложений на C++, которая может использоваться для разработки приложений под различные операционные системы, в том числе Linux. Эта библиотека хорошо зарекомендовала себя при переносе PPL (Parallel Patterns Library) библиотеки, разработанной компанией Microsoft для работы с многопоточностью на C++.
3. Qt — это кроссплатформенный фреймворк для разработки приложений на C++, который также предоставляет классы для работы с потоками. В наших проектах мы часто используем библиотеку Qt для переноса функциональности, основанной на MFC (Microsoft Foundation Classes) — классах, предоставляемых Microsoft для разработки Windows-приложений.
4. SDL (Simple DirectMedia Layer) — это кроссплатформенная библиотека, разработанная для создания мультимедийных приложений на C++. SDL рекомендуется для работы с изображениями, звуком и вводом.
5. Boost C++ Libraries — это кроссплатформенная библиотека для разработки приложений на C++, которая поддерживает различные операционные системы, включая Linux. Boost рекомендуется использовать в случаях, когда требуется перенос приложений, использующих ATL (Active Template Library) — набор классов Microsoft для разработки Windows-приложений.
6. OpenMP (Open Multi-Processing) — это кроссплатформенная библиотека, позволяющая создавать многопоточные приложения с использованием директив препроцессора. Библиотека особенно полезна в ситуациях, когда требуется обработка большого объема данных параллельно.
7. Библиотека libuv предоставляет возможности для создания многопоточных приложений на C++. Она поддерживается на различных платформах, включая Linux, и предоставляет простой и удобный API для работы с потоками. Наши инженеры обнаружили, что libuv является наиболее удобным и эффективным средством для переноса кода, основанного на Windows Thread Pool API, на Linux или другие платформы.
В следующей статье расскажем о переносе программ на С++ из Windows в Linux в тех случаях, когда готового решения нет.
Больше статей о работе с потоками, а также на другие технические темы в официальном блоге Ауриги.