# Speicherverwaltung
## Speicherhierarchie
### Registers
- schnellste und kleinste Form des Speichers
  - direkt in Prozessor
- Speicherung temporärer Daten und Zwischenergebnisse

### Cache
- kleinerer, schnellerer Speicher
- zwischen Register und RAM

### Hauptspeicher (RAM)
- physischer Speicher
- Prozessor kann direkt zugreifen

### Virtueller Speicher
- langsamerer Speicher
- Erweiterung des RAMs

## Speicheradressierung
- Prozess, durch den ein Computer auf den physischen/virtuellen Speicher zugreift

| **Physische Adressierung**                                    | **Logische Adressierung**                    |
|---------------------------------------------------------------|----------------------------------------------|
| direkter Zugriff auf bestimmten Speicherort im physischen RAM | Adresse von Prozess generiert                |
| physische Adresse = tatsächliche Adresse des Speicherorts     | wird später in physische Adresse umgewandelt |
|                                                               | **Virtuelle Adressierung**                   |


## Speicherpartitionierung
- Aufteilung des physischen Speichers in logische Abschnitte
  - können von verschiedenen Teilen des Systems genutzt werden
- Mögliche Zwecke:
  - Betriebssystemcode
  - Anwendungsdaten
  - Temporäre Variablen
  - ...

### Statische Partitionierung
![image_281.png](image_281.png)
- Aufteilung in Partitionen gleicher / unterschiedlicher Größe
  - im Idealfall möglichst passgenau
    - möglichst wenig interne Fragmentierung
  - Falls unterschiedliche Größe
    - BS verwaltet Warteschlange
      - | eigene für jede Partition                              | eine für alle |
        |--------------------------------------------------------|---------------|
        | :( bestimmte Partitionen werden seltener/nie verwendet |               |
- Nachteil:
  - zwangsläufig interne Fragmentierung
    - sehr ineffizient
![image_282.png](image_282.png)

### Dynamische Partitionierung
- BS weist jedem Prozess eine zusammenhängende Partition zu
  - mit exakt benötigter Größe
  - dabei auch Fragmentierung
- Darstellung des Speichers durch BS als verkettete Liste
  - Kennzeichnung, ob frei/belegt
  - Startadresse
  - Länge
  - Zeiger auf nächsten Eintrag

- Unterschiedliche Zuteilungskonzepte
  - wie sucht/findet das BS einen freien Speicherbereich
  - **First Fit**
    - sucht bei jeder Anforderung ab Anfang des Adressraums
  - **Next Fit**
    - sucht ab letzter Zuweisung
  - **Best Fit**
    - Sucht immer den freien Bereich, der am besten zur Anforderung passt
      - am wenigsten Fragmentierung
  - ![image_450.png](image_450.png)


## Buddy-Speicherverwaltung
- Ziel: Fragmentierung von Speicherblöcken minimieren
- wird oft in BS und in der Verwaltung von Speicher-Pools verwendet
- basiert auf
  - Blöcke gleicher Größe als Buddies zusammenfassen
    - effizienter Speicherzugriff/-freigabe ermöglichen

### Erstellung
- Am Anfang ein Bereich, der gesamten Speicher abdeckt
- Sobald ein Prozess Speicherplatz anfordert
  - Speicherkapazität zur nächsthöheren Zweierpotenz aufrunden
  - entsprechenden, freien Bereich suchen
    - Falls nicht existent
      - Nach Bereich doppelter Größe suchen
        - in zwei Teile teilen (Buddies)
        - eine Hälfte wird anfordernden Prozess zugewiesen
- ![image_283.png](image_283.png)
- Linux verwendet für Zuweisung von Speicherseiten zu Prozessen
  - Informationen in _/proc/buddyinfo_
    - ![image_284.png](image_284.png)

