|
Organizarea unitatii de Intrare/Iesire(I/O)
Una din caracteristicile de baza ale unui calculator este aceea de a transmite si receptiona date la si de la alte dispozitive. Aceasta capacitate de comunicare permite utilizatorului uman sa introduca de exemplu un program si datele asociate acestuia cu ajutorul tastaturii si a unui monitor si sa obtina rezultatele afisate pe monitor. Exista o gama foarte larga de echipamente cu care un calculator trebuie sa poata comunica. Printre acestea sunt monitoare, imprimante, plottere, modemuri, discuri magnetice, etc. Pe langa aceste echipamente standard de I/O un calculator mai poate fi conectat si la late tipuri de dispozitive cum ar fi cele pentru controlul aplicatiilor industriale, unde intrarile in calculator pot fi iesiri digitale ale unui voltmetru, ale unui senzor de temperatura, sau a unei alarme de incendiu. In mod similar, iesirea calculatorului poate fi o comanda digitala codificata pentru a controla viteza unui motor, deschiderea unei valve sau sa determine un voltmetru digital sa treaca la urmatoarea citire. Pe scurt, un calculator in general trebuie sa poata comunica cu o mare varietate de dispozitive in diferite medii de lucru.
Principalele functii pe care un calculator este necesar sa le poata realiza pentru a trata operatiile de I/O sunt:
1. Adresarea sau selectarea uni dispozitiv de I/O pentru a realiza o operatie de transfer.
2. Transferarea datelor de la si catre dispozitivul selectat.
O alta cerinta deriva din faptul ca operatiile dispozitivelor externe, in general, sunt independente de procesorul calculatorului. Astfel, este necesara o a treia functionalitate pe care un calculator trebuie sa o realizeze:
3. Sincronizarea si coordonarea timpilor la care operatiile de intrare si iesire sa aiba loc.
In acest capitol se vor discuta diferitele metode prin care aceste functii se pot implementa.
1. Adresarea dispozitivelor de Intrare/Iesire.
Deoarece in mod obisnuit, mai multe dispozitive sunt conectate la un calculator, trebuie sa existe anumite procedee prin care sa poata fi selectat unul din aceste dispozitive pentru a participa la o operatie de I/O. Acest lucru se poate realiza prin utilizarea unei organizari in stil magistrala asa cum este prezentat in figura 1. Aceasta magistrala, la care sunt conectate toate dispozitivele de I/O, consta din trei seturi de linii utilizate pentru transmiterea adreselor, datelor si semnalelor de control. Astfel, daca fiecarui dispozitiv ii este atasat un cod de identificare, sau adresa, unitatea centrala de procesare poate selecta un dispozitiv prin plasarea adresei acestuia pe liniile de adresa. Doar dispozitivul care isi recunoaste adresa va raspunde comenzilor CPU initiate pe liniile de control.
In cazul masinilor cu o singura magistrala, aceeasi magistrala serveste atat ca magistrala de memorie cat si ca magistrala de I/O. Astfel, dispozitivele de I/O pot fi identificate prin asocierea unui cod unic in spatiul de adrese al memoriei acelui calculator. Utilizand aceasta structura, este posibila accesarea dispozitivelor de I/O in acelasi mod in care se acceseaza o locatie de memorie, asigurand o mare flexibilitate in tratarea operatiilor de I/O. Aceasta procedura se numeste maparea in memorie a intrarilor si iesirilor (memory mapped I/O) Trebuie subliniat inca o data faptul ca este necesara asocierea unei adrese unice pentru fiecare dispozitiv. Este obisnuit uzual, desi nu este necesar, sa se foloseasca un bloc continuu de adrese pentru dispozitivele I/O, si acest lucru este realizat de obicei si in practica. LA calculatoarele PDP-11 adresele pentru dispozitivele periferice se intind de la 765008 pana la 777570. Sistemul de operare al acestor calculatoare livrat de producator, aloca adrese specifice celor mai utilizate dispozitive. DE exemplu, o teletypewriter conectat la magistrala unui PDP-11are patru registri de stare si date. Adresele acestor registri sunt urmatoarele:
Registrul de stare al tastaturii (KBSTATUS) 777560
Buferul de date al tastaturii (TTYIN) 777562
Registrul de stare al imprimantei (PRSTATUS) 777564
Buferul de date al imprimantei (TTYOUT) 777566
1.2. Transferul de date.
In subcapitolul anterior s-a prezentat modul in care procesorul poate selecta un anumit dispozitiv pentru a participa la o operatie de I/O. In acest capitol se va discuta modalitatea in care datele se pot transfera intre buferele dispozitivului si memoria principala sau registrii procesorului. De obicei, acest lucru se realizeaza prin executarea unor instructiuni speciale numite IN si OUT. In calculatoarele in care registrii de date ai dispozitivelor externe sunt tratati ca si locatii de memorie, o instructiune Move poate fi utilizata pentru a realiza operatia de I/O.
Figura 2. demonstreaza organizarea necesara pentru a conecta orice dispozitiv pe magistrala de I/O a calculatorului.
Decoderul de adrese permite dispozitivului sa-si recunoasca adresa cand aceasta este plasata pe magistrala de adrese a procesorului. Registrul de date este utilizat pentru stocarea datelor ce vor trebui transferate catre procesor la dispozitiv de intrare sau pentru stocarea datelor receptionate de la procesor pentru un dispozitiv de iesire. La unele calculatoare registrele de stare sunt conectate de asemenea la magistrala de date. Decoderul de adrese, registrele de date si de stare cat si circuitele de control necesare coordonarii transferelor de I/O constituie interfata dispozitivului.
Metoda prezentata mai sus de realizarea a transferurilor I/O este cunoscuta sub numele de I/O controlat prin program (program-contrloed I/O). Folosind aceasta metoda, executia unei instructiuni I/O cauzeaza transferul unui singur cuvant de date. In cazul dispozitivelor de I/O care pot sa trateze doar un singur caracter o data, cum ar fi o tastatura, doar un singur caracter va fi transferat de catre o instructiune de I/O.
Cand insa sunt necesare transferuri de blocuri mari de date la viteze ridicate de la sau inspre un dispozitiv periferic, se foloseste o alta metoda de transfer. Se poate realiza un circuit de control special care sa permita transferul de blocuri de date direct intre dispozitiv si memoria principala. Circuitele de control transfera datele, cuvant cu cuvant la o viteza adecvata cu caracteristicile dispozitivului extern. Aceasta metoda este cunoscuta sub numele de DMA (Direct Memory Access).
1.2.1. Accesul direct la memorie (DMA).
Se va considera cazul unui dispozitiv periferic de viteza mare care trebuie sa transfere blocuri mari de date din si catre memorie. Utilizarea programarii I/O controlate cu un astfel de dispozitiv este in cel mai bun caz ineficienta daca nu imposibila. Urmatoarele doua motive sustin aceasta afirmatie:
In programarea I/O controlata, este necesara o intreaga gama de instructiuni care trebuie sa fie executate pentru fiecare cuvant de date transferat intre dispozitivul extern si memoria principala.
Majoritatea dispozitivelor periferice de viteza mare au un mod de operare sincron, adica transferul de date este controlat de frecvente de ceas fixe, independente de procesor.
Necesarul de instructiuni suplimentare in programare I/O controlata este exemplificat prin programul din figura 3.
Cicluri de memorie
MOV LOC,R0 2
MOV 80,R1 2
WAIT: TSTB @LPRSTATUS 3
BP WAIT 1
MOVB (R0),@LPROUT 4
INC R1 1
BNE WAIT 1
HALT 1
Acest program transfera 80 de caractere din memorie incepand cu locatia LOC catre o imprimanta. Registrul R0 este folosit ca si pointer la carcaterele din memorie, iar registrul R1 tine cont de cate caractere mai trebuie transferate. Registri de stare si de date ai imprimantei sunt reprezentati prin numele LPRSTATUS si LPROUT. In coloana cicluri de memorie sunt reprezintati numarul de cicluri necesare executiei fiecarei instructiuni. De exemplu instructiunea
TSTB @LPRSTATUS
Necesita trei cicluri de memorie. Doua dintre ele sunt necesare pentru citirea instructiunii si adresei operandului. Al treilea ciclu de memorie este necesar pentru citirea operandului, adica a continutului registrului de stare, in scopul de executa testul necesar.
Urmarind aceasta bucla de transfer pentru un singur caracter se observa ca sunt necesare cel putin cinci instructiuni ce necesita zece cicluri de memorie pentru fiecare caracter transferat catre imprimanta. Aceasta inseamna o supraincarcare de 9 la 1.
Necesitatea unui transfer sincron de date este, in majoritatea cazurilor, dictata de caracteristicile fizice ale dispozitivului periferic. De exemplu, o unitate de hard disc de viteza mare nu poate fi oprita dupa fiecare caracter. Transferul de date la o astfel de unitate poate ajunge la 10MB/s. Combinatia intre viteza mare de transfer si sincronizare fac ca operatiile cu aceste dispozitive sa fie incompatibile cu controlul programat al transferurilor de date.
Problema intalnita mai sus poate fi depasita prin incorporarea tuturor functiilor pe care trebuie sa le execute un program intr-un controler hard. Acest controler permite transferul direct de date intre dispozitiv si memoria principala fara a implica procesorul. Urmarind codul din figura 3. se poate observa ca un astfel de controler DMA poate fi realizat cu ajutorul a doi registrii, unul care sa genereze adresele de memorie si altul care sa numere caracterele transferate. Al treilea registru este necesar pentru a memora comanda procesorului specificand functia ce trebuie executata, iar un al patrulea registru este utilizat in mod normal ca tampon de date intre memoria principala si dispozitivul extern. In cazul dispozitivelor mai complexe asa cum ar fi unitatile de disc mai sunt necesari si alti registri. Registrii controlerului pot fi accesati de catre procesor pentru initializare folosind controlul programat. Astfel, controlerul DMA trebuie sa fie conectat la magistrala in varianta clasica a oricarei interfete de dispozitiv de I/O.
1.3. Sincronizarea.
Un calculator trebuie sa aiba o metoda de coordonare a activitatii lui interne cu cea a dispozitivelor externe conectate la el. De exemplu cand asteapta caractere de la o tastatura, trebuie sa stie cand un nou caracter a fost introdus de catre aceasta si este gata de a fi transferat. In mod similar, pe timpul unei operatii de tiparire la imprimanta, calculatorul nu poate trimite un caracter pana cand tiparirea celui precedent nu s-a terminat.
In general exista doua tehnici de sincronizare utilizate: prin polling sau verificarea starii, sau prin intreruperi.
1.3.1. Polling-ul sau verificarea starii.
Exemplul din figura 3. este un exemplu de polling. Starea curenta a fiecarui dispozitiv de intrare sau iesire conectat la un calculator este indicata prin unul sau mai multi biti de informatie. Cel mai important dintre acesti biti este bitul de Ready, care este setat de fiecare data cand un dispozitiv este gata pentru a participa la un nou transfer de caracter. Pentru a realiza o operatie de I/O cu un dispozitiv dat, programul trebuie mai intai sa sondeze dispozitivul testandu-i bitii de stare. Daca bitul Ready este setat, atunci se poate executa o instructiune de I/O pentru a executa transferul necesar. Acest lucru va sterge imediat bitul de Ready, care va ramane zero pana cand dispozitivul este gata pentru un alt transfer. In dispozitivele simple, asa cum ar fi o tastatura bitul Ready este singurul necesar. In dispozitive mai complexe, asa cum ar fi imprimantele de viteza mare, se utilizeaza mai multi biti de stare pentru a indica diverse conditii asa cum ar fi faptul ca nu mai exista hartie sau ca hartia s-a blocat.
Modalitatea in care starea unui dispozitiv este reprezentata intr-un calculator variaza de la masina la masina. In unele calculatoare, bitii de stare sunt grupati in registri de stare asociati fiecarui dispozitiv. Continutul registrilor de stare poate fi accesat de catre procesor de pe liniile de date. Astfel, ei pot fi testati ca niste date obisnuite. La alte calculatoare bitul de Ready este conectat la una din liniile de control. Exista instructiuni speciale care testeaza starea acestei linii pentru a determina faptul ca un dispozitiv este gata pentru transferul de date.
1.3.2. Intreruperi.
O metoda alternativa pentru coordonarea activitatii procesorului cu cea a dispozitivelor periferice este utilizarea intreruperilor. In loc sa execute bucla de asteptare, procesorul poate sa execute alte instructiuni sau programe sau poate sa nu execute nimic. Procesorul sta in aceasta stare pana cand un dispozitiv extern este gata pentru transferul de date. In acest moment, dispozitivul avertizeaza procesorul prin activarea uneia dintre liniile de control numite linii pentru cereri de intreruperi (INTR). Acest lucru determina procesorul sa inceapa executia instructiunii de transfer de date sau a rutinei de tratare a intreruperii. Deci utilizand , intreruperile, perioadele de asteptare sunt eliminate.
Exemplu: Se va considera o aplicatie care necesita anumite calcule care sa fie realizate iar rezultatele sa fie tiparite la o imprimanta linie. Dupa acest lucru se fac alte calcule care si ele vor trebui sa fie tiparite si asa mai departe. Programul va consta din doua proceduri, COMPUTE si PRINT. Se presupune ca COMPUTE genereaza n linii pentru functia PRINT care le va tipari. Acest program poate fi executat prin apeluri repetate ale functiei COMPUTE urmate de apeluri ale functiei PRINT. Imprimanta accepta doar cate o linie de text o data. Astfel, rutina de PRINT trebuie sa trimita o linie de text, sa astepte ca ea sa fie tiparita, dupa care sa trimita urmatoarea linie , pana cand toate rezultatele au fost tiparite. Dezavantajul acestei abordari este acela ca procesorul pierde o cantitate foarte mare de timp asteptand ca imprimanta sa devina Ready. Este posibila suprapunerea timpilor de tiparire si calcul, astfel ca, se poate executa procedura COMPUTE in timp ce imprimare are loc, rezultand in marirea vitezei generale de executie. Acest lucru se poate realiza in felul urmator: In primul rand, se executa rutina COMPUTE pentru a produce primele n linii de text. Dupa aceea se executa rutina PRINT pentru a trimite prima linie catre imprimanta. In acest punct, in loc sa se astepte tiparirea acestei linii, rutina PRINT se suspenda temporar. Acest lucru face posibila continuarea executiei rutinei COMPUTE. De fiecare data cand imprimanta devine ready, ea avertizeaza procesorul prin trimiterea unui semnal de intrerupere. Acest lucru determina procesorul sa intrerupa rutina COMPUTE si transfera controlul rutinei PRINT care trimite a doua linie spre imprimanta. Dupa aceasta, controlul revine rutinei COMPUTE, care isi continua executia din punctul in care a fost intrerupta. Acest proces continua pana cand toate cele n linii au fost tiparite.
Rutina de PRINT va fi repornita de fiecare data cand urmatorul se de n linii este disponibil pentru tiparire. Daca COMPUTE calculeaza cele n linii cam in tot atata timp cand dureaza tiparirea celor n linii atunci noile linii vor fi gata imediat dupa tiparirea primelor n.
Exemplu de mai sus a fost prezentat pentru a introduce conceptul de intreruperi. Rutina care este executata ca raspuns la o intrerupere se numeste rutina de tratare a intreruperii. In cazul de mai sus aceasta este rutina PRINT. Rutinele de tratare a intreruperilor seamana foarte mult cu apelurile de subrutine.