"Mariajul" enunturilor read/write

Operatiile input/output sunt mult mai lente decât operatiile de calcul. În mod evident, calculatoarele mari nu pot astepta cât timp dureaza operatiile de I/O. Este ca si cum, telefonându-i lui Andrei, astazi la ora 15, ar trebui sa asteptam pâna a doua zi pentru a auzi în receptor "Nu, aici este Daniel".

Astfel, un calculator (profesional) folosit simultan de mai multi utilizatori va trece la alte prelucrari de îndata ce este trimis un read sau un write si nu se va întoarce la programul care trimite asemenea instructiuni pâna când operatiunea de I/O dorita nu este terminata. Aceasta se întâmpla fara ca utilizatorul programului sa-si dea seama - sistemul de operare realizeaza întreaga coordonare.

De cele mai multe ori, cea mai mare parte a timpului pierdut pentru operatiile de I/O este timpul afectat citirii unei benzi magnetice, a unei dischete, a unui CD-ROM etc. Timpul suplimentar este dat de întârzierea necesara pentru punerea în functiune a perifericului si apoi aducerea acestuia într-o pozitie corespunzatoare pentru citire sau scriere (de exemplu, depistarea cilindrului si a sectorului pentru o unitate de hard-disk). Din moment ce operatiile de I/O sunt asa de scumpe, un sistem eficient va citi sau va scrie un numar mare de caractere (vezi cazul fisierelor cu înregistrari blocate), chiar atunci când programul cere unul sau un numar mic de caractere ce urmeaza a fi prelucrate. Restul (excesul) de caractere este pastrat într-o zona de memorie numita buffer, asa cum apa este tinuta în rezervoare pe timpul secetei. Odata ce buffer-ul este umplut, majoritatea operatiilor read(ch) sunt foarte rapide, din moment ce ele reprezinta numai transferari memorie - memorie, între buffer si zona de memorie adresata identificatorului ch (caracter). Numai când ultimul caracter este citit în buffer, acesta trebuie reumplut, operatia efectuându-se mult mai repede atunci când caracterele se citesc nu separat - caracter cu caracter, ci într-un bloc de caractere. Evident, umplerea si golirea buffer-ului influenteaza "mersul" programului.

Prezentam în continuare, alte doua secvente de program.

...
writeln('varsta:');
read(varsta);
...
...
write('varsta:');
read(varsta);
...

Raspunsurile posibile sunt :

varsta:
47
varsta:47

Remarca.

În operatia de introducere de date se recomanda ca enunturile read sa fie precedate de enuntul write (writeln) pentru a facilita interactivitatea om-calculator. Asadar, mariajul read/write trebuie sa aiba loc în realizarea programelor interactive.

În încheierea conversatiei noastre va invitam sa tastati si sa executati doua programe. Începeti cu programul dialog1.

PROGRAM dialog1;
VAR
...n:integer;
BEGIN
...WHILE NOT eof DO
...BEGIN
......writeln('Introduceti un numar');
......readln(n);
......writeln('Ati introdus numarul',n)
...END;
...writeln('sfarsitul sesiunii de lucru')
END {dialog1}.

Va rugam, urmariti aparitia cursorului, realizarea testului de eof si enuntul readln(n). Ce se întâmpla daca plasati un enunt read înainte de testul eof ? Lasam calculatorul sa va lamureasca acolo unde apar întrebari.

Si-acum va sugeram sa tastati si sa executati programul dialog2 pe care vi-l recomandam pentru scrierea programelor interactive în orice dialect PASCAL (în afara de UCSD PASCAL).

PROGRAM dialog2;
VAR
...n:integer;
...BEGIN
......writeln('Introduceti un număr');
......WHILE NOT eof DO
......BEGIN2
.........readln(n);
.........writeln('Ati introdus numarul ',n)
......END;
...writeln('sfarsitul sesiunii de lucru')
END {dialog2}.