Cod reintroducător

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică , codul unui program sau rutină se spune că este reentrant dacă este conceput în așa fel încât o singură copie a codului din memorie poate fi partajată și executată simultan și fără rezultate neașteptate de mai mulți utilizatori sau procese separate. Programarea reintroducerii este vitală pentru multe sisteme multitasking (a se vedea thread-safe ).

Pentru ca o rutină sau orice parte a codului să fie reintrodusă, trebuie să îndeplinească următoarele cerințe:

  1. Nicio porțiune din cod nu poate fi modificată în timpul execuției (cod care nu se modifică automat );
  2. Codul nu trebuie să apeleze la nicio rutină care nu este ea însăși reentrantă. De exemplu, multe implementări ale funcțiilor malloc () și free () în C nu sunt (la fel pentru new și dispose în Pascal) și nu ar trebui utilizate. În cazul în care este necesară alocarea memoriei, ar putea fi utilizată API-ul sistemului (după consultarea documentației pentru a fi siguri că sunt incluse), care, în teorie, poate fi apelat în orice moment și în orice situație (cel puțin într-un sistem complet multitasking) oferă mai multe garanții.
  3. Codul dvs. ar trebui să utilizeze numai variabile temporare alocate în stivă, dacă este necesar.
  4. Codul nu trebuie să modifice variabile globale, zone de memorie partajate sau să utilizeze variabile statice locale.

Dacă o anumită bucată de cod nu respectă aceste reguli, nu este posibil ca acesta să fie rulat de mai multe procese în același timp, dar este necesar să se regleze accesul prin semafore sau secțiuni critice , pentru a se asigura că este executat de unul singur proces la un moment dat.

Partea codului nucleului care implementează sincronizarea interprocesului (semafoare, secțiuni critice etc.) nu este reintroducătoare prin definiție.

Nucleul sistemelor de operare Windows NT este complet reentrant, spre deosebire de cel al Windows 9x , ale cărui porțiuni semnificative de cod pe 16 biți derivate din MS-DOS nu sunt reentrante. Prin urmare, accesul la codul de sistem pe 16 biți în Windows 9x este guvernat de o secțiune critică globală, rezultând că sistemul de operare operează adesea într-o manieră monotask .

Funcțiile recursive ar trebui să fie întotdeauna reentrante, deși, cu grija cuvenită, este posibil să se scrie funcții recursive non-reentrante.

Exemple

În următorul fragment de cod, ambele funcții f() și g() nu sunt reentrante.

 int g_var = 1 ;

int f () {
  g_var = g_var + 2 ;
  returnează g_var ;
}

int g () {
  returnează f () + 2 ;
}

Funcția f() depinde de variabila globală g_var ; prin urmare, dacă două procese execută funcția și accesează g_var simultan, rezultatul depinde de momentul de execuție. Prin urmare, f() nu este reentrant. Nici g() nu este reentrant, deoarece numește f() care nu este reentrant.

Acestea sunt în schimb funcții reentrante:

 int f ( int i ) {
  returnează i + 2 ;
}

int g ( int i ) {
  returnează f ( i ) + 2 ;
}

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT