МРТ дублирует выделение памяти, когда 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().

0 ответов

Другие вопросы по тегам