<docere>http://www.docere.ro/ |

Locaţii de memorie şi modele de memorie
În termenii cei mai simpli, memoria este un dispozitiv pasiv (un depozit; un container; un suport) cu rolul de a păstra "informaţii" (reprezentate adecvat) şi care permite altor echipamente operaţii de "citire" (obţinerea informaţiei memorate) şi de "scriere" (depunerea sau înregistrarea informaţiei în memorie) - operaţii care se bazează pe existenţa unei ordonări implicite care asigură localizarea unui anumit conţinut (prin "adresa" acestuia în cadrul memoriei):

În cazul unui calculator, putem vorbi de două tipuri de memorie: memoria internă (vom zice scurt: memorie) este materializată prin "cipuri de memorie" (sau plăcuţe de memorie) aflate pe placa de bază, alături de acele componente care asigură procesarea informaţiei; memoria externă ţine de exteriorul plăcii de bază, având un anumit suport (disc, bandă magnetică) pe care de obicei, informaţia este localizată (citită, scrisă) printr-o anumită antrenare mecanică a suportului. În vederea procesării, datele din memoria externă trebuie transferate în memoria internă.
Un cip de memorie apare ca o capsulă paralelipipedică din care ies pinii circuitului, care servesc pentru accesarea circuitului interior capsulei (pentru alimentarea lui şi pentru localizarea, citirea sau scrierea informaţiei).
În alţi termeni, memoria internă este un tablou de circuite bistabile; un bistabil (sau flip-flop) are numai două stări stabile (şi complementare), asimilate respectiv cu 0 şi 1 - astfel că el poate memora un bit de informaţie (adică una dintre cele două cifre ale sistemului de numeraţie cu baza 2: 0 şi 1, numite "cifrele binare" sau biţi).
Cuplând şi indexând două bistabile (doi biţi) rezultă patru posibilităţi:
| bitul 1 (cu ponderea 21) |
bitul 0 (cu ponderea 20) |
secvenţa binară | valoarea zecimală |
|---|---|---|---|
| 0 | 0 | 00 | 0 = 0*20 + 0* 21 |
| 0 | 1 | 01 | 1 = 1*20 + 0* 21 |
| 1 | 0 | 10 | 2 = 0*20 + 1* 21 |
| 1 | 1 | 11 | 0 = 1*20 + 1* 21 |
Bistabilele dintr-un cip de memorie sunt aranjate de obicei, în grupe de câte opt - constituind locaţii de memorie; denumirea byte (sau octet) ar desemna mai degrabă o valoare numerică reprezentată pe 8 biţi (sau o secvenţă binară de lungime 8); un octet poate fi conţinutul unei locaţii de memorie, dar la fel de bine poate fi conţinutul vreunui alt element de memorare (de exemplu, un registru al CPU).
Scriind ca în tabelul de mai sus, secvenţele binare şi valorile lor de câte 3 biţi (când se adaugă şi "bitul 2" de pondere 22), de câte 4 biţi (adăugând şi "bitul 3", de pondere 23), etc. - putem deduce că o locaţie de memorie poate înregistra una dintre cele 28 secvenţe binare 00000000, 00000001, 00000010, ..., 11111110, 11111111 corespunzând respectiv valorilor 0, 1, 2, ..., 254, 255 = 28-1 — octeţi, sau valori de tip byte, sau cifrele sistemului de numeraţie cu baza 28 = 256; sau la fel de bine, resturile modulo 256.
Indexând de la dreapta, conform ponderilor convenite, avem următoarea imagine de locaţie de memorie:
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
Bitul b0 este bitul cel mai puţin semnificativ (el având ponderea cea mai mică, 20); în figură avem valorile b0 = 1, b1 = 1, b2 = 0, etc. Bitul b7 (cu ponderea maximă 27) este bitul cel mai semnificativ. Valoarea conţinută în locaţie este numărul b7b6b5b4b3b2b1b0 = b0 + 21×b1 + 22×b2 + 23×b3 + 24×b4 + 25×b5 + 26×b6 + 27×b7 (redat în baza 2 si respectiv, calculat în baza10; de exemplu, locaţia desenată mai sus conţine valoarea 1 + 21 + 23 + 24 + 25 + 26 = 123).
Pentru practică este util să observăm că o secvenţă de 8 biţi este constituită prin alipirea a două secvenţe de câte 4 biţi: 0000, 0001, 0010, 0011, ..., 1110, 1111; avem 24 = 16 secvenţe de câte 4 biţi, având valorile 0, 1, 2, ..., 15 = 24-1; acestea sunt cifrele sistemului de numeraţie cu baza 16 (cifrele hexazecimale), fiind desemnate uzual prin caracterele 0, 1, 2, ..., 9, A, B, C, D, E, F (A = 10, B = 11, etc.). Deci putem reda secvenţele de câte 8 biţi şi prin concatenarea a câte două cifre hexazecimale: 0016, 0116, ..., 0916, 0A16, 0B16, ..., 0F16, 1016, 1116, ..., 1916, 1A16, ..., 1F16, 2016, ..., FE16, FF16. De obicei, pentru a indica reprezentări hexazecimale se folosesc anumite prefixe; de exemplu valoarea FE16 s-ar reda în C, în Perl, în Javascript, etc. prin 0xFE (0 arată că nu poate fi vorba de un identificator, fiindcă identificatorii încep cu literă sau cu "_"; iar x vine de la hex).
Exemplele următoare arată procedee practice de conversie:
— conversie la baza 10: 0xCD = C16 * 16 + D16 = 12 * 16 + 13 = 205;
— conversie la baza 2: 0xCD = 1100211012 = 110011012
(am scris în baza 2 fiecare cifră hexazecimală şi am alipit secvenţele de câte 4 biţi)
— conversie la baza 16, continuată la baza 2: 123 = 16 * 7 + 11 = 0x7B = 011110112
(împărţire la 16, exprimare hexazecimală, înlocuire cu cei câte 4 biţi)
— conversie la baza 2, continuată la baza 16: 123 = 64 + 32 + 16 + 8 + 2 + 1 = 26 + 25 + 24 + 23 + 21 + 20 = 011110112 = 0111210112 = 0x7B
(exprimând ca sumă de puteri ale bazei 2, au rezultat rangurile biţilor de valoare 1, în cadrul reprezentării binare; apoi, am înlocuit câte 4 biţi prin cifra hexazecimală).
Ne putem imagina memoria ca fiind un tablou liniar de locaţii; numărul de ordine asociat astfel unei locaţii este adresa absolută a acesteia. Pentru a realiza operaţii de citire/scriere a memoriei, dispozitivele respective trebuie să dispună de o modalitate de indicare a adresei (de unde se citeşte, sau unde se scrie); rezultă anumite limitări sau inconveniente, care au determinat în timp conceperea de diverse modele de memorie, implicând atât hardware-ul cât şi software-ul.
Următoarea vedere este suficient de sugestivă: un an calendaristic AN, poate fi gândit ca fiind un tablou de maximum 366 de zile; putem referi una din zile prin "adresa absolută" 0..365, de exemplu AN[130] - ceea ce este desigur, inconvenabil; sau, putem avea în vedere o segmentare a anului într-un anumit număr de "sub-tablouri" (lunile anului, desigur), permiţând astfel referirea unei zile prin formula Segment: Offset unde prima componentă localizează "segmentul" (adică luna anului), iar a doua indică adresa relativă a zilei ("offset"-ul zilei faţă de "baza" segmentului; în loc de AN[130] am folosi 5:9, sau mai convenabil Mai:9).
Forţând puţin, în scopul evidenţierii prin analogie a problemelor de accesare care au condus la diverse modele de memorie - să presupunem că aşa este dispozitivul nostru de "citire/scriere" în tabloul AN, că nu putem folosi decât valori de maximum 2 cifre zecimale (… precum copiii de la grădiniţă). Aceasta înseamnă că dispozitivul respectiv (… calendarul) nu va fi capabil să localizeze prin "adresa absolută" în tabloul AN decât primele 100 de zile; evident, problema se rezolvă adoptând "modelul segmentat", fiindcă "Segment" (luna calendaristică) are valori 0..11, iar "Offset" are valori 0..31.
În modelul de memorie segmentată, memoria este văzută de dispozitive ca şi cum ar fi împărţită în segmente; fiecare segment conţine un anumit număr de locaţii consecutive; dimensiunea standard a unui segment este - în funcţie de microprocesor - de 216, sau de 232 locaţii de memorie.
În cadrul unui segment precizat, adresarea se poate face în modul "plat", indicând o locaţie din acel segment prin offset-ul ei - numărul de ordine al locaţiei faţă de prima locaţie din segment, sau altfel spus - numărul care arată câte locaţii o preced în acel segment. Dar o locaţie oarecare din memorie, va necesita pentru localizare precizarea ambelor componente: un segment care o include şi respectiv, offset-ul ei în acel segment.
Nu se impune segmentelor să fie disjuncte; o locaţie poate aparţine mai multor segmente şi poate fi referită prin mai multe combinaţii de segment şi offset (se creează astfel posibilitatea reducerii cerinţelor de memorie: în general, datele şi instrucţiunile unui program sunt memorate în segmente distincte, nesuprapuse, iar când datele ocupă abia un sfert din segmentul de date, atunci restul neocupat al acestuia ar putea fi alocat segmentului de cod).
Fiindcă memoria are o structură liniară, iar dispozitivele o văd segmentat - se pune problema convertirii între formatele de adresare liniară (prin adrese absolute) şi respectiv prin Segment:Offset (şi s-a ajuns la circuite complexe - integrate de obicei în microprocesor - care asigură pentru diverse moduri de operare, transformarea în (sau de la) adrese fizice de memorie, pe lângă alte sarcini legate de controlul accesului la memorie). Adresa absolută la care poate începe un segment de memorie, trebuie să fie multiplu de 16 (motivul va reieşi mai încolo); aceasta înseamnă că în scrierea hexazecimală a ei, ultima cifră este totdeauna 016 = 00002 şi ca urmare, ea poate fi omisă din specificaţia adresei de segment (urmând a reconstitui adresa absolută prin înmulţire cu 16, sau totuna - prin deplasare spre stânga cu 4 poziţii binare). Prin urmare, adresa absolută a locaţiei referite prin Segment:Offset va fi valoarea Segment * 16 + Offset.
Iată şi câteva exemple semnificative de calcul, asumând segmente de 216 locaţii.
— segmentul 0 al memoriei începe cu locaţia de adresă absolută 0 şi include toate locaţiile până la adresa absolută 216-1; segmentul 1 cuprinde locaţiile de adrese absolute 16..216 + 15; segmentul 2 acoperă adresele absolute 32..216 + 31.
— locaţia de adresă 32 poate fi încadrată segmentului 0 (având 32 = 0*16 + 32), sau segmentului 1 (având 32 = 1*16 + 16), sau segmentului 2 (având 32 = 2*16 +0) - putând fi referită prin 0:32, 1:16, respectiv prin 2:0. Primele 16 locaţii, de adrese absolute 0..15, aparţin numai segmentului 0.
— locaţia indicată prin 64:200 (sau în hexazecimal, 0x40:0xC8) are adresa absolută 64*16 + 200 = 1224 (sau calculând în hexazecimal, 0x40 * 0x10 + 0xC8 = 0x400 + 0xC8 = 0x4C8); scăderea cu 16 a părţii de offset înseamnă mărirea cu 1 a părţii de segment, încât aceeaşi locaţie poate fi referită şi cu 65:184, sau 66:168, etc.
— fiind dată adresa absolută 61213, să determinăm segmentul în care locaţia respectivă să aibă offset-ul cel mai mic: avem 61213 = 16*3825 + 13, deci segmentul cerut este 3825 şi locaţia se referă prin 3825:13.
Permiterea necontrolată a accesului la locaţiile din memoria fizică poate periclita funcţionarea sistemului. Neajunsurile care s-au constatat au condus (începând din 1982, odată cu apariţia microprocesorului Intel 80286) la conceperea modelului de memorie protejată; şi în modul protejat se foloseşte adresarea prin Segment:Offset - dar acum Segment nu mai vizează segmentul fizic respectiv, ci este un indice de selectare a unei intrări într-un tabel gestionat de către sistemul de operare ("tabela descriptorilor de segmente"). În acest tabel se păstrează şi se actualizează informaţii privind diversele segmente de memorie: cui aparţine, sau care program are acces la informaţia conţinută în segmentul respectiv; ce drepturi (read/write) are proprietarul asupra segmentului; ce conţine - date, sau cod; limitele reale în memorie la momentul respectiv; dacă segmentul se află într-adevăr în memoria internă, sau a fost temporar descărcat în memoria externă; etc.
ORAR orarul şcolii
SitSco situaţie şcolară
ŞAH prin corespondenţă
doChess a Javascript chess engine
doPGN a Javascript PGN-browser
Cal++ ambiţiile Calului
aşaAzis momente lingvistice
Comentarii
—cum ar trebui calculată Media şcolară?
completely rethink the browser:
Google chrome