С IOCP все ваши вызовы send и recv обрабатываются пулом потоков (обычно небольшой пул), поэтому нарисуйте один прямоугольник с send / recv в нем, над ним 3 красные точки и 10 000 синих под ним.
С IOCP вы отправляете серию перекрывающихся запросов. По завершении этих запросов они помещаются в очередь (IOCP), и потоки, обслуживающие эту очередь, могут их удалять и обрабатывать. Таким образом, если у вас есть 10 000 подключений, все из которых ожидают одно чтение, тогда, когда данные поступают от каждого клиента, вы получите завершения чтения, поступающие в IOCP. Ваши потоки будут разбужены и будут иметь дело с завершениями, они, скорее всего, будут выполнять больше перекрывающихся операций чтения и, вероятно, также будут создавать перекрывающиеся записи. Большую часть времени вас не волнует, когда перекрывающиеся записи завершены (за исключением случаев, когда вы заботитесь о них;)), и поэтому обработка завершения просто состоит из освобождения данных за операцию (то есть данных, которые вы только что отправили клиенту) и уменьшения использования рассчитывать на соединение ...
Статьи, ссылки на которые есть на моей бесплатной платформе IOCP-сервера , объясняют это немного подробнее.