malloc/free
Jindrich Fucik
fulda na seznam.cz
Sobota Listopad 5 16:45:00 CET 2016
Tady nám ještě schází jedno malé kouzlo - podívat se na architekturu
používaného procesoru.
Například intel - původně používal pointr ve tvaru segment:offset. Na
šestnáctibitech (8086) tedy dvě šestnáctibitová čísla: 1234:1234, přitom
platilo, že segment*konstanta+offset dávají fyzickou adresu.
Konstanta nebyla moc velká, tuším 16, takže se na jedno místo dalo
dosáhnout jako 0001:0000 a nebo 0000:0010.
Pak přišla 286 která zavádí chráněný režim a segment už mohl být celý
unikátní a měl velokost 64k, takže do něj nemohl nikdo jiný a nedal se
naadresovat jinak. Pořád však leží jeden za druhým.
A pak tu máme 386, ta místo segment zavádí slovo selector. Selector je
číslo bloku, který si přejeme dostat, ale existuje někde tabulka, která
říká, jakej je přepočet selector -> fyzická adresa, respektive, kde je
daný selector ve fyzické paměti. A aby se to nepletlo, tak zavádí i
výjimku, která říká, že v té paměti vůbec není. To se pak využilo pro
to, aby se obsah paměti vystěhoval třeba na disk a vznikl nám swap.
Prostě proces si chce sáhnout na selector 1234, podle tabulky se zjistí,
že není v paměti, tak se operační systém podívá kde je na disku, stáhne
ho do paměti a tvému procesu vrátí s úsměvem že je to fyzická adresa XYZ.
A tímto dlouhým povídáním jsem chtěl říci to, že taková defragmentace
může probíhat, většinou je to vlastnost operačního systému, ale na
druhou stranu tato defragmentace nemá vliv na tvar pointerů, ale jen na
jejich přepis ze selectoru na fyzickou reprezentaci.
Pochopitelně třeba na arduinu neprobíhá, tam je velmi jednoduchá správa
paměti.
Dne 3.11.2016 v 1:28 Pavel Hudecek napsal(a):
> Dobrý den všem,
>
> mějme program v C, běžící v MCU s několika desítkami kB RAM.
>
> Program čas od času alokuje nějakou paměť a jindy zas odalokuje.
> Předpokládejme, že se alokují kousky od několika B až do několika kB.
> Alokace a dealokace se dějí v obecně náhodném pořadí, tedy různé kousky
> paměti jsou alokovány na různou dobu.
>
> 1. Může se stát, že se paměť postupně fragmentuje tak, že od jistého
> okamžiku již nepůjde alokovat nějaké větší kousky, přestože celkové
> místo by bohatě stačilo?
> 2. Pokud se neděje (1), může se stát, že nějaký správce paměti bude v
> průběhu času již alokované kusy v případě nutnosti přesouvat, takže se
> budou měnit hodnoty pointerů na ně ukazujících?
> 3. Nebo to funguje úplně jinak? :-)
>
> Díky,
> PH
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list