Overlay este o tehnică de programare a calculatoarelor prin care părți din program, aflate pe suporturi de memorie externă (en), sunt transferate în memoria internă a unui calculator, unde înlocuiesc (reacoperă) ceea ce era înainte acolo.[1] Este o tehnică de programare care s-a folosit în perioada în care nu apăruse conceptul de memorie virtuală, iar memoria fizică disponibilă era mai mică decât cea necesară pentru încărcarea programului respectiv în întregime.[2] Sistemele înglobate utilizează și astăzi această tehnică, deoarece sunt realizate cu un minimum de memorie fizică și fără memorie virtuală.

Descriere modificare

Un program este format din mai multe module, fiecare modul conținând un segment de cod (program), unul de date și unul de stivă. La calculatoarele la care adresarea locală a memoriei se face pe 16 biți, iar adresarea este la nivel de octet, fiecare dintre aceste segmente nu poate depăși 64 Kiocteți. Pentru a forma programul executabil aceste module sunt montate de editorul de legături (en). Dacă editorul de legături nu primește alte instrucțiuni, structura programului va fi liniară, iar lungimea sa este posibil să depășească memoria fizică disponibilă a calculatorului, caz în care programul nu poate fi încărcat în memorie („nu încape în memorie”), deci nici executat. Soluția este o structură de reacoperire, prin care părți din program folosesc aceeași zonă din memorie, la un moment dat în memorie existând doar o parte a programului.

 
Structură arborescentă cu un nivel de ramificare

Construirea unei structuri de reacoperire înseamnă divizarea manuală a unui program în blocuri și plasarea lor într-o structură arborescentă (en). În principiu structura are o rădăcină, în care în exemplul din figura alăturată este plasat (doar) modulul 1. Rădăcina se încarcă la adresa de început A1 (adresa de încărcare în memorie a programului). Celelalte module sunt plasate în ramuri, fiecare ramură având aceeași adresă de încărcare, A2. Lungimea fiecărei ramuri împreună cu rădăcina trebuie să fie mai mică decât memoria internă disponibilă.

La rularea programului, inițial în memoria internă se încarcă doar partea de program din rădăcină. În momentul în care apare un apel (salt) la un modul situat într-o ramură, ramura respectivă este încărcată în memorie la adresa ramurilor (în exemplul dat A2) și execuția programului continuă. Dacă apar apeluri spre module aflate în alte ramuri, ramura necesară este încărcată la aceeași adresă (în exemplu A2) distrugând conținutul zonei respective de memorie, deci datele care conțin valori calculate trebuie să fie situate în rădăcină. Practic, ramurile comunică între ele prin rădăcină.

Operația de încărcare a unei ramuri este relativ lentă, fiind o operație cu un suport de memorie extern, deci la organizarea ramurilor se urmărește minimizarea acestor încărcări. Încărcarea propriu-zisă de pe suportul extern de memorie în memoria internă se face de către sistemul de operare.[3]

Exemplul de mai sus este caracteristic calculatoarelor de tip IBM-PC operate cu sistemul de operare MS-DOS. Memoria internă destul de mare pentru epoca respectivă (640 Kiocteți) făcea ca o structură cu un singur nivel de ramificare să fie considerată suficientă, MS-DOS nepermițând structuri mai complexe. Însă la începuturi, când memoriile erau foarte mici, structurile erau mai complexe, de exemplu sistemul de operare SIRIS 2 al calculatorului Felix C-256, având la dispoziție o partiție de doar 20 Kiocteți, avea o structură arborescentă cu două niveluri de ramificare.

Aplicații modificare

Actual (în 2016) multe aplicații comerciale rulează pe platforme cu memorie virtuală (en). Aceste aplicații sunt scrise în limbaje de programare de nivel înalt, care nu oferă programatorului prea mult control al memoriei. Însă pentru a funcționa, memoria virtuală are nevoie de o unitate de gestionare a memoriei (en) (MMU).[4] Unele sisteme înglobate ieftine nu dispun de o MMU, ca urmare folosesc tehnica reacoperirii.[5] De asemenea, la unele sisteme funcționând în timp real tehnica reacoperirii oferă un timp de răspuns mai scurt decât tehnica paginării, folosită de memoria virtuală. Tehnica reacoperirii a fost folosită, de exemplu, la navetele spațiale.[6] Tehnica reacoperirii a fost mult folosită în anii 1980 sub aplicațiile DOS, ca WordStar, dBase, ramurile de reacoperire având extensia .OVL.

Note modificare

  1. ^ en „Oxford Dictionaries”. . Arhivat din original la . Accesat în . 
  2. ^ „Loading And Linking Commodore Programs Part 4: Overlaying”. This lets you run programs which are, in effect, much larger than the amount of memory in your computer. 
  3. ^ „The GNU Linker documentation: Overlay Description”. . 
  4. ^ Bill Hutghings, Pregătire pentru o nouă generație de produse Arhivat în , la Wayback Machine., electronica-azi.ro, accesat 2016-06-20
  5. ^ en Levine, John R. (). Linkers & Loaders. Morgan Kaufmann Publishers. p. 177. ISBN 1-55860-496-0. 
  6. ^ en „An Assessment of Space Shuttle Flight Software Development Processes”. Accesat în .