Оформление на адресното пространство за многонишков Linux процес

Искам да знам пълните подробности за оформлението на адресното пространство на многонишков Linux процес както за 64 бита, така и за 32 бита. Връзка към всяка статия, която го описва, ще бъде оценена. И имайте предвид, че трябва да знам пълни подробности, а не само общ преглед, защото ще се занимавам директно с това. Така че трябва да знам например къде се намират стековете на нишките, купчината, личните данни на нишките и т.н.


person MetallicPriest    schedule 06.07.2011    source източник
comment
Особено искам да знам подробности за частта, която може да се записва. Например не е нужно да се занимавам с частта от адресното пространство, която съдържа кода, тъй като не може да се записва.   -  person MetallicPriest    schedule 06.07.2011
comment
Знаете ли всички подробности за процеса на Linux без нишки, нали? Разликата между безнишкови и многонишкови е броят и мястото на стековете.   -  person osgx    schedule 06.07.2011


Отговори (1)


Стековете на нишките се разпределят с mmap в началото на нишката (или дори преди това - можете да зададете пространството на стека в pthread_attrs). TLS данните се съхраняват в началото на стека на нишката. Размерът на стековете на нишките е фиксиран, обикновено е от 2 до 8 MB. Размерът на стека на всяка нишка не може да се променя, докато нишката е активна. (Първата нишка - изпълняваща се главна - все още използва основния стек в края на адресното пространство и този стек може да расте и да се свива.) Купчината и кодът се споделят между всички нишки. Мутексите могат да бъдат навсякъде в раздела data - това е просто структура.

Mmap на стека на нишката не е фиксиран на нито един адрес:

Източници на Glibc

 mem = mmap (NULL, size, prot,
                  MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);

PS модерният GCC позволява стекът на нишки да бъде неограничен с функцията SplitStacks

person osgx    schedule 06.07.2011