У меня есть плата SH4, вот характеристики ...
uname -a
Linux LINUX7109 2.6.23.17_stm23_A18B-HMP_7109-STSDK #1 PREEMPT Fri Aug 6 16:08:19 ART 2010
sh4 unknown
и предположим, что я съел почти всю память, и осталось только 9 МБ.
free
total used free shared buffers cached
Mem: 48072 42276 5796 0 172 3264
-/+ buffers/cache: 38840 9232
Swap: 0 0 0
Теперь, когда я пытаюсь запустить один поток с размером стека по умолчанию (8 МБ)
pthread_create завершается с ENOMEM. Если я выполнил тестовый код, я вижу, что эта функция не работает, это mmap:
old_mmap(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
Однако, когда я устанавливаю размер стека на более низкое значение, используя ulimit -s:
ulimit -s 7500
Теперь я могу запустить 10 потоков. Каждый поток ничего не выделяет, поэтому
потребляет только минимальные накладные расходы (приблизительно 8 кбайт на поток, верно?).
Итак, мой вопрос:
Зная, что mmap на самом деле не потребляет память,
Почему pthread_create () (или mmap) не работает, если объем доступной памяти ниже
размер стека потока?