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