Что такое I/O bound задача?

«Что такое I/O bound задача?» — вопрос из категории Многопоточность, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

I/O bound (ограниченная вводом-выводом) — это характеристика задачи, время выполнения которой в основном определяется ожиданием операций ввода-вывода, а не скоростью процессора.

Типичные примеры:

  • Чтение или запись файлов на диск (особенно больших).
  • Сетевые запросы (HTTP-вызовы к API, загрузка данных).
  • Обращения к базам данных.
  • Ожидание ответа от другого процесса или службы.

Проблема синхронного подхода: При синхронном выполнении поток блокируется и простаивает в ожидании завершения I/O-операции, что расточительно использует ресурсы, особенно в серверных приложениях.

Решение: асинхронное программирование. Поток освобождается во время ожидания I/O и может выполнять другую полезную работу.

Пример на C#:

// СИНХРОННЫЙ ПОДХОД (ПЛОХО ДЛЯ I/O) - поток блокируется.
public string GetData()
{
    // Поток ждёт, пока файл будет полностью прочитан с диска.
    string data = File.ReadAllText("large_data.json");
    return ProcessData(data);
}

// АСИНХРОННЫЙ ПОДХОД (ПРАВИЛЬНО) - поток не блокируется.
public async Task<string> GetDataAsync()
{
    // Операция чтения запускается, управление возвращается вызывающему коду.
    string data = await File.ReadAllTextAsync("large_data.json");
    // Когда файл прочитан, выполнение продолжается (возможно, в другом потоке).
    return ProcessData(data);
}

// Использование
var result = await GetDataAsync(); // Не блокирует UI или основной поток сервера.

Ключевой вывод: Для I/O bound задач используйте асинхронные API (Async-методы в .NET) с async/await. Это повышает масштабируемость и отзывчивость приложения, позволяя обслуживать больше concurrent-запросов с тем же количеством потоков.