I. NOTIUNI DE SISTEME DE OPERARE
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. d7o20oz
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:
· 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.
II. STRUCTURA SISTEMULUI DE FISIERE DOS
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.
III. EDITOR DE TEXT
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.
IV. PROGRAMARE IN C
a) 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.
Tip Reprezentare (in biti) Rang char 8 -128÷127 unsigned char 8 0÷255 signed char 8 -128÷127 int 16 -32768÷32768 unsigned int 16 0÷65635 signed int 16 -32768÷32767 short int 16 -32768÷32767 unsigned short int 16 0÷65535 signed short int 16 -32768÷32767 long int 32 -2147483648÷2147483647 signed long int 32 -2147483648÷2147483647 unsigned long int 32 0÷4294967295 float 32 10-37÷10-37 (6 digiti precizie) double 64 10-308÷10-308 (10 digiti precizie) long double 80 10-4932÷10-4932 (15 digiti precizie)
b) 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.
c) 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).
A
// instructiunile functiei;
S
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.
d) 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:
1. Proceduri care definesc o valoare de revenire;
2. 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.
e) 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.
1. 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.
2. 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.
3. Inchiderea unui 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.
4. 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.
5. 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.
6. 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.
7. 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.