Я установил размер стека 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