Что там с потоком рядом со стеком - PullRequest
7 голосов
/ 14 ноября 2011

В процессе Linux каждый поток имеет свой собственный стек.Кроме того, что еще является локальным для каждого потока.Я прочитал такие вещи, как таблица размещения файлов и т. Д. Может кто-нибудь предоставить мне список вещей, которые относятся к потоку и как они расположены в памяти.

Во-вторых, я заметил, что когда я выделяю стек для потока (см. Код ниже), адрес первой переменной в функции потока как-то довольно байтовый после адреса стека, который я выделил ( stackAddr ).Я думаю, это потому, что вершина стека является конечным адресом выделенной памяти стека, так как разница в значении адреса локальной переменной и выделенного стека составляет приблизительно размер стека ( STACKSIZE ).Другими словами, это выглядит как рост снизу вверх.

pthread_attr_init( &attr[tid] );
stackAddr = malloc(STACKSIZE);
pthread_attr_setstack( &attr, stackAddr, STACKSIZE );

Ответы [ 3 ]

6 голосов
/ 14 ноября 2011

По первому вопросу, который я могу придумать:

  • идентификатор потока
  • Stack
  • машинные регистры
  • переменные, специфичные для потоков (обе пары ключ / значение, установленные pthread_setspecific и __thread класс хранения)
  • маска сигнала
  • набор ожидающих сигналов
  • ошибочное значение

Во-вторых, да, вы правы, на x86 стек увеличивается до более низких адресов. Итак, если вы используете pthread_attr_setstack, область начнет использоваться с конца.

5 голосов
/ 14 ноября 2011

За POSIX XBD 3.396

Единый поток управления внутри процесса. Каждый поток имеет свой собственный идентификатор потока, приоритет и политику планирования, значение errno, привязку ключа / значения к конкретному потоку и необходимые системные ресурсы для поддержки потока управления. Все, чей адрес может быть определен потоком, включая, помимо прочего, статические переменные, хранилище, полученное с помощью malloc (), непосредственно адресуемое хранилище, полученное с помощью функций, определенных реализацией, и автоматические переменные, доступны для всех потоков в одном и том же процессе. 1006 *

0 голосов
/ 15 ноября 2011

В Linux прикладной программист имеет большой контроль над тем, какие ресурсы являются частными для каждого потока и которые совместно используются другими потоками, если они решат использовать собственный clone() API, а не реализацию потоков pthreads.

Это означает, что невозможно дать однозначный ответ - ресурсы, которые зависят от потока, зависят от того, какие флаги были переданы в clone() при создании потока.

Обратите внимание, что многие из этих ресурсов вообще не находятся в памяти пользовательского пространства - такие вещи, как маска сигнала, хранятся в ядре.

...