Documente Academic
Documente Profesional
Documente Cultură
Sistemul de intrare/ieșire
Cuprins
Introducere
Principiile fizice de organizare a i/o
Principiile logice de organizare a i/o
Planificarea cererilor
9.1. Introducere
Funcționarea oricărui sistem de calcul se referă de obicei la două tipuri de lucrări: procesarea
informației și operațiunile de citire-criere a acesteia. Deoarece tot ce se execută într-un sistem de
calcul este organizat ca un set de procese, aceste două tipuri de lucrări sunt efectuate de procese.
Procesele sunt implicate în prelucrarea informațiilor și efectuarea operațiunilor de i/o.
Conținutul conceptelor „procesarea informației” și „operațiuni de intrare-ieșire” depinde de
punctul de vedere din care le privim. Din punctul de vedere al programatorului, „procesarea
informațiilor” se referă la executarea instrucțiunilor procesorului pe datele din memorie,
indiferent de nivelul ierarhiei - în registre, cache, memorie de acces aleatoriu sau memorie
secundară. Prin „operații de i/o”, un programator se referă la schimbul de date între memorie și
dispozitive externe memoriei și procesorului, cum ar fi casete magnetice, discuri, monitor,
tastatură, timer. Din punct de vedere al SO, „procesarea informațiilor” sunt doar operațiunile
efectuate de procesor pe datele localizate în memorie la nivel de ierarhie nu mai jos decât
memoria RAM. Toate celelalte se referă la „operațiuni de i/o”. Pentru a efectua operații cu date
localizate temporar în memoria secundară, SO le pompează mai întâi în memoria RAM și apoi
procesorul efectuează acțiunile necesare.
Înainte de a vorbi despre funcțiile SO în timpul operațiilor de i/o, este necesar să reamintim
câteva informații din cursul „Modern Computer Architecture and Assembler Language” pentru a
înțelege modul în care informațiile sunt transferate între RAM și un dispozitiv extern și de ce
conectarea noilor dispozitive la sistemul de calcul nu necesită reproiectarea SO.
Există diferite dispozitive care pot interacționa cu procesorul și memoria: timer, hard disk-uri,
tastatură, mouse, modemuri, dispositive de intrare și afișare în simulatoare aerospațiale etc.
Unele dintre aceste dispozitive sunt încorporate în carcasa computerului, altele se află în afara
acestuia și comunică cu computerul prin diferite linii de comunicare: cablu, fibră optică, releu
radio, satelit etc. Tipul dispozitivelor și metodele de conectare ale acestora, sunt determinate de
obiectivele funcționării sistemului de calcul, dorințele și capacitățile financiare ale utilizatorului.
În ciuda diversității dispozitivelor, gestionarea activității lor și schimbul de informații cu acestea
se bazează pe un set relativ mic de principii.
Întreruperile software apar după executarea comenzilor speciale, de obicei pentru a efectua
acțiuni privilegiate în cadrul apelurilor de sistem. Întreruperile software au următoarele
proprietăți:
• O întrerupere software apare la execuția unei comenzi speciale.
• Atunci când execută o întrerupere software, procesorul își păstrează contextual înainte de
execuția următoarei instrucțiuni.
• Întreruperile software se produc în mod sincron cu procesorul și sunt absolut previzibile
de programator.
De menționat că implementarea mecanismelor de prelucrare a întreruperilor externe, a situațiilor
excepționale și a întreruperilor software revine în totalitate dezvoltatorilor de procesoare. Există
sisteme de calcul în care toate cele trei situații sunt tratate diferit.
Funcțiile driverelor
Dispozitivele sunt împărțite în funcție de tipul de interfață în următoarele tipuri:
• caracter (tastatură, modem, terminal etc.);
• bloc (discuri magnetice și optice, benzi etc.);
• de rețea (carduri de rețea);
• restul (timere, afișaje grafice, televiziune, camere video etc.).
Vom precăuta doar două grupuri de dispozitive: caractere și bloc. Așa cum am menționat în
secțiunea anterioară, dispozitivele de tip caractere sunt dispozitive care pot transmite date
numai secvențial, byte cu byte, iar dispozitivele bloc pot transmite un bloc de octeți în
ansamblu.
Dispozitivele de tip caractere sunt de obicei dispozitive de introducere a informațiilor, care
generează spontan date de intrare: tastatură, mouse, modem, joystick. Acestea includ, de
asemenea, dispozitive de ieșire a informațiilor, care se caracterizează prin reprezentarea datelor
sub forma unui flux liniar: imprimante, plăci de sunet etc. Prin natura lor, dispozitivele de tip
caractere pot efectua două operații generale: introducerea unui caracter (octet) și afișarea unui
caracter (octet) ) - get și put.
Pentru dispozitivele bloc, cum ar fi discurile magnetice și optice, benzi magnetice etc., sunt
caracteristice operațiile de citire și scriere a unui bloc de informații - read și write, precum și
pentru dispozitivele cu acces direct, operația de căutare a blocului necesar este – seek.
Driverele dispozitivelor de tip caractere și blocui trebuie să ofere subsistemului i/o de bază
funcții pentru efectuarea operațiunilor descrise. În afară de operațiile generale, unele dispozitive
pot efectua operațiuni specifice doar lor - de exemplu, plăcile de sunet pot crește sau scădea
volumul mediu de sunet, afișajele își pot schimba rezoluția. Pentru a efectua astfel de acțiuni
specifice, interfața dintre driver și subsistemul i/o de bază include, de obicei, o altă funcție care
să permită transmiterea direct driverului dispozitivului a unei comenzi arbitrare cu parametri
arbitrari, care să permită utilizarea oricărei caracteristici a driverului fără a schimba interfața. În
sistemul de operare Unix, o astfel de funcție se numește ioctl (de la input-output control).
Pe lângă funcțiile read, write, seek (pentru dispozitive bloc), get, put (pentru dispozitivele de tip
caractere) și ioctl, interfața mai include și următoarele funcții:
• Funcția de inițializare sau reinițializare a driverului și dispozitivului - open.
• Funcția de oprire temporară a lucrului dispozitivului - close.
• Funcția de sondare a stării dispozitivului (dacă, din anumite motive, lucrul cu dispozitivul
se realizează prin sondarea stării acestuia, de exemplu, în sistemele de operare Windows
NT și Windows 9x așa este organizat lucrul cu imprimanta prin portul paralel) - poll.
• Funcția de oprire a driverului, care se execută când sistemul de operare este oprit sau
driverul este descărcat din memorie, halt.
Numele funcțiilor de mai sus pot varia de la un sistem de operare la altul, dar acțiunile efectuate
de drivere sunt tipice pentru majoritatea sistemelor de operare, iar funcțiile corespunzătoare sunt
prezente în interfețele acestora.
De obicei, un buffer (tampon) este o anumită zonă de memorie pentru stocarea informațiilor la
schimbul de date între două dispozitive, două procese sau un proces și un dispozitiv. Schimbul
de informații între două procese aparține domeniului cooperării proceselor și am examinat în
detaliu organizarea lor la lecțiile precedente. Acum vom fi interesați de utilizarea bufferelor
atunci când unul dintre participanții la schimbul de date este un dispozitiv extern. Există trei
motive pentru utilizarea tampoanelor în subsistemul de i/o de bază.
• Primul motiv al bufferizării este viteza diferită de primire și transmitere a informațiilor pe
care participanții la schimb le au. Să analizăm, de exemplu, cazul transferului unui flux de
date de la tastatură la modem. Viteza cu care tastatura furnizează informații este
determinată de viteza de tastare de către persoană și este de obicei substanțial mai mică
decât viteza de transmitere a datelor de către modem. Pentru a nu ocupa modemul pe toată
durata tastării, ceea ce îl face inaccesibil pentru alte procese și dispozitive, este
recomandabil să se acumuleze informațiile introduse într-un tampon sau mai multe
tampoane de dimensiuni suficiente și să fie trimite către modem după umplerea
tampoanelor.
• Al doilea motiv al bufferizării - cantitățile diferite de date care pot fi primite sau trimise
de către participanții la schimbul simultan. Analizăm un alt exemplu. Fie că informațiile
sunt furnizate de modem și scrise pe hard disk. Pe lângă faptul că au viteze diferite de
operare, modemul și hard disk-ul sunt dispozitive de diferite tipuri. Modemul este un
dispozitiv de tip caractere și furnizează date byte cu byte, în timp ce discul este un
dispozitiv bloc și pentru operația de scriere trebuie să acumuleze blocul de date necesar în
buffer. De asemenea, se pot utiliza mai mult de un tampon. După completarea primului
buffer, modemul începe să completeze al doilea, în același timp cu scrierea primului pe
hard disk. Deoarece viteza hard disk-ului este de mii de ori mai mare decât viteza
modemului, până când cel de-al doilea tampon este complet, operația de scriere a primului
va fi finalizată, iar modemul va putea din nou să completeze primul tampon simultan cu
scrierea celui de-al doilea pe disc.
• Al treilea motiv pentru buffering este legat de necesitatea copierii informațiilor din
aplicațiile care efectuiază operații de i/o în bufferul nucleului sistemului de operare și
invers. Să presupunem că un anumit proces utilizator dorește să scrie informații din spațiul
său de adrese pe un dispozitiv extern. Pentru a face acest lucru, el trebuie să efectueze un
apel de sistem cu numele generic write, transmițând ca parametri adresa zonei de memorie
în care se află datele și volumul acestora. Dacă dispozitivul extern este temporar ocupat,
atunci este posibilă situația când, până la eliberarea sa, conținutul zonei de memorie să fie
corupt (de exemplu, la utilizarea unui apel de sistem asincron). Pentru a evita astfel de
situații, înainte de lansarea apelului de system - de copiat datele necesare în bufferul
nucleului sistemului de operare, care se află permanent în RAM și de a le transmite
dispozitivului din acest buffer.
Cuvântul cache (cache - „ rezervă”) reprezintă o regiune a memoriei rapide care conține o copie
a datelor situate undeva într-o memorie mai lentă, concepută pentru a accelera sistemul de calcul.
În subsistemul de i/o de bază, aceste două concept, buffering și caching, nu ar trebui confundate,
deși deseori aceeași zonă de memorie este alocată pentru a îndeplini ambele aceste funcții. Un
buffer conține adesea un singur set de date care există într-un sistem, în timp ce un cache prin
definiție conține o copie a datelor care există în altă parte. De exemplu, bufferul folosit de
subsistemul de bază pentru a copia date din spațiul procesului utilizatorului atunci când este
transmis pe disc poate fi, la rândul său, utilizat ca cache pentru aceleași date, dacă operațiile de
modificare și reluare ale acestui bloc sunt efectuate destul de des.
Funcțiile de bufferizare și de cachare nu trebuie obligator localizate în subsistemul i/o de bază.
Acestea pot fi parțial implementate în drivere și chiar în controlerele de dispozitive, în mod
ascuns pentu subsistemul de bază.
Un disc magnetic dur modern este un set de plăci rotunde amplasate pe aceeași axă și acoperite
pe una sau ambele părți cu un strat magnetic special (vezi fig. 2). În apropierea fiecărei suprafețe
de lucru a fiecărei plăci se află capetele magnetice pentru citirea și scrierea informațiilor. Aceste
capete sunt atașate de o pârghie specială care poate muta întregul bloc de capete pe suprafețele
plăcilor în ansamblu. Suprafețele plăcilor sunt împărțite în inele concentrice, în interiorul cărora,
de fapt, pot fi stocate informații. Setul de inele concentrice de pe toate plăcile pentru o poziție a
capului (adică toate inelele echidistante de axă) formează un cilindru. Fiecare inel din interiorul
cilindrului se numește pistă (una sau două pe placă). Toate pistele sunt împărțite într-un număr
egal de sectoare. Numărul de piste, cilindri și sectoare poate varia de la un hard disk la altul. De
obicei, un sector reprezintă cantitatea minimă de informații care poate fi citită de pe un disc la un
moment dat.
În timpul funcționării discului, setul de plăci se rotește în jurul axei sale cu viteză mare,
expunând pe rând toate sectoarele lor sub capetele pistelor corespunzătoare. Numărul sectorului,
numărul pistei și numărul cilindrului
determină în mod unic poziția datelor pe hard
disk și, împreună cu tipul de operațiune
efectuată - citire sau scriere, caracterizează
complet o parte din cererea asociată
dispozitivului, atunci când schimbul de date
se face de mărimea unui sector.
și toate capetele se vor deplasa cu 329 de cilindri. Eficiența algoritmului este bine ilustrată de
ultimele două mutări de la cilindrul 7 prin întregul disc la cilindrul 84 și apoi din nou pe întregul
disc până la cilindrul 10. O simplă înlocuire a ordinii ultimelor două mișcări (7 10 84) ar
reduce semnificativ timpul total de servire al cererilor. Prin urmare, să trecem la un alt algoritm.
și toate capetele se vor deplasa cu 141 de cilindri. Observăm că algoritmul dat este similar cu
algoritmul de planificare a proceselor SJF, dacă alegem distanța dintre poziția curentă a capului
și poziția necesară pentru a satisface cererea pentru analogul estimării în timp a următorului
proces de ocupare a procesorului. La fel ca algoritmul SJF, poate duce la o întârziere lungă la
planificarea unei solicitări. Trebuie reținut faptul că cererile din coadă pot apărea oricând. Dacă
toate solicitările, cu excepția uneia, sunt grupate în mod constant în zone cu număr mare de
cilindri, atunci această singură solicitare poate fi la coadă la nesfârșit.
Algoritmul SJF este optim pentru un set dat de procese cu timpi de procesare dat. Evident,
algoritmul SSTF nu este optim. Dacă mutăm cererea de service pentru al 67-lea cilindru între
solicitările cilindrilor 7 și 84, vom reduce timpul total de service. Această observație ne conduce
la ideea unei familii întregi de alți algoritmi - algoritmi de scanare.
În cel mai simplu algoritm de scanare - SCAN - capetele se mișcă constant de la o margine a
discului la cealaltă, servind toate solicitările din listă. La atingerea celeilalte margini, direcția
mișcării se schimbă și totul se repetă din nou. În exemplul precedent, fie la momentul inițial,
capetele se deplasează în direcția scăderii numărului cilindrilor. Apoi vom primi lista de
solicitări, obținută la sfârșitul secțiunii anterioare. Secvența de mișcare a capetelor este
următoarea: 63 55 31 23 14 10 7 0 67 84
Dacă știm că am servit ultima solicitare în direcția de mișcare a capetelor, atunci putem să nu
ajungem la marginea discului, ci să inversăm imediat direcția de mișcare:
63 55 31 23 14 10 7 67 84
iar capetele se vor deplasa cu 133 de cilindri. Modificarea rezultată a algoritmului SCAN se
numește LOOK.
Să presupunem că în algoritmul SCAN până la momentul în care capul ajunge la unul dintre
marginile discului, s-a acumulat un număr mare de solicitări noi la această margine și servirea lor
va dura mult timp (nu uitați că nu numai mișcați capul, dar transmiteți și datele citite!). Atunci,
cererile legate de cealaltă margine a discului și primite mai devreme vor aștepta în mod
nejustificat pentru a fi servite. Pentru a reduce timpul de așteptare pentru aceste solicitări, se
utilizează o altă modificare a algoritmului SCAN - scanare circulară. Când capul ajunge pe unul
dintre marginile discului, fără a citi cererile nou apărute (uneori mult mai repede decât atunci
când se efectuează o căutare normală a cilindrilor), acesta se deplasează pe cealaltă margine, de
unde începe să se deplaseze în aceeași direcție. Pentru acest algoritm, numit C-SCAN, secvența
de mișcare va arăta astfel:
63 55 31 23 14 10 7 0 99 84 67.
Concluzie
Funcționarea oricărui sistem de calcul se referă, de regulă, la două tipuri de lucrări: prelucrarea
informațiilor și operațiile de input-output.
O abordare „stratificată” este tipică pentru realizarea părții software a unui sistem de intrare /
ieșire. Driverele de dispozitiv sunt folosite pentru a interacționa direct cu hardware-ul. Driverele
de dispozitiv sunt conectate printr-o interfață strict definită la subsistemul i/o de bază. Accesul la
subsistemul i/o de bază se face prin apeluri de sistem.
Unele funcții ale subsistemului de bază pot fi delegate driverelor de dispozitive și dispozitivelor
de intrare/ieșire.