Какое максимальное количество потоков может быть создано процессом в Linux?
Как (если возможно) можно изменить это значение?
Ответ 1
В Linux нет отдельного ограничения потоков для каждого процесса, только ограничение на общее количество процессов в системе (потоки — это, по сути, просто процессы с общим адресным пространством в Linux), которые вы можете просмотреть следующим образом:
cat /proc/sys/kernel/threads-max
По умолчанию это количество страниц памяти/4. Это значение можно увеличить так:
echo 100000 > /proc/sys/kernel/threads-max
Также существует ограничение на количество процессов (и, следовательно, потоков), которые может создать один пользователь.
Ответ 2
НЕПРАВИЛЬНО утверждать, что в LINUX нет отдельных потоков для каждого процесса.
Linux косвенно реализует максимальное количество потоков на процесс !!!
number of threads = total virtual memory / (stack size*1024*1024)
Таким образом, количество потоков на процесс можно увеличить, увеличив общую виртуальную память или уменьшив размер стека. Но слишком большое уменьшение размера стека может привести к сбою кода из-за переполнения стека, в то время как максимальная виртуальная память равна размеру памяти подкачки.
Общая виртуальная память: ulimit -v (по умолчанию не ограничено, поэтому вам нужно увеличить память подкачки, чтобы увеличить это значение).
Общий размер стека: ulimit -s (по умолчанию 8 Мб).
Команда для увеличения этих значений:
ulimit -s newvalue
ulimit -v newvalue
* Замените новое значение значением, которое вы хотите установить в качестве ограничения.
Ответ 3
На практике предел обычно определяется размером стека. Если каждый поток получает стек размером 1 Мб, тогда у вас в 32-разрядной системе адресное пространство закончится после 3000 потоков (при условии, что последний Гб зарезервирован для ядра).
Рано или поздно вы получите слишком много накладных расходов на переключение контекста, слишком много накладных расходов в планировщике и т. д. (Создание большого количества потоков создает много накладных расходов. Но множество потоков с реальной работой тормозит производительность, поскольку они борются за доступное время процессора).
Ответ 4
Linux не использует виртуальную память для вычисления максимального количества потоков, а только физическую память, установленную в системе.
max_threads = totalram_pages / (8 * 8192 / 4096);
ядро/fork.c
/* Максимальное количество потоков по умолчанию установлено в безопасное значение.
* значение структуры потоков могут занимать не более половины памяти.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
Таким образом, максимальный поток различается для каждой системы, потому что установленная оперативная память может быть разного размера, поэтому Linux не нужно увеличивать виртуальную память, потому что на 32-битной версии у нас есть 3 Гб для пользовательского пространства и 1 Гб— для ядра, на 64-битной версии мы получили 128 Тб виртуальной памяти, что и происходит в Solaris. Если вы хотите увеличить виртуальную память, вам нужно добавить объем подкачки.
Linux