Когда следует использовать многозадачность

Существует два способа реализации многозадачности: как один процесс с несколькими потоками или как несколько процессов, каждый из которых содержит один или несколько потоков. Приложение может поместить каждый поток, который требует частного адресного пространства и частных ресурсов в собственный процесс, чтобы защитить его от действий других потоков процесса.

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

  • Управление входными данными для нескольких окон.
  • Управление входными данными с нескольких устройств связи.
  • Распределение задач по приоритетам. Например, можно создать поток с высоким приоритетом для управления срочными задачами, а остальную работу переложить на поток с низким приоритетом.
  • Сохранение скорости реагирования пользовательского интерфейса при выделении процессорного времени для фоновых задач.

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

  • Система может быстрее выполнять переключение контекста для потоков, чем процессы, так как процесс имеет больше накладных расходов, чем поток (контекст процесса больше контекста потока).
  • Все потоки процесса совместно используют одно адресное пространство и могут получить доступ к глобальным переменным процесса, что может упростить взаимодействие между потоками.
  • Все потоки процесса могут совместно использовать открытые дескрипторы для ресурсов, таких как файлы и каналы.

Существуют и другие методы, которые можно использовать вместо многопоточности. Наиболее важными из них являются следующие: асинхронные входные и выходные данные (ввода-вывода), порты завершения ввода-вывода, асинхронные вызовы процедур (APC) и возможность ожидания нескольких событий.

Один поток может инициировать несколько длительных запросов ввода-вывода, которые могут выполняться параллельно с помощью асинхронного ввода-вывода. Асинхронные операции ввода-вывода можно выполнять с файлами, каналами и последовательным коммуникационными устройствами. Дополнительные сведения см. в разделе "Синхронизация" и "Перекрывающиеся входные и выходные данные".

Один поток может блокировать собственное выполнение во время ожидания выполнения любого из нескольких событий. Это более эффективно, чем использование нескольких потоков, каждое ожидание одного события и более эффективное, чем использование одного потока, который потребляет время процессора, постоянно проверяя наличие событий. Дополнительные сведения см. в разделе "Функции ожидания".