Procházet otázky :: SZZ na MFF UK

#

- Hlavní strana
- Okruhy
- Projít
- Stáhnout
- Co je potřeba
- Chci přispět
- Kredity

Hledat:

## Prohlížení státnicových textů

### Organizace paměti

Paměť procesu (spuštěného programu) lze rozdělit do několika částí:

- kód programu (kódový segment)
  vytvořen při překladu, součást spustitelného souboru, neměnný a má pevnou délku; obvykle bývá chráněn proti zápisu
- statická data (datový segment)
  data programu, jejichž velikost je známa již při překladu a jejichž pozice se během programu nemění (je připraven kompilátorem a jeho formát je taktéž zadrátovaný ve spustitelném souboru, u inicializovaných statických dat je tam celý uložený); v jazyce C jde o globální proměnné a lokální data deklarovaná jako `static`, konstanty
- halda (heap segment)
  vytvářen startovacím modulem (C Runtime library), ukládají se sem dynamicky vznikající objekty (`malloc, new`) - neinicializovaná data, i seznam volného místa
- volná paměť
  postupně jí zaplňuje z jedné strany zásobník a z druhé halda
- zásobník (stack segment)
  informace o volání procedur (aktivační záznamy) -- návratové adresy, parametry a návratové hodnoty (nejsou-li předávány v registrech), některé jazyky (Pascal, C) používají i pro úschovu lokálních dat. Typicky roste zásobník proti haldě (od konce paměti k nižším adresám).

Poznámka (Vnořené funkce)

V Pascalu mohou být funkce definované uvnitř jiné funkce. Ta vnitřní potřebuje přistupovat k proměnným té vnější. Proměnné jsou sice na zásobníku, ale pouhý odkaz na volající funkci nestačí, protože se vnořená funkce může volat rekurzivně. Proto je na zásobníku ukazatel na funkci sémanticky nadřazenou.

Alokace místa pro různé typy proměnných

- Dynamicky alokované proměnné (přes pointer) se alokují na haldě. Opakovanou alokací a dealokací paměťových bloků různé velikosti vznikají v haldě díry (střídavé úseky volného a naalokovaného místa). Existuje několik strategií pro vyhledání volného bloku požadované velikosti (first-fit, next-fit, buddy systém) a udržení informací o volném místě, které jsou většinou implementovány v knihovních funkcích jazyka (C, Pascal).
- Lokální proměnné se ukládají na zásobník, po skončení funkce, které přísluší, jsou zase odstraněny.
- Globální a statické se ukládají do segmentu pro statická data. Tady se díry tvořit nebudou, protože tyhle proměnné vznikají na začátku a zanikají na konci programu (takže se formát segmentu nemění).