Я хочу знать все подробности о структуре адресного пространства многопоточного процесса Linux как для 64-разрядной, так и для 32-разрядной версии. Ссылка на любую статью, которая описывает это, будет оценена по достоинству. И заметьте, мне нужно знать полную информацию, а не только обзор, потому что я буду иметь дело непосредственно с этим. Поэтому мне нужно знать, например, где расположены стеки потоков, куча, частные данные потока и т. д.
Структура адресного пространства для многопоточного процесса Linux
comment
Особенно я хочу знать подробности о части, которая доступна для записи. Например, мне не нужно иметь дело с той частью адресного пространства, которая содержит код, так как она недоступна для записи.
- person MetallicPriest   schedule 06.07.2011
comment
Вы знаете все подробности процесса Linux без потоков, не так ли? Разница между однопоточным и многопоточным состоит в количестве и месте стеков.
- person osgx   schedule 06.07.2011
Ответы (1)
Стеки потоков выделяются с помощью mmap
в начале потока (или даже раньше — вы можете установить пространство стека в pthread_attr
s). Данные TLS хранятся в начале стека потока. Размер стеков потоков фиксированный, обычно он составляет от 2 до 8 МБ. Размер стека каждого потока не может быть изменен, пока поток активен. (Первый поток — работающий основной — по-прежнему использует основной стек в конце адресного пространства, и этот стек может увеличиваться и уменьшаться.) Куча и код совместно используются всеми потоками. Мьютексы могут быть где угодно в секции data
— это просто структура.
Ммап стека потока не фиксируется ни по одному адресу:
mem = mmap (NULL, size, prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
PS современный GCC позволяет стек потоков быть неограниченным с функцией SplitStacks
person
osgx
schedule
06.07.2011