Re: OS/2 i zarzadznie pamiecia

Autor: Grzegorz Szyszlo (znik_at_avalon.wbc.lublin.pl)
Data: Thu 13 Jul 2000 - 16:15:14 MET DST


Tomasz Szczesniak wrote:

> GS> w OS/2 jest przyjety scisle okreslony model zarzadzania pamiecia.
>
> I tylko szukam jaki... (niskopoziomowo), chcę wiedzieć z czystej ciekawości.

tak samo jak w linux. czyli pelny 32bitowy tryb pracy procesora,
z obsluga pamieci wirtualnej. pamiec jest podzielona na male bloki
ktore sa opisane w tzw. deskryptorach. jesli zachodzi potrzeba, to
kernel
dzialajacy w ringu0 wywala nieuzywany blok pamieci do pliku swap,
zas utworzone w ten sposob miejsce przydziela dla programu ktory zglosil
zapotrzebowanie. jesli nastapi odwolanie do istniejacego deskryptora
ktorego
nie ma w pamieci, to jest zglaszany wyjatek. obsluge przejmuje kernel,
wywala do swapa nieuzywany blok i w jego miejsce wgrywa blok ze swapa,
poprawia znaczniki i aktualizuje adresy w tablicy deskryptorow, po czym
wraca do obslugi przerwanego przez wyjatek zadania.

sedno w tym, w jaki sposob system przydziela bloki dla poszczegolnych
procesow. dla kazdego procesu moze przydzielic jeden spojny blok, wtedy
musi byc wyswapowany w calosci. tak ma niestety winda. moze dla procesu
przydzielic kilka blokow o stalej wielkosci, tworzace wirtualny ciagly
obszar pamieci. wtedy moze swapowac po kawalku. np. nieuzywane fragmenty
danych, nieuzywane fragmenty kodu programu (jesli jest bardzo dlugo).

od systemu tez zalezy strategia okreslania, ktore bloki moga byc
wyswapowane, a ktore maja byc okreslone jako czesto uzywane i nie moga
byc w danej chwili wyswapowane. jest to robione roznymi algorytmami,
ktorych ja osobiscie nie znam. zalezy to wylacznie od kernela. to on
decyduje co wywalic na dysk. w kazdym razie linux i os/2 trafniej
okreslaja ktore bloki sa najmniej potrzebne. winda ma z tym problem.

jesli bloki pamieci maja rozne wielkosci, to pamiec moze ulec
fragmentacji,
mimo ze logicznie bloki tworza spojne kawalki pamieci. od systemu zalezy
czy, i w jai sposob bedzie przemieszczal bloki opisane przez
deskryptory,
by polaczyc male wolne "dziury" nieuzywanej pamieci w wiekszy blok,
dla ktorego moze byc przydzielony deskryptor.

zagadnienie jest dosyc skomplikowane. ja osobiscie wiem niewiele wiecej
niz to co napsalem, bo cale zagadnienie swapowania, deskryptory itp.
sa dokladnie ukryte przed aplikacja uzytkowa. znajomosc tematu ma
duze znaczenie tylko przy pisaniu kernela systemu, poza tym jest to
nikomu niepotrzebne.

> GS> to zalezy od programu. program moze miec kazdy, nawet najmniejszy
> GS> segment
> GS> danych przydzielony od systemu, i to w praktycznie dowolnej ilosci
> GS> segmentow.
> GS> moze tez przydzielic sobie jeden wielki segment, i w nim na wlasna
> GS> reke allokowac sobie obszary. moze takich wielkich segmentow
> GS> przydzielic sobie kilka, moze tez uzywac wszystkich sposobow naraz.
> GS> jesli chodzi o GNU C, takze w odniesieniu do OS/2 jest to dokladnie
> GS> ukryte przed programista w funkcji alloc() lub obiektowo w new() .
>
> Nie do końca od programu. Czy w OS/2 są wskaźniki tylko bliskie (32 bit
> oczywiście), czy też dalekie? (do różnych segmentów danych)? Jak system
> wszystkie przydzielane obszary pamięci mapuje w jeden segment logiczny, to tej
> drugiej moziwości niema - są to różne obszary, ale w jednym segmencie,
> wmapowywane przez system.

nie powiem ci dokladnie jak to jest. czytalem o tym w jednej takiej
malej
ksiazeczce o procesorze i486 (w pentiumie sprawa jest prawie bez zmian).
32bity cyzli 4bajty pozwola ci na zaadresowanie 4TB ramu w sposob
bezposredni,
i wlasnie tyle ramu przy 32bitowym adresowaniu mozna przypiac do
procesora.
wiecej sie nie da. jesli chodzi o swapowanie, sprawa jest troche
bardziej
skomplikowana, bo w ramie jest zadeklarowany pewien obszar pamieci, w
ktorym
sa trzymane opisy deskryptorow. sam adres wtedy nie jest adresem
bezposrednim, lecz wskazaniem na rekord deskryptora. dopiero w
deskryptorze
sa zawarte informacje o logicznych adresach pamieci, czestosci
odwiedzania
bloku przez procesor, czy blok nie jest przypadkiem wyswapowany itp.

> GS> wiec najnormalniej w swiecie uzywaj alloc(), chociaz ja polecam new()
> GS> bo jest latwiejsze w obsludze.
>
> Nie piszę obiektowo, więc pozostanę przy malloc().

mozna i tak :) mi tam sie obiekty podobaja, nawet jesli z obiektowosci
korzystam wylacznie z new() :) ale warto siegnac glebiej.

> >> Nie do zrealizowania w normlanym programie?
> GS> do zrealizowania. pytanie po co?
>
> Już mówiłem - żeby serwer nie budział się przez długi czas.

jesli proces bedzie w swapie a dysk bedzie krecil, to czy robi ci
roznice sekundowe opoznienie? to nie windows NT.

-- 
 /===================================\    oOOo    (C) Publikacja tego
 | http://avalon.wbc.lublin.pl/~znik/ \===\__/==\ artykulu lub jego
 | Grzegorz Szyszlo   mailto:znik_at_wbc.lublin.pl | fragmentow w Gaz.Wyb.
 \==============================================/ surowo wzbroniona.


To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 15:28:06 MET DST