PRACTICA Un sistem de operare este un program care controleaza executia programelor de aplicatie si actioneaza ca o interfata intre utilizator si partea hardware a calculatorului. Scopul unui sistem de operare este de a rezolva problemele utilizatorului, adica de a executa programele de aplicatie. La executarea aplicatiilor concura atat partea hardware, cat si cea software a calculatorului. O parte din sistemul de operare este rezidenta in permanenta in memoria interna. Ea se numeste Kernel sau nucleu si contine functiile cele mai folosite ale sistemului de operare. Functiile sistemului de operare sunt: my644n8287myyk Administrarea proceselor crearea si terminarea proceselor; planificarea si administrarea proceselor; comutarea intre procese; sincronizarea proceselor si asigurarea comunicarii intre procese; administrarea blocurilor de control a proceselor. Administrarea memoriei: alocarea pentru proces a spatiului de adrese; asigurarea schimbului intre memoria interna si disc; administrarea segmentelor sau paginilor. Administrarea sistemului de intrare-iesire: administrarea bufferelor; alocarea la procese a canalelor de comunicatie si a modulelor de intrare-iesire. Suportul functiilor: administrarea intreprinderilor; monitorizarea; contabilizarea. Functia principala a unui sistem de operare este de a administra diferite resurse disponibile (memoria interna, procesoare, dispozitie de intrare-iesire) si de a planifica utilizarea lor de catre diferite procese active. Resursa este o componenta a sistemului de operare. Un program care consuma o resursa sau un utilizator care foloseste o resursa se numeste clientul resursei. Resursele fizice sunt componentele hardware ale calculatorului care au functii de prelucrare, pastrare sau transferare a informatiei. Din aceasta categorie fac parte procesorul, memoria interna, modulele de control ale operatiilor de intrare-iesire si dispozitivele periferice. Resursele fizice se pot clasifica in functie de modul in care sistemul de operare pune resursa la dispozitia clientului: Resurse fizice propriu-zise care reprezinta componente efective ale sistemului de operare care pot fi eventual partajate intre mai multe programe sau utilizatori. Resurse virtuale care sunt componente ale sistemului de operare pe care le pune la dispozitia clientului pentru a le folosi in exclusivitate. Resursele logice sunt componentele software ale calculatorului, care au functii de administrare a resurselor si a datelor, de planificare si executare a programelor de aplicatie, de organizare si de prelucrare a datelor. Din aceasta categorie fac parte programele si datele. Sistemele de operare sunt alcatuite in principal din doua categorii de programe: programe de comanda-control, avand rolul de coordonare si control al tuturor functiilor sistemului de operare; programe de servicii, care sunt executate sub supravegherea programelor de comanda-control si sunt utilizate de programator pentru dezvoltarea aplicatiilor. Programele de comanda-control sunt cunoscute si sub numele de monitoare, supervizoare sau executive, coordoneaza activitatea celorlalte componente ale sistemului de operare. Cel mai frecvent utilizate componente ale supervizorului sunt incarcate in memoria interna inca de la generarea sistemului de operare, celelalte componente raman in memoria externa fiind apelate si executate numai atunci cand sunt solicitate de catre nucleul sistemului de operare asemenea programului de aplicatie. Supervizorul initiaza executia operatiilor de intrare-iesire pentru transferul componentelor tranzitorii din memoria externa in memoria interna, fiind totodata responsabil de alocarea canalelor de intrare-iesire, de asemenea efectueaza controlul si coordonarea unitatii centrale de prelucrare CPU, pe parcursul receptionarii de mesaje de la canalele prin care se executa transferul, a executiei programelor din memoria interna, respectiv a transmiterii de mesaje catre dispozitivele periferice de intrare-iesire prin intermediul magistralelor. Folosind programul shell, utilizatorul poate sa comunice sistemului de operare activitatile pe care trebuie sa le execute, modul in care sunt delimitate activitatile, structura acestor activitati, resursele fizice si logice necesare pentru executarea lor si informatii despre seturile de date folosite. Evolutia sistemelor de operare a dus la descompunerea lucrarilor in procese pentru a se utiliza mai optim resursele sistemului de calcul. Aceste procese se pot executa reconventional sau concurent, in functie de logica lucrarii. Orice sistem modern de operare se bazeaza pe componenta Kernel pentru administrarea proceselor. Sistemul MS-DOS, raportat la alte sisteme de operare cunoscute (UNIX, OS/2, UMS, WINDOWS) are o dimensiune medie si o complexitate moderata, suporta un singur utilizator. Din punctul de vedere al controlului resurselor calculatorului, MS-DOS se comporta ca un manager de fisier decat ca un sistem de operare. Partea de management a fisierelor din nucleul MS-DOS este partea cea mai consistenta a MS-DOS. Ea asigura citirea si scrierea fisierelor. Daca nu este necesar accesul la un sector particular de pe disc, programele de aplicatie trebuie sa realizeze citirea si scrierea fisierelor prin intermediul nucleului MS-DOS. Un fisier este o colectie de inregistrari de acelasi tip care poate fi tratata ca un tot unitar de utilizatori sau de programele de aplicatie, identificarea lui facandu-se printr-un nume unic. Memorarea lui se face pe un suport de informatie. Sistemul de operare DOS accepta nume de fisiere de maxim 8 caractere, nu face diferenta intre litere mari si litere mici iar numele fisierului este format din doua parti separate prin punct. Organizarea logica a datelor in fisiere reprezinta definirea unor relatii intre inregistrarile unui fisier si pozitia inregistrarilor in fisier, astfel incat operatiile de intrare-iesire sa se execute cat mai rapid. In sistemul de operare MS-DOS, blocul fisierelor de pe disc se numeste cluster si este format dintr-un numar de sectoare aranjate continuu pe disc. Numarul de sectoare depinde de tipul discului si de capacitatea lui. Sistemul de operare permite diferite operatii prin care se poate asigura pastrarea informatiilor intr-un fisier si regasirea lor in vederea prelucrarii. Atunci cand mai multi utilizatori cer accesul la acelasi fisier, fie sa-l actualizeze, fie sa-l consulte, sistemul de operare sau sistemul de gestiune a fisierelor trebuie sa introduca o disciplina a accesului. Aceasta problema poate fi abordata fie prin a permite unui utilizator sa blocheze accesul altor utilizatori la fisierul pe care il actualizeaza, fie sa blocheze accesul celorlalti utilizatori numai la inregistrarea pe care o actualizeaza. Implementarea se poate face folosind mecanismul cititor-scriitor. Alocarea spatiului la fisiere se poate face static sau dinamic. O alocare statica presupune sa se cunoasca spatiul maxim necesar fisierului ca sa se poata stabili la crearea fisierului. In cazul in care spatiul se aloca dinamic unui fisier, alocarea se va face in portiuni de suport numite unitati de alocare. Evidenta atribuirii unitatilor de alocare la fisiere este pastrata intr-o tabela numita tabela de alocare a fisierelor. Un editor de text este un set de programe ce ofera posibilitatea introducerii, editarii si tiparirii de texte sub forma unor fisiere ASCII. Textele sunt alcatuite din caractere care se introduc de la tastatura, aparand in acelasi timp si pe monitor, erorile pot fi corectate foarte usor, deoarece acestea nu sunt inca tiparite pe hartie. Editorul de texte are ca activitate principala crearea de texte, impreuna cu hardware-ul, furnizeaza calea de urmat pentru vizualizarea, memorarea, editarea si regasirea textelor create. Editoarele de texte mai performante permit si introducerea elementelor de grafica in text. Deoarece documentatia de utilizare a editoarelor de texte este voluminoasa, proiectantii acestora au prevazut pentru cele mai frecvente functii un sistem de help ce consta in informatii minime, afisate de monitor, referitor la modul de lucru al functiei. Numele fisierului, pagina curenta, linia si coloana in care se afla cursorul sunt permanent afisate pe monitor in vederea orientarii utilizatorului, textul poate fi memorat pe suport magnetic, se poate folosi si modificarea dupa necesitati. Editoarele de texte sunt componente ale sistemului de operare cu cea mai mare frecventa de utilizare. In prezent exista o mare varietate de astfel de programe datorita capacitatii de a degreva utilizatorul de sarcini elementare, cum ar fi: despartirea in silabe, alinierea textelor, paragrafelor, titlurilor, sublinierea unor portiuni din text, cautarea unui sir de caractere si editarea acestuia, indexarea documentului, realizarea cuprinsului. Tipuri de date Tipuri de date de baza sunt char, int, float, double reprezentand caractere (1 byte), intregi cu semn, numere in virgula mobila in simpla si respectiv dubla precizie. Exista mai multi specificatori suplimentari de tip care se pot aplica acestor tipuri de date de baza, obtinandu-se tipuri noi. Pentru tipul int exista specificatori short si long, putand declara de exemplu: long int i; short int j; In aceste cazuri, int se poate omite, deci se poate scrie direct: long i; short j; Restrictiile impuse de standardul ANSI sunt: dim(short)>=16 biti; dim(int)>=16 biti; dim(long)>=32 biti; dim(short)<= dim(int)>= dim(long); Specificatorii signed si unsigned pot fi aplicati tipului char si oricarui tip de intregi (short, int si long). Variabilele de tip unsigned sunt considerate >=0, respectand regulile aritmeticii modulo 2n unde n este un numar de biti pe care e memorat tipul intreg respectiv. Variabilele de tip signed sunt in domeniul –2n-1...2m-1-1. Tipurile short, int si long sunt implicit cu semn, dar tipul char poate fi implicit cu semn sau fara semn, depinzand de implementare. Tipul long double specifica variabilele in virgula mobila extinsa. Apeland la o implementare uzuala a limbajului C pe echipamente PC, compatibile IBM sub sistemul de operare MS-DOS, tipurile de date diferite de standardul ANSI si recunoscute de limbaj cu reprezentarea din tabelul urmator. Variabile locale Variabilele locale, spre deosebire de cele globale, nu sunt valabile in tot programul. Ele au o valabilitate locala, in unitatea in care sunt declarate. Variabilele locale pot fi alocate stiva. In acest caz ele se numesc automatice. Acestea se declara in mod obisnuit, in scopul unei functii sau la inceputul unei instructiuni compuse. O astfel de variabila se aloca la executie (nu la compilare). La apelul unei functii, variabilele automatice (declarate in mod obisnuit inaintea primei instructiuni din corpul functiei respective) se aloca pe stiva. In momentul in care se revine din functie, variabilele automatice alocate la apel, se dezaloca (elimina) si stiva revine la starea dinaintea apelului (operatia de curatire a stivei). Aceasta inseamna ca variabilele automatice isi pierd existenta la revenirea din functia in care sunt declarate. De aceea, o variabila automatica este valabila (vizibila) numai in corpul functiei in care a fost declarata. In acelasi mod se comporta variabilele automatice declarate la inceputul unei instructiuni compuse. O astfel de variabila se aloca pe stiva in momentul in care controlul programului ajunge la instructiunea compusa in care este declarata variabila respectiva si se elimina de pe stiva in momentul in care controlul programului trece la instructiunea urmatoare celei compuse. Variabilele locale pot si sa nu fie alocate pe stiva. In acest scop ele se declara ca fiind statice. O declaratie de variabila statica este o declaratie obisnuita precedata de cuvantul cheie static. Variabilele statice pot fi declarate atat in corpul unei functii cat si in afara corpului oricarei functii. O variabila statica declarata in corpul unei functii este definita numai in corpul functiei respective. Spre deosebire de variabilele automatice, o variabila statica nu se aloca pe stiva la executie, ci la compilare intr-o zona de memorie destinata acestora. O variabila statica declarata in afara corpurilor functiilor este definita (vizibila) din punctul in care este declarata si pana la sfarsitul fisierului sursa care contine declaratia respectiva. Spre deosebire de variabilele globale, o astfel de variabila nu poate fi declarata ca externa. Deci ea nu poate fi utilizata in alte fisiere daca acestea se compileaza separat sau se include inaintea declaratiei respective. Putem spune ca o variabila statica declarata in afara corpurilor functiilor este locala fisierului sursa in care este declarata. Ea se aloca la compilare intr-o zona speciala rezervata variabilelor statice corespunzatoare fisierului sursa in care au fost declarate. Parametri formali Un parametru este o valoare transmisa unei functii. Cele mai multe dintre programe transmit parametri catre functia printf: printf(“valoarea este %d\n”, rezultat); Atunci cand se utilizeaza in mod regulat, se poate imbunatatii utilitatea transmitandu-le parametrii. Parametrii formali sunt numele parametrilor care apar in definitia functiei. In exemplul de mai jos varsta, salariu si nr_marca sunt parametri formali pentru functia info_angajat: void info_angajat (int varsta, float salariu, int nr_marca). { // instructiunile functiei; } Parametrii formali se aloca pe stiva ca si variabilele automatice. De aceea, ei se considera a fi variabile locale si sunt utilizabili numai in corpul functiei in antetul careia sunt declarati. La apelul unei functii, se aloca pe stiva parametri formali, daca exista, li se atribuie valorile parametrilor efectivi care le corespund. Apoi se aloca pe stiva variabilele automatice declarate la inceputul corpului functiei respective. La revenirea din functie, se realizeaza curatirea stive, adica sunt eliminate de pe stiva (dezalocate) atat variabilele automatice, cat si parametrii. In felul acesta, la revenirea din functie, stiva ajunge la starea dinaintea apelului. Proceduri Procedura trebuie sa exprime acelasi proces de calcul dar care se realizeaza cu date diferite. In acest caz, procedura trebuie realizata generala, facand abstractie de datele respective. Pentru a evalua expresia: 4**10-3**20 (1), putem construi o procedura pentru ridicarea la putere, care sa fie generala si sa faca abstractie de valorile efective pentru baza si exponent: 4 si 10 pentru prima ridicare la putere, 3 si 20 pentru cea de-a doua. Aceasta generalizare se realizeaza considerand ca fiind variabile atat baza cat si exponentul, iar valorile lor se precizeaza la fiecare apel al procedurii implementate in acest fel. Aceste variabile utilizate pentru a putea implementa o procedura generala si care se concretizeaza la fiecare apel al procedurii se numesc parametrii formali. In felul acesta, procedura apare ca un rezultat al unui proces de generalizare necesar implementarii ei. In toate limbajele de programare se considera 2 categorii de proceduri: Proceduri care definesc o valoare de revenire; Proceduri care nu definesc o valoare de revenite. Procedurile din prima categorie se numesc functii. Valoarea de revenire se mai numeste si valoarea de intoarcere sau valoarea returnata de functie. Procedura pentru calculul ridicarii la putere este un exemplu de functie. Ea are ca parametrii baza si exponentul, iar ca valoare de intoarcere sau returnata, rezultatul ridicarii valorii bazei la valoarea exponentului, valori care sunt definite la apel. In limbajele C si C++ atat procedurile din prima categorie cat si cele din cea de-a doua se numesc functii. Deci, in aceste limbaje distingem functii care returneaza o valoare la revenirea din ele, precum si functii care nu returneaza nici o valoare. O functie are o definitie si atatea apeluri intr-un program, cate sunt necesare. O definitie de functie are formatul: antet corp unde: - antet – are formatul: tip nume (lista declaratiilor parametrilor formali); - corp – este o instructiune compusa. Tip este cuvantul cheie void pentru functii care nu returneaza nici o valoare la revenirea din ele. Apelul unei functii trebuie sa fie precedat de definitia sau de prototipul ei. Prototipul unei functii contine informatii asemanatoare cu cele din antetul ei: tipul valorii returnate; numele functiei; tipurile parametrilor. El poate avea acelasi format ca si antetul functiei, in plus este urmat de punct si virgula. Operatii cu fisiere Operatiile de prelucrare a fisierelor se executa utilizandu-se functii specializate de gestiune a fisierelor. De asemenea, fiecarui fisier i se ataseaza o structura de tip FILE. Acest tip este definit in fisierul stdio.h. De asemenea, toate functiile din aceasta clasa are prototipurile in fisierul stdio.h. Deschiderea unui fisier Pentru a deschide un fisier la acest nivel de prelucrare a fisierelor se utilizeaza functia fopen. Ea returneaza un pointer spre tipul FILE (tipul fisierului) sau pointerul nul in caz de eroare. Prototipul functiei este urmatorul: FILE *fopen(const char * calea, const char * mod); unde: - calea – are aceeasi semnificatie ca si in cazul functiei open adica este un pointer spre un sir de caractere care defineste calea spre fisierul care se deschide; - mod – este un pointer spre un sir de caractere care defineste modul de prelucrare al fisierului dupa deschidere, acest sir de caractere se defineste astfel: “r” – deschidere pentru citire; “w” – deschidere pentru scriere; “a” – deschidere pentru adaugare; “r+” – deschidere pentru modificare citire-scriere; “rb” – deschidere pentru citire binara; “wb” – deschidere pentru scriere binara; “r+b” – deschidere pentru citire-scriere binara. Cu ajutorul functiei fopen se poate deschide un fisier inexistent in modul w sau a. In acest caz, fisierul respectiv se considera in creare. Daca se deschide un fisier existent in modul w, atunci se va crea din nou fisierul respectiv si vechiul continut al sau se va pierde. Deschiderea unui fisier in modul a permite adaugarea de inregistrari dupa ultima inregistrare existenta in fisier. Prelucrarea pe caractere a unui fisier Fisierele pot fi scrise si citite caracter cu caracter folosind doua functii simple putc –pentru scriere; getc –pentru citire. Functia putc are prototipul: int putc(int c, FILE *fp); unde: - c – codul ASCII al caracterului care se scrie in fisier; fp – un pointer spre tipul FILE a carui valoare a fost returnata de functia fopen la deschiderea fisierului in care se face scrierea; In particular fp poate fi (stdont, stderr, stdprn, stdaux). Functia putc returneaza valoare lui c sau –1 la eroare. Functia getc are prototipul: int getc(FILE *fp); unde: - fp – un pointer spre tipul FILE a carui valoare a fost definita la apelul functiei fopen. In particular fp poate fi (stdin, stdoux). Functia putc returneaza codul ASCII al caracterului citit din fisier. Dupa terminarea prelucrarii unui fisier, acesta urmeaza a fi inchis. Inchiderea unui fisier se realizeaza cu ajutorul functiei fclose de prototip: int fclose(FILE *fp); unde: - fp –este pointerul spre tipul FILE. Valoarea lui a fost definita prin functia fopen la deschiderea fisierului. Functia returneaza valorile: 0 –la inchidere normala; -1 –la eroare. Intrari/iesiri de siruri de caractere Biblioteca standard a limbajului C contine functiile fgets si fputs care permit citirea, respectiv scrierea, inregistrarilor care sunt siruri de caractere. Functia fgets are prototipul: char *fgets(char *s, int n, FILE *fp); unde: - s –este pointerul spre zona in care se pastreaza caracterele citite din fisier; - n –este dimensiunea in octeti a zonei in care se citesc caracterele din fisier; - fp –este pointerul spre tipul FILE a carui valoare s-a definit la deschiderea fisierului. Citirea caracterelor se intrerupe la intalnirea caracterului “\n” sau dupa citirea a cel mult n-1 caractere. In zona spre care pointeaza s se pastreaza caracterul “\n” daca acesta a fost citit din fisier, iar apoi se memoreaza caracterul nul (“ \0”). In mod normal, functia returneaza valoarea pointerului s. La intalnirea sfarsitului de fisier functia returneaza valoarea 0. Functia fputs scrie un sir de caractere intr-un fisier. Ea are prototipul: int fputs (const char *s, FILE *fp); unde: - s – este pointerul de la inceputul zonei de memorie care contine sirul de caractere care se scrie in fisier. - fp – este pointerul spre tipul FILE a carui valoare a fost definita la deschiderea fisierului prin apelul fopen. Functia fputs returneaza codul ASCII al ultimului caracter scris in fisier sau –1 la eroare. Aceste doua functii sunt similare cu functiile gets si puts. Intrari iesiri cu format (I/O) Biblioteca standard a limbajului C contine functii care permit realizarea operatiilor de I/O cu format. In acest scop se pot utiliza functiile fscanf, fprintf. Acestea sunt similare cu functiile sscanf, respectiv sprintf. Diferenta dintre ele consta in faptul ca fscanf si fprintf au ca prim parametru un pointer spre tipul FILE, iar sscanf si sprintf au ca prim parametru un pointer spre o zona in care se pastreaza caractere. Astfel fscanf citeste date dintr-un fisier si le converteste, in timp ce sscanf realizeaza acelasi lucru dar utilizand date din memorie. Functia fprintf converteste date din format intern in format extern si apoi le scrie intr-un fisier, spre deosebire de functia sprintf care realizeaza acelasi lucru dar rezultatele se pastreaza in memorie. Prototipul functiei fscanf: int fscanf(FILE *fp, const char *format, ...); unde: - fp – este pointer spre tipul FILE a carui valoare a fost definita prin apelul functiei fopen. Prototipul functiei fprintf: int fprintf(FILE *fp, const char *format, ...); unde: - fp – este pointer spre tipul FILE. Pozitionarea intr-un fisier Limbajul C contine functia fseek care permite deplasarea capului de citire-scriere al discului in vederea prelucrarii inregistrarilor fisierului intr-o ordine diferita de cea secventiala. Prototipul functiei fseek: int fseek(FILE *fp, long deplasament, int origine); unde: - fp – este pointer spre tipul FILE care defineste fisierul in care se face pozitionarea capului de citire-scriere. Stergerea unui fisier Un fisier poate fi sters apeland functia unlink. Aceasta are prototipul: int unlink(const char *calea); unde: - calea – este pointer spre un sir de caractere identic cu cel utilizat la crearea fisierului in functia fopen.
CUPRINS
I. NOTIUNI DE SISTEME DE OPERARE
II. STRUCTURA SISTEMULUI DE FISIERE DOS
III. EDITOR DE TEXT
IV. PROGRAMARE IN C
Inchiderea unui fisier