În acest curs vom explora modul în care sistemele de operare gestionează memoria, conceptele de paging, swapping și segmentare, precum și mecanismele moderne de optimizare a utilizării memoriei.
Memoria unui sistem de calcul este organizată ierarhic, fiecare nivel având viteze și costuri diferite.
- Memorie cache: Cel mai rapid tip de memorie, utilizat de procesor pentru acces instantaneu.
- RAM (Random Access Memory): Memorie volatilă utilizată pentru stocarea temporară a proceselor active.
- Memorie virtuală: Utilizează o combinație de RAM și spațiu pe disc pentru a extinde memoria disponibilă.
- Memory Management Unit (MMU): Componenta hardware care transformă adresele virtuale în adrese fizice.
- Alocare contiguă vs. non-contiguă:
- Contiguă: Fiecare proces primește un bloc de memorie continuu.
- Non-contiguă: Procesul poate fi împărțit în mai multe blocuri separate (ex: paging).
- Fragmentare internă și externă:
- Fragmentare internă: Memorie irosită în interiorul blocurilor alocate.
- Fragmentare externă: Memorie liberă fragmentată în bucăți prea mici pentru a fi utilizate eficient.
- Buddy System și Slab Allocator: Algoritmi de alocare eficientă a memoriei în Linux.
- Paging-ul permite unui proces să fie împărțit în pagini mici de dimensiune fixă.
- Page Table: Tabel care mapează adresele virtuale la adresele fizice.
- Translation Lookaside Buffer (TLB): Cache utilizat pentru accelerarea traducerii adreselor.
- Demand Paging și Page Faults: Paginile sunt încărcate în memorie doar când sunt necesare.
- Segmentarea permite împărțirea memoriei în segmente logice de dimensiuni variabile.
- Protecția memoriei și accesul la segmente: Fiecare segment poate avea permisiuni diferite.
- Comparare Paging vs. Segmentation:
- Paging: Alocare fixă, reduce fragmentarea externă.
- Segmentation: Alocare flexibilă, dar poate cauza fragmentare externă.
- Swapping: Procesul prin care paginile de memorie neutilizate sunt mutate pe disc.
- Swap Partition vs. Swap File: Spațiul swap poate fi o partiție separată sau un fișier dedicat.
- Comenzi pentru monitorizarea utilizării memoriei:
free -m # Afișează utilizarea memoriei RAM și swap
vmstat 1 10 # Monitorizează activitatea memoriei și swap-ului în timp real
top # Afișează procesele care consumă memorie
cat /proc/meminfo
sudo swapon -s # Verifică spațiul swap activ
sudo swapoff -a # Dezactivează swap-ul
sudo swapon -a # Reactivează swap-ul
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(1024 * 1024 * sizeof(int));
for (int i = 0; i < 1024 * 1024; i++) arr[i] = i;
printf("Memorie utilizată cu succes!\n");
free(arr);
return 0;
}