Когда следует использовать многозадачность
Существует два способа реализации многозадачности: как один процесс с несколькими потоками или как несколько процессов с одним или несколькими потоками. Приложение может поместить каждый поток, которому требуется частное адресное пространство и частные ресурсы, в собственный процесс, чтобы защитить его от действий других потоков процессов.
Многопоточный процесс может управлять взаимоисключающими задачами с потоками, такими как предоставление пользовательского интерфейса и выполнение фоновых вычислений. Создание многопоточного процесса также может быть удобным способом структурирования программы, которая выполняет несколько похожих или идентичных задач одновременно. Например, сервер именованного канала может создать поток для каждого клиентского процесса, который подключается к каналу. Этот поток управляет взаимодействием между сервером и клиентом. Процесс может использовать несколько потоков для выполнения следующих задач:
- Управление входными данными для нескольких окон.
- Управление вводом с нескольких устройств связи.
- Распределение задач по приоритетам. Например, можно создать поток с высоким приоритетом для управления срочными задачами, а остальную работу переложить на поток с низким приоритетом.
- Сохранение скорости реагирования пользовательского интерфейса при выделении процессорного времени для фоновых задач.
Как правило, для приложения эффективнее реализовать многозадачность путем создания одного многопоточного процесса, а не нескольких процессов по следующим причинам:
- Система может выполнять переключение контекста для потоков быстрее, чем процессы, так как процесс имеет больше накладных расходов, чем поток (контекст процесса больше контекста потока).
- Все потоки процесса используют одно адресное пространство и могут получать доступ к глобальным переменным процесса, что может упростить обмен данными между потоками.
- Все потоки процесса могут совместно использовать открытые дескрипторы для ресурсов, таких как файлы и каналы.
Существуют и другие методы, которые можно использовать вместо многопоточности. Наиболее важными из них являются асинхронные входные и выходные данные (I/O), порты завершения ввода-вывода, асинхронные вызовы процедур (APC) и возможность ожидания нескольких событий.
Один поток может инициировать несколько трудоемких запросов ввода-вывода, которые могут выполняться параллельно с использованием асинхронного ввода-вывода. Асинхронные операции ввода-вывода можно выполнять для файлов, каналов и устройств последовательной связи. Дополнительные сведения см. в разделе Синхронизация и перекрытие входных и выходных данных.
Один поток может блокировать собственное выполнение, ожидая возникновения одного или всех из нескольких событий. Это эффективнее, чем использование нескольких потоков, каждый из которых ожидает одного события, и более эффективно, чем использование одного потока, который потребляет время процессора путем постоянной проверки событий. Дополнительные сведения см. в разделе Функции ожидания.