МРТ дублирует выделение памяти, когда Thread.new
Кажется, что MRI делает дублирование распределения памяти для каждого нового потока.
Я использую Ubuntu x64, ruby-2.2.4 (rvm), и вот что я получаю:
Просто начал IRB:
я вижу pmap -d 1656
59760 КБ (выделенная память или "[стек]" для стека программы [man pmap (1)]):
И при создании темы:
я вижу pmap -d 1656
Использование памяти 127352K:
Итак, я вижу дублирование 59760K -> 127352K выделения памяти.
Такое поведение похоже на результат fork()
call, который используется для создания нового процесса, создает копию данных своего вызывающего процесса ("копирование при записи" выходит из этого контекста) для нового процесса.
Но Thread создается в том же процессе и делится своими данными, и это выглядит странно...
На практике это означает, что Thread в Ruby имеет аналогичное ограничение Process при использовании памяти: создание нового потока завершается неудачно, когда выделенная память становится ближе к объему физической памяти.
Мне интересно, ПОЧЕМУ?
ОБНОВИТЬ
Это не дублирующая память, а дополнительное выделение ~50 КБ для каждого потока. Спасибо @tadman за предположение, что это накладные расходы, а не копирование памяти способом fork().