Часть стека pthread, похоже, уже используется - PullRequest
2 голосов
/ 25 мая 2011

Я установил размер стека pthread в Linux на 16 КБ. Если я помещу в стек массив размером более 8 КБ, приложения остановятся с ошибкой сегментации. Мне кажется, что я пытаюсь получить доступ к памяти ниже дна стека, которая, вероятно, является не отображенной памятью и, следовательно, segfault.

Вот пример кода:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>

void *start_routine(void *arg)
{
  size_t size = 9*1024;
  unsigned char arr[size];

  memset(arr, 0, size);
}

int main()
{
  int err;
  pthread_attr_t threadAttr;
  size_t stacksize;
  void *stackAddr;
  pthread_t thread;

  pthread_attr_init(&threadAttr);
  pthread_attr_setstacksize(&threadAttr, 16*1024);
  pthread_attr_getstacksize(&threadAttr, &stacksize);
  printf("stacksize: %d\n", stacksize);

  pthread_create(&thread, &threadAttr, start_routine, NULL );
  pthread_join(thread, NULL);

  return 0;
}  

Кажется странным, что я теряю около 8 КБ стека. Я попробовал также с немного большими размерами стека. Каким-то образом может меняться размер стека, который я могу использовать.

Я знаю, что для современных систем (за исключением некоторых встроенных систем) эти несколько байтов не очень важны, но мне просто любопытно, почему я не могу использовать большую часть определенного стека. Я не ожидаю, что смогу использовать весь стек, но потеря около 8 КБ кажется довольно большой.

Какая информация помещается в стек потока перед вызовом входной подпрограммы?

Спасибо Philip

1 Ответ

0 голосов
/ 26 мая 2011

После некоторого изучения исходного кода glibc nptl я прихожу к выводу, что в нижней части стека находится pthread-структура потока, которому принадлежит стек, и, вероятно, некоторые другие переменные в зависимости от конфигурации glibc.Они используют вместе около 3К.Вершина стека заполнена защитной страницей, которая обычно составляет 4 КБ.Таким образом, около 7-8К уже используются.Я немного удивлен, что, по крайней мере, память для защитной страницы не выделяется отдельно.На макушке головы я думал, что помню, что это будет так, но это не так.

...