Искам да знам пълните подробности за оформлението на адресното пространство на многонишков Linux процес както за 64 бита, така и за 32 бита. Връзка към всяка статия, която го описва, ще бъде оценена. И имайте предвид, че трябва да знам пълни подробности, а не само общ преглед, защото ще се занимавам директно с това. Така че трябва да знам например къде се намират стековете на нишките, купчината, личните данни на нишките и т.н.
Оформление на адресното пространство за многонишков Linux процес
Отговори (1)
Стековете на нишките се разпределят с mmap
в началото на нишката (или дори преди това - можете да зададете пространството на стека в pthread_attr
s). TLS данните се съхраняват в началото на стека на нишката. Размерът на стековете на нишките е фиксиран, обикновено е от 2 до 8 MB. Размерът на стека на всяка нишка не може да се променя, докато нишката е активна. (Първата нишка - изпълняваща се главна - все още използва основния стек в края на адресното пространство и този стек може да расте и да се свива.) Купчината и кодът се споделят между всички нишки. Мутексите могат да бъдат навсякъде в раздела data
- това е просто структура.
Mmap на стека на нишката не е фиксиран на нито един адрес:
mem = mmap (NULL, size, prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
PS модерният GCC позволява стекът на нишки да бъде неограничен с функцията SplitStacks