Сколько максимум можно создать потоков, которые работают одновременно?
Ответ
Есть несколько "понятий" для процесса/потока.
Физически - не более колличества ядер процессора. Т.е. если процессор 4-х ядерный, он не может выполнять более 4-х потоков одновременно. Есть технология Hyper-threading суть которой - оптимизация "переключений" между процессами, т.е. Hyper-Threading 4-8 не означает что 8 выполняются одновременно, а означает что переключение между потоками организовано таким образом, что создаётся впечатление что ядер больше.
Логически (уровень ОС) - пока не закончится память хандлов (т.е. много). Ваш вопрос сводится к макc колличество хандлов (т.к. каждому thread нужно присвоить хандл) тогда ответ - до 10000 (минус штук 300 используется системой). Активные хандлы ОС "преобразует" в таски, а процессор аппаратным решением выбирает какой таск выполнять сейчас на аппаратном уровне. Хандлами могут быть - файлы, pipes, event, mailslot и другие обьекты ОС, если программа активно использует хандлы (например для каждого thread открывается file) то хандлы закончатся в два раза быстрее, т.к. общее число ханлов не должно превышать 10000.
Уровень DOT NET. У с# Thread - это обьект за которым может быть а может не быть реального Thread Handle. Кроме того, хандлы обьеденяются в пул (для повторного использования). Активный Thread всегда подкреплен Thread Handle ОС, но неактивые можно создавать - пока не закончится память Heap. При превышении определённого числа активных Thread - получим ошибку, что не возможно создать хандл.
Апаратный уровнь. TSS или Task Gate Descriptor Для 32 битных процессоров, существует каталог GDT - таблица таблиц на 8192 ячеек. В каждой можно сохранить ссылку на 8192 LDT елементов, один из которых может быть дескриптором процесса Task-и (частью Thread без которой процессор не сможет аппаратно переключать Thread. Т.е. 67 108 864 - это "теоретически" предел аппаратных мест для потоков, но... нужно учесть, что дескрипторы памяти так же нужно разместить в этой таблице, т.е. минус дескрипторы памяти... выйдет от миллиона до 60 миллионов. Но в реальности, есть предел, выше которого процессор будет "ничем другим не занят кроме как переключением процессов", поэтому... столько не используют. Процессор распределает эти таски между ядрами апаратным решением. Что ОС будет делать когда они закончатся - скорее всего у ОС встроен константой предел на колличество тасков, так как при слишком большом их колличестве процессор начнёт терять производительность.
Ccылки по аппаратной части:
http://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-246.html
http://en.wikipedia.org/wiki/Global_Descriptor_Table
Комментариев нет:
Отправить комментарий