Потоки имеют одинаковое пространство виртуальной памяти, но разные стеки? Где стеки? - PullRequest
1 голос
/ 08 января 2020

Стек времени выполнения программы хранится как часть виртуальной памяти и начинается с адреса X в системе Y (без учета рандомизации). Когда создается новый поток с собственным независимым стеком, где он хранится? (потоки разделяют свою виртуальную память)

1 Ответ

0 голосов
/ 23 января 2020

Почти каждые многопоточность библиотеки позволяет указать размер стека:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);
uintptr_t _beginthread( // NATIVE CODE
   void( __cdecl *start_address )( void * ),
   unsigned stack_size,
   void *arglist
);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

Перед запуском потока операционная система выделяет память (как и malloc) для выполнения нового потока. Некоторые системы также предоставляют промежутки («защитные страницы»), чтобы стеки не сталкивались друг с другом. Где они хранятся, зависит от платформы, но, как правило, стеки последующих потоков могут быть выделены в другой области, чем основной поток. Для Linux это обрабатывается библиотекой C и использует простой mmap для их распределения AFAIK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...