Потоки имеют одинаковое пространство виртуальной памяти, но разные стеки? Где стеки?

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


person Edward Garemo    schedule 08.01.2020    source источник
comment
Пожалуйста, отредактируйте свой вопрос. В нем не указан контекст, поэтому дать ответ невозможно. Например, добавьте 64-разрядный процесс Microsoft Windows, если это так.   -  person Maxim Masiutin    schedule 08.01.2020
comment
В качестве общего ответа стек для нового потока потенциально может быть размещен практически в любом месте адресного пространства процесса, и это будет решаться библиотекой/программным обеспечением, обеспечивающим реализацию потока (скорее всего, в сотрудничестве с операционной системой). Для Linux/pthreads ответы на следующий вопрос содержат гораздо больше деталей: stackoverflow.com/questions/44858528.   -  person Dato    schedule 09.01.2020


Ответы (1)


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

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.

person Jin-oh Kang    schedule 23.01.2020