Стек времени выполнения программы хранится как часть виртуальной памяти и начинается с адреса X в системе Y (без учета рандомизации). Когда создается новый поток с собственным независимым стеком, где он сохраняется? (потоки совместно используют свою виртуальную память)
Потоки имеют одинаковое пространство виртуальной памяти, но разные стеки? Где стеки?
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