Как Unix системите следят споделената памет, когато обработват fork()?

Процес A създава регион на споделена памет и го споделя с Процес B. След това Процес A се разклонява и по този начин създава Процес C. По дефиниция C вече има достъп до същите региони на споделена памет. Ако A умре, C и B все още имат достъп до областта на паметта. Само когато C и B също умрат, физическата памет се освобождава отново.

Как Unix системите постигат това? Те съхраняват ли информация за това коя памет се споделя с кого на процес или тази информация е глобална?


person maxdev    schedule 12.11.2014    source източник


Отговори (1)


Регионът на споделената памет има брояч за справки. Той се увеличава всеки път, когато процес отвори споделената памет или я получи, като бъде раздвоен от процес, който я е отворил. Той се намалява, когато процес затвори споделената памет или излезе. Когато броячът достигне 0, областта на споделената памет се изхвърля.

person Barmar    schedule 12.11.2014
comment
Благодаря ви, но тази информация съхранява ли се в процеса или информацията за съществуващите области на споделената памет е глобална? - person maxdev; 12.11.2014
comment
Той е глобален, тъй като има един брояч за всеки регион на споделена памет. Как би могло да бъде в процеса? - person Barmar; 12.11.2014
comment
Може да бъде. В моя проект за ядро ​​(ghostkernel.org) преработвам внедряването на споделената памет, за да мога да внедря разклонение. В текущата ми реализация процесът на създаване е физическият собственик на региона, който иска да сподели. Процесите, с които се споделя зоната, нямат този флаг. Следователно паметта се освобождава, след като физическият собственик на споделената памет умре. Но, както виждате, това няма да се получи с fork, защото физическият собственик може да умре, но физическите страници пак ще трябва да останат. - person maxdev; 12.11.2014
comment
Ако информацията за споделената памет е глобална, какво се случва, ако физическата памет зад споделената област не е непрекъсната? Системата съхранява ли адреса за всяка физическа страница, която има споделен регион? - person maxdev; 12.11.2014
comment
Това е за всяка страница. Това е част от таблицата на страниците, използвана от системата за виртуална памет. - person Barmar; 12.11.2014
comment
За всяка страница - за всяка физическа страница? Къде намери тази информация? Как изобщо е възможно това с разумна производителност/разход на памет? - person maxdev; 12.11.2014
comment
Почти всичко за виртуалната памет се управлява в таблицата на страниците. - person Barmar; 12.11.2014
comment
Не. В x86 директориите и таблиците на страници имат само 3 бита на запис, които могат да се използват за такива цели. - person maxdev; 12.11.2014
comment
Говоря за операционната система, не за хардуера. Как би могло нещо, което е брой процеси, да бъде в информацията за всеки процес - това е по своята същност кръстосана част от данните, така че трябва да е глобална. - person Barmar; 12.11.2014
comment
Точните подробности ще се различават в зависимост от операционната система. Друг начин да го направите е със свързан списък, сочещ към информация за VM за всеки процес за страницата. Когато списъкът стане празен, споделената памет може да бъде изхвърлена. - person Barmar; 12.11.2014