Calculatoare abstracte. Modelul von Neuman

Conceptul de calculator abstract

Sistemele de calcul reale sunt extrem de complicate, astfel că cel care dorește să le cunoască în detaliu are nevoie de cunoștințe aprofundate în domenile tehnice cărora le aparțin echipamentele care le compun (electronica, electrotehnica, mecanica etc.). Din fericire, asemenea cunostințe nu sunt absolut necesare pentru a programa un calculator, deși uneori pot fi utile.

În realitate, programatorul nu scrie programul pentru calculatorul real, ci pentru un calculator abstract, dat sub forma unui model care elimina detaliile, păstrând numai acele elemente care sunt necesare pentru limbajul de programare folosit. Asa dar, la stabilirea schemei calculatorului abstract, trebuie să se țină seama atât de calculatorul real pe care îl modelează, cât și de limbajul de programare folosit. Este deci posibil ca,  pentru același calculator concret, să existe mai multe modele abstracte, folosite pentru diferite limbaje. Este însă, de asemenea,  posibil ca pentru mai multe calculatoare concrete să se folosească același calculator abstract, diferența între ele manifestandu-se prin acele detalii, care se pierd la abstractizare.

În general, un calculator abstract are un set de instrucțiuni, un set de regiștri și un model de memorie.
 

Modelul de memorie

Memoria calculatorului abstract este o succesiune de locații de memorie. Fiecare locație de memorie este privită ca o "casetă" care conține un numar fix de cifre binare (biți). Numărul de ordine al locației (care arată poziția acesteia în cadrul memoriei) se numeste adresă. În consecință, memoria calculatorului este adresabilă. Locația este cea mai mică zonă de memorie care poate fi citită sau înregistrată. La orice operație de citire/scriere se transferă un numar întreg de locații.

În principiu, modelele de memorie pot să difere între ele prin numărul de biți conținut în locația de memorie (prin "lungimea" locației). Totuși, la majoritatea calculatoarelor actuale, locația de memorie conține opt biți și se numește octet (engl.: byte). Iată un exemplu de model de memorie organizată pe octeți:

În acest model, în coloana din stânga apar adresele locațiilor. Le-am scris în sistemul de numeratie zecimal, pentru a fi mai ușor de urmărit. De obicei însă, ele se exprimă în sistemul binar, sau în cel hexazecimal. Numărul de locații este însă în realitate, desigur, mult mai mare, exprimandu-se de regulă în megaocteți. În coloana din dreapta au fost reprezentate locațiile de memorie, conținând fiecare exact opt cifre binare. Conținutul a fost aici ales, desigur, arbitrar.

Capacitatea de memorie

Capacitatea  memoriei calculatorului se poate exprima în biți. Totuși, întrucât majoritatea calculatoarelor moderne au memoria organizată pe octeți, se obisnuiește să se folosească drept unitate de masură octetul sau multiplii acestuia.

Reamintim că nu trebuie sa confundam un bit cu un octet (engl.: byte). Primul este unitatea binara, exprimându-se prin cifrele binare 0 si 1. Numele este o prescurtare de la denumirea din engleză a unității binare: binary unit, de la care s-au luat începutul și sfârșitul. Un octet (byte) este însă un număr format din 8 cifre binare, deci din 8 biți.

Multiplii octetului sunt kilooctetul, megaoctetul, gigaoctetul si teraoctetul. Având în vedere că sistemul de numerație folosit în memoria internă a calculatorului este cel binar, pentru multipli nu s-au folosit puterile lui 10, ca în sistemul zecimal, ci puterile lui 2 cele mai apropiate de acestea:
                1 kilooctet (engl. kilobyte) = 1024 octeți = 210  octeți, prescurtat K sau Ko sau KB ;
                1 megaoctet (engl. megabyte) = 1024 kiloocteți = 1'048'576 octeți, prescurtat M sau Mo sau MB ;
                1 gigaoctet  (engl.: gigabyte) = 1024 megaocteți = 1'073'741'824 octeți, prescurtat G sau Go sau GB ;
                1 teraoctet (engl: terabyte) = 1024 gigaocteți =1'099'511'627'776 octeți, prescurtat T sau To sau TB ;

Procesorul abstract

Procesorul abstract este caracterizat printr-un set de regiștri și un set de instrucțiuni.

Regiștrii procesorului sunt, la fel ca locațiile de memorie, dispozitive în care se memorează numere binare de lungime fixă, specifică procesorului respectiv. Aceasta este, în general un multiplu de 8, deci într-un registru pot fi "încărcați" un număr întreg de octeți.

Instrucțiunile sunt codificate intern tot prin numere binare, formate din cel puțin două părți: un cod al operației și adresa operandului (uneori adresele operanzilor). Exemple de operații:
    - încărcarea, adică transferul unui operand din memorie într-un registru; instrucțiunea conține codul operației de încarcare, adresa din memorie a operandului și numărul registrului în care se încarcă;
    - memorarea, adică inregistrarea la o anumită adresă din memorie a conținutului unui registru; se dau: codul operației, numărul registrului de origine și adresa din memorie a destinației;
    - operații de calcul (aritmetice sau logice), care se efectueaza fie între operanzii din registre, fie între un operand dintr-un registru și unul din memorie. În instrucțiune se dau codul operației și numerele registrelor între care se face aceasta, sau numărul unui registru și o adresă din memorie. Rezultatul operației rămane, de regulă, într-un registru;
    - instrucțiuni de salt, prin care se modifică fluxul normal (secvențial) al executării instrucțiunilor. În mod normal, după ce s-a executat o instrucțiune din program, se trece la cea imediat următoare, în ordinea în care acestea sunt situate în memorie. Instrucțiunea de salt indică trecerea la executarea unei instrucțiuni situată la o altă adresă din memorie.

Fiecare instrucțiune este înregistrată în memorie pe o lungime unul sau mai multi octeți.

Mașina von Neumann

Matematicianul american de origine maghiară John von Neumann a publicat în anul 1945 prima descriere a unui calculator cu program memorat, care ar fi putut fi construit. Această descriere a avut o influență foarte mare asupra evoluției ulterioare a calculatoarelor și este cunoscută sub numele "mașina von Neumann".

Mașina von Neumann este formată din:
    - o unitate aritmetică și logică;
    - o unitate de control;
    - o unitate de intrare/ieșire;
    - o unitate de memorie.
Unitatea aritmetică și logică și unitatea de control formează împreună procesorul (unitatea centrală) de la calculatoarele actuale.

Mașina von Neuman lucrează numai cu numere întregi. Unitatea aritmetică și logică efectuează operațiile de calcul (adunare, scădere, înmulțire, împărțire întreagă, valoare absoluta). Ea conține doi regiștri, dintre care unul se numeste registru acumulator. Orice operație se face folosind regiștrii unității centrale:
    - încărcarea este transferul unui operand din memorie în unul din registri;
    - memorarea este transferul continutului registrului acumulator la o anumită adresă din memorie;
    - operațiile de calcul (adunare, scădere, înmulțire, împărțire) se fac între numerele din cei doi regiștri, iar rezultatul rămâne în registrul acumulator;
    - operațiile de intrare/ieșire se fac între registrul acumulator și unitatea de intrare/ieșire.

Dacă, de exemplu, dorim să se efectueze calculul c=a+b, aceasta înseamnă că se vor executa următoarele instructiuni:
    încarcă în registrul A operandul situat în memorie la adresa a;
    încarcă în registrul R operandul situat în memorie la adresa b;
    adună operanzii din cei doi regiștri (rezultatul rămâne în registrul acumulator A);
    memorează conținutul registrului A la adresa c din memorie.
Bineînțeles, aceste instrucțiuni vor fi reprezentate în cod binar, adica atât operațiile, cât și adresele din memorie vor fi exprimate prin numere în sistemul de numerație cu baza 2.

Caracteristica principală a mașinii von Neuman este ca funcționarea ei este un proces secvențial: la un moment dat se execută o singură instrucțiune, iar executarea unei instrucțiuni poate să înceapă numai după ce s-a încheiat executarea celei precedente. În toate operațiile participă unitatea centrală și regiștrii acesteia.

Primele generații de calculatoare construite au respectat destul de fidel modelul mașinii von Neuman. Chiar dacă, ulterior, evoluția calculatoarelor și a sistemelor de operare a suferit abateri de la acest model (s-a introdus accesul direct la memorie al unităților de intrare/ieșire, au aparut calculatoare cu mai multe procesoare, care funcționează în paralel, etc.), limbajele de programare au continuat, în majoritatea lor, să fie făcute pentru calculatoare abstracte de tip von Neumann. Exemple bine cunoscute de astfel de limbaje sunt Fortran, Cobol, Basic, Pascal, C, C++ ș.a.

Limbajul Java face parte din categoria limbajelor pentru procese concurente, în sensul că el permite să existe în paralel mai multe fire de executie, ale căror operații pot, în principiu, să se realizeze pe procesoare diferite. Este unul din motivele pentru care acest limbaj nu mai are la bază mașina von Neumann, ci pentru el a fost conceput un alt calculator abstract, numit mașina virtuală Java.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunarea de Jos" din Galati