В чем отличие I/O-bound и CPU-bound задач?

«В чем отличие I/O-bound и CPU-bound задач?» — вопрос из категории Распределенные системы, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

Примеры и подходы к оптимизации:

  • I/O-bound (веб-запрос, чтение файла):

    import aiohttp
    import asyncio
    
    async def fetch_data(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:  # Ожидание сетевого ответа
                return await response.text()

    Оптимизация: использование асинхронного ввода-вывода (asyncio, NIO в Java) или увеличение количества потоков для ожидания.

  • CPU-bound (вычисление числа Фибоначчи, рендеринг):

    def calculate_fibonacci(n):
        if n <= 1:
            return n
        return calculate_fibonacci(n-1) + calculate_fibonacci(n-2)  # Интенсивная рекурсия

    Оптимизация: распараллеливание вычислений на несколько ядер (multiprocessing в Python, ForkJoinPool в Java).

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