Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Comunicatii generale in retea - Test SHARE instalat

retele calculatoare



+ Font mai mare | - Font mai mic



Comunicatii generale in retea

Ori de cate ori este posibil se va evita scrierea de cod care utilizeaza facilitati specifice unui anumit furnizor de subansamble si componente LAN. Exista totusi situatii in care este necesara scrierea de cod specific. PC DOS nu ofera o modalitate standard sigura de testare a prezentei unui soft de retea. Deoarece aplicatia trebuie sa testeze acest lucru sunt necesare teste ale instalarii, specifice pentru diferite retele. La crearea unui fisier intr-o retea NetWare, acesta primeste automat atributul "nonshareable". Pentru a modifica acest atribut trebuie apelata o functie specifica din NetWare. Cand shellul NetWare detecteaza terminarea unui program, inchide toate fisierele, elibereaza semafoarele pentru excludere mutuala, etc. Exista situatii de memorie insuficienta pentru executia mai multor functii la cel mai inalt nivel posibil. De exemplu, pentru a lucra simultan cu SPX, IPX si NetBIOS, se poate executa NetBIOS intr-o retea NetWare numai daca exista memorie suficienta pentru emulatorul NetBIOS. Exista situatii in care, din diferite motive, compatibilitatea este redusa. De exemplu, sunt situatii in care este necesar sa se lanseze PC DOS pe File Server, caz in care se strica compatibilitatea cu Novell.



Pentru salvare/restaurare de fisiere, in cazul in care File-Serverul este dotat cu banda Streamer, trebuie utilizat software-ul asociat, sub DOS. Nu trebuie memorate informatii de configurare a retelei de catre utilizator in fisiere executabile, deoarece aceasta creeaza doua probleme :

- nu se pot pastra informatii individuale pentru fiecare utilizator de retea

- nu se poate marca fisierul respectiv ca read-only sau shareable. Solutia este crearea unor fisiere separate cu datele privind configuratii.

Pentru a detecta daca este sau nu instalata o retea locala, trebuie executate teste specifice sau diferite combinatii ale acestora.

Test SHARE instalat

Programul SHARE.EXE se ataseaza intreruperii DOS 2FH, denumita 'intrerupere multiplexata'. Aceasta a fost adaugata la PC DOS 3.0 si daca este invocata la versiuni mai mici, programul apelant se blocheaza. Conventiile de apel arata ca registrul AH trebuie sa contina numarul de multiplexare, care identifica un anumit program de tratare a intreruperii, iar registrul AL va fi incarcat cu functia specifica ce trebuie executata. Pentru programul SHARE.EXE, numarul de multiplexare este 10H, iar functia care testeaza daca este instalat este 0. Daca SHARE este instalat, la reintoarcere AL contine 0FFH.

#include <stdio.h>

#include <dos.h>

void main(void)

else

}

Testare Unitate de Disc Retea

0 alta modalitate de a detecta o retea locala instalata consta in apelul functiei DOS IOCTL (functia 44H subfunctia 9). Prin aceasta functie se testeaza daca o unitate de disc logica este locala sau la distanta. Numarul unitatii logice se transfera in registrul BL (codificarea fiind urmatoarea : unitatea curenta este 0, A: este 1, B: este 2, C: este 3 ). Dupa apel, daca bitul 12 din registrul DX este 1, unitatea logica este la distanta. Ca exemplu, sa executam acest test pentru toate discurile hard posibile, de la C pina la Z, cautindu-se cel putin un disc la distanta.

#include <stdio.h>

#include <dos.h>

void main(void)

Exista o problema in legatura cu aceasta metoda : IOCTL nu face diferenta dintre un disc (drive) de retea si un CDROM. Programele de I/E pentru CDROM utilizeaza aceleasi informatii DOS interne pe care le utilizeaza si reteaua pentru a identifica unitati la distanta. Exista o functie MSCDEX, functia 15H subfunctia 0, care este o intrare pentru INT 2FH. Aceasta reintoarce numarul de unitati logice CDROM in registrul BX. Daca BX=0 dupa apel, nu exista unitati CDROM. Daca BX diferit de 0, CX contine primul disc CDROM (D: = 3, E: = 4 etc.).

Test de instalare NetBIOS

Exista multe retele care se bazeaza pe NetBIOS. Pentru a testa daca NetBIOS este instalat, se trimite in mod deliberat o comanda incorecta si se testeaza raspunsul. Se utilizeaza o structura NCB (NetWork Control Block), asa cum este ceruta de NetBIOS.

#include <stdio.h>

#include <dos.h>

#include <process.h>

#include <mem.h>

#define USGC unsigned char

#define USGI unsigned int

#define USGL unsigned long

typedef struct _ncb

NCB; /* prototype NCB for sizeof calcs */

NCB test_ncb;

void interrupt (*int_5C_vector)(void);

Apel NetBios , prin intermediul INT 5C */

void NetBIOS(NCB far *ncb_ptr)

void main(void)

memset(&test_ncb, NULL, sizeof(NCB));

test_ncb.Ncb_Command=0x7F;

NetBIOS(&test_ncb);

if(test_ncb.Ncb_RetCode != 3)

Test de instalare NetWare

Acest test cere programului Netware Shell informatii privind versiunea. Codul de apel al functiei este 0EAH (in registrul AH) si subfunctia are codul 1 (in registrul AL). BX este initializat cu 0, iar ES:DI se incarca cu un pointer de tip far spre un tampon de primire a raspunsului (sunt necesari 50 de octeti). La revenire, BX contine informatii privind versiunea, iar daca este 0, inseamna ca NetWare Shell nu este instalat.

#include <stdio.h>

#include <dos.h>

void main(void)

Test de instalare PC LAN

Programul PC LAN utilizeaza, de asemenea, intreruperea multiplexata (2FH), numarul de multiplexare al sau este 0B8H si testul de instalare se face similar ca si pentru programul SHARE. Daca la reintoarcere din intreruperea 2FH, avem AL=0, programul PC LAN nu este incarcat.

#include <stdio.h>

#include <dos.h>

void main(void)

else

}

Test prezenta retea locala particulara

Exista anumite limite privind testele de indicare a prezentei unei retele locale. De exemplu, DOS 4.0+ incarca SHARE automat, chiar pentru un PC independent, deoarece acest program este necesar pentru utilizarea in comun a unui fisier pentru mai multe taskuri. Testul de prezenta a unor unitati de discuri de tip retea este excelent, deoarece, printr-un raspuns afirmativ, acest test indica prezenta unui File Server. Se poate defini astfel un test pentru o retea particulara, in general retele de cost scazut, astfel :

- SHARE trebuie instalat pentru a permite accesul la fisiere si inregistrari

- testul de prezenta a unitatilor de disc de retea trebuie sa indice cel putin o unitate la distanta, daca nu, NetBIOS trebuie sa fie operational pe statia de lucru.

Identificarea unei statii de lucru

Dupa ce s-a obtinut asigurarea ca aplicatia se executa in retea, este necesar sa se identifice statia. In general, aceasta se face prin atribuirea unui nume masinii, metoda suportata de PC DOS. Exista doua dezavantaje ale acestei metode :

- daca o statie de lucru se lanseaza totdeauna sub un anumit nume, acest nume identifica statia ca atare si nu utilizatorul care lucreaza la statie

- in unele retele locale mai multe statii pot avea acelasi nume de masina, sau o statie pur si simplu nu mai are nici un nume.

Solutia ambelor probleme consta in executia unui program care pune in corespondenta identitatea utilizatorului cu numele unic al masinii. Pentru a testa daca fiecare nume de masina este unic se trimite un mesaj simplu in retea si fiecare statie care-si recunoaste numele va trimite raspunsul 'present'. Aceasta tehnica este specifica retelelor care utilizeaza NetBIOS.

ID Utilizator sub NetWare

Pe linga numele masinii, care este setat printr-o comanda in LOGIN SCRIPT, NetWare are un mecanism propriu de identificare a utilizatorilor, printr-un proces in doua etape :

- mai intai se afla numarul de conexiune al statiei atribuit de File Server in momentul in care se face LOGIN

- acest rezultat este utilizat pentru a obtine informatii despre acel numar de conexiune, inclusiv ID-entificatorul utilizatorului, denumit nume de obiect.

Primul pas se face prin apelarea functiei GetConnection Number. Pentru a face acest apel, in AH se introduce 0DCH si apoi se apeleaza INT 21H. In AL se reintoarce numarul conexiunii, intre 1 si 100.

regs.h.ah=0xDC;

int86(0x21, &regs, &regs);

connect_num=regs.h.al;

Al doilea pas consta in apelarea functiei GetConnection Information. Pentru apel trebuie furnizate adresele a doua tampoane : primul este un tampon, de cerere de 40 de octeti

struct

request_buffer;

Cealalta zona este un tampon de raspuns de 63 de octeti.

struct

reply_buffer;

Apelul efectiv consta in scrierea codului functiei 0E3H in AH si a indicatoarelor spre cele doua tampoane in perechile de registre DS:SI - request_buffer si ES:DI - reply_buffer, iar apoi se executa INT 21 H.

#include <stdio.h>

#include <dos.h>

void main(void)

request_buffer;

struct reply_buffer;

regs.h.ah=0xDC;

int86(0x21, &regs, &regs);

connect_num=regs.h.al;

request_buffer.request_length=2;

request_buffer.subfunction=0x16;

request_buffer.buffer_connect_num=connect_num;

reply_buffer.reply_length=61;

regs.h.ah=0xE3;

sregs.ds=FP_SEG((void far*)&request_buffer);

regs.x.si=FP_OFF((void far*)&request_buffer);

sregs.es=FP_SEG((void far*)&reply_buffer);

regs.x.di=FP_OFF((void far*)&reply_buffer);

int86x(0x21, &regs, &regs, &sregs);

printf(' ID utilizator este %sn' , reply_buffer.object_name);

printf(' %s s-a conectat la ' ,reply_buffer.object_name);

printf(' an: %d' ,reply_buffer.login_time[0]);

printf(' luna: %d' ,reply_buffer.login_time[1]);

printf(' zi: %d' ,reply_buffer.login_time[2]);

printf(' ora: %d' ,reply_buffer.login_time[3]);

printf(' min: %d' ,reply_buffer.login_time[4]);

printf(' sec: %d' ,reply_buffer.login_time[5]);

printf(' sutimi: %d' ,reply_buffer.login_time[6]);

printf(' n');

La intoarcere, numele obiectului este transmis in tamponul de raspuns si poate fi tratat ca un sir obisnuit.

printf(' ID utilizator este %sn' , reply_buffer.object_name);

Metode de sincronizare si control

Sistemul de operare NetWare este multiutilizator si multitasking. Din punctul de vedere al programatorului, un sistem multiutilizator trebuie sa asigure urmatoarele trei elemente :

1) o modalitate de identificare a fiecarui utilizator, pentru ca programele sa stie cu cine comunica

2) mecanisme de control, pentru a determina daca o aplicatie poate sa foloseasca fisiere in mod concurent cu alti utilizatori, sau aplicatia trebuie sa aiba acces exclusiv

3) pentru acele fisiere care sunt folosite in mod concurent trebuie furnizate functii de excludere mutuala pe durata unor operatii elementare cu fisierul sau cu o parte a sa

In plus fata de aceste trei functii generale, sistemele de operare pentru retele locale trebuie sa ofere un mecanism care sa determine daca un PC este intr-o retea locala. Sistemul de operare NetWare permite utilizarea concurenta a intregului disc din File Server sau a unor subdirectoare definite pe acesta. Sa consideram ca doua statii de lucru, A si B, executa doua programe diferite si ca amindoua programele trebuie sa actualizeze aceleasi doua fisiere din File Server. Amandoua programele trebuie sa blocheze accesul la cele doua fisiere pentru a le actualiza. Ambele programe ajung in acelasi timp in punctul in care vor sa actualizeze cele doua fisiere. Secventa de evenimente este urmatoarea :

1 - Programul A blocheaza fisierul 1

2 - Programul A scrie datele din fisierul 1, care trebuie sa fie reflectate in fisierul 2

3 - Programul B blocheaza fisierul 2

4 - Programul B scrie datele in fisierul 2, care trebuie sa fie reflectate si in fisierul 1

5 - Programul A incearca blocarea accesului la fisierul 2, cerere respinsa

6 - Programul B incearca blocarea accesului la fisierul 1, rezulta o blocare definitiva (deadlock)

Pentru a elimina interblocarea definitiva, de cele mai multe ori este necesara repornirea si initializarea statiilor, care insa lasa date inconsistente in fisierele care erau deschise in acelasi moment. In cele ce urmeaza se da un exemplu de procedura care realizeaza deschiderea fisierului PRIVATE.FIL pentru accesul exclusiv in Turbo C :

handle = open('PRIVATE.FIL', O_RDWR | O_DENYALL);

if (handle == -1)

Sincronizarea cu procese de citire-scriere

Problema proceselor de citire/scriere arata ca pot fi mai multe citiri simultane, dar o singura scriere poate sa fie efectuata la un moment dat asupra unui fisier. In exemplul de mai jos, tratarea erorilor se face la fel ca in exemplul precedent :

handle = open ('ONEWRITE.FIL',O_RDWR | O_DENYWRITE);

Desigur, celelalte statii pot cere deschiderea fisierului pentru citire astfel :

handle = open('ONEWRITE.FIL', O_RDONLY | O_DENYNONE);

Acces concurent

Daca se doreste control la nivel de inregistrare pentru accesul concurent la fisiere, fisierul trebuie deschis in mod D_NONE.DENYNONE.

open ('SHARE.FIL' , O_RDWR | O_DENYNONE);

In tabelul urmator se arata relatia dintre modurile de acces si modurile de utilizare concurenta a fisierelor.

Utilizarea concurenta a fisierelor NetWare

NetWare adauga un set de functii care completeaza PC-DOS-ul cu 'Servicii de sincronizare'. Aceste servicii Novell constau in :

- marcarea fisierelor care trebuie blocate pentru acces

- blocarea pentru acces a setului de fisiere

- eliberarea fisierelor dupa acces

- stergerea listei fisierelor marcate

Accesul la functii NetWare din limbaj de asamblare

Toate functiile NetWare sunt apelabile prin intermediul intreruperii software INT 21H, asemenea majoritatii functiilor DOS. Subfunctiile folosite se afla in domeniul B6H-F3H. Aceste functii utilizeaza rutine din modulul shell al retelei (NETX.COM). Apelul lor in absenta modulului shell va provoca o eroare de functie inexistenta.

Tipurile de date folosite in cadrul retelei sunt :

- BYTE - 8 biti

- WORD -16 biti, in ordinea 'High-Low' a octetilor

- DWORD - 32 biti, in ordinea 'High-Low' a cuvintelor

O atentie deosebita trebuie acordata faptului ca ordinea octetilor, respectiv a cuvintelor, este inversa celei obisnuite in reprezentarea acelorasi tipuri de date in PC-uri. Singurele exceptii sunt lungimile tampoanelor de eroare si de raspuns. Este, deci, responsabilitatea programului ce apeleaza aceste functii sa realizeze conversia, in formatul cerut de retea, a datelor de tip WORD si DWORD, inainte de apel. De asemenea, valorile WORD si DWORD, intoarse de functiile NetWare ca raspuns, vor trebui convertite de programul de aplicatie in formatul intern al calculatorului pe care se lucreaza, inainte de folosirea lor. Unele functii NetWare necesita pentru transferul de parametri doua tampoane, unul de cerere si altul de raspuns. Adresele acestor tampoane se transmit prin registre. Tamponul de cerere contine informatii ce vor fi trimise pe retea. Tamponul de raspuns contine informatii furnizate de retea ca raspuns. In cadrul acestor tampoane nu trebuie sa existe octeti nefolositi (ce ar putea rezulta din alinierea datelor de tip WORD sau DWORD). Toate tipurile de date, inclusiv tamponul in sine, sunt aliniate la nivel de octet. Acest lucru devine foarte important atunci cand se doreste apelarea functiilor din limbaje de nivel inalt, caz in care alocarea structurilor de date este specifica compilatorului folosit. Adresa tamponului de cerere este transmisa prin perechea de registre DS:SI. Primii doi octeti din acest tampon trebuie sa contina numarul de octeti al restului pachetului. Aceasta valoare nu va include primii doi octeti. Acest cuvant trebuie specificat in formatul specific calculatorului 'Low-High' (singura exceptie de la regula de mai sus). Adresa tamponulul de raspuns este transmisa prin perechea de registre DS:SI. Primii doi octeti din acest tampon trebuie sa contina numarul de octeti rezervati pentru restul pachetului. Aceasta valoare este folosita de shell si trebuie sa fie suficient de mare pentru a putea cuprinde raspunsul dat de retea. Lungimea tamponului de raspuns trebuie initializata totdeauna cu numarul de octeti rezervati in acest scop, chiar daca shell-ul nu intoarce nimic ca raspuns. Serviciile de comunicatie prin mesaje permit programelor de aplicatie :

sa emita mesaje de 1 pana la 55 de octeti in vederea difuzarii la mai multe destinatii

sa stabileasca unul sau mai multe canale de mesaje cu anumite statii de lucru, legate la acelasi server

Un astfel de canal ofera posibilitatea transmiterii de mesaje de 1 pana la 126 de octeti. Difuzarea de mesaje si comunicatia prin canale folosesc serverul ca intermediar. Pentru serviciile de difuzare a mesajelor, fiecare conexiune a unui File Server are asociat un buffer de 55 de octeti. Pentru serviciul de comunicatie prin canale, serverul mentine pentru fiecare conexiune o coada de mesaje (capacitatea maxima a cozii este de 6 mesaje). In mod normal, odata ce o conexiune trimite un mesaj spre difuzare catre o alta conexiune, acesta este depus in coada de mesaje primite ale conexiunii destinatare, de unde este preluat de shell-ul statiei destinatare si afisat pe linia cea mai de jos (a 25-a linie) a ecranului. Functiile de comunicare prin mesaje sunt folosite de programele utilitare SEND, CASTON si CASTOFF, care se folosesc pentru a emite mesaje in vederea difuzarii, a permite sau a inhiba receptionarea mesajelor difuzate.

Functii puse la dispozitie de Shell, pentru transmiterea mesajelor :

E1h(09h) - BroadcastToConsole - trimite un mesaj care va fi afisat la consola serverului implicit

E1h(08h) - CheckPipeStatus - determina starea unuia sau a mai multor canale de mesaje

E1h(07h) - CloseMessagePipe - inchide unul sau mai multe canale de mesaje

E1h(01h) - GetBroadcastMessage - preia un mesaj transmis prin difuzare. Apelarea acestei functii are sens numai daca modul de tratare a mesajelor difuzate este 2 sau 3

DEh(04h) - GetBroadcastMode - permite aflarea modului curent de tratare a mesajelor difuzate

E1h(05h) - GetPersonal Message - preia un mesaj din coada de mesaje asociata statiei de lucru

E3h(ODh) - LogNetworkMessage - depune un mesaj in fisierul NET$LOG.MSG al serverului implicit. Inregistrarea din fisier va avea urmatorul format :

luna/zi/an ore:minute STN

numar_statie: mesaj

Functia poate fi utilizata de utilitare sau de programe de aplicatie care au nevoie sa inregistreze informatii, de exemplu cu scopul de a le folosi pentru contabilitate.

E1h(06h) - OpenMessagePipe - creaza o jumatate de canal de comunicatie intre statia de lucru si una sau mai multe conexiuni. Cealalta jumatate a canalului (canalelor) trebuie create de conexiunea (conexiunile) destinatara, cu ajutorul aceleiasi functii.

E1h(00h) - SendBroadcastMessage - trimite un mesaj spre difuzare la un numar de conexiuni de pe acelasi server

E1h(04h) - SendPersonalMessage - trimite un mesaj catre una sau mai multe conexiuni cu care statia de lucru a deschis canale de mesaje

0DEh - SetBroadcastMode - stabileste modul in care sunt tratate mesajele difuzate destinate acestei statii de lucru

Exemplul

Programul HELLO trimite mesajul 'Hello !' catre toate conexiunile active. Se comporta, deci, exact ca si comanda :

SEND 'Hello !' to EVERYONE

Se va folosi functia de difuzare de mesaje SendBroadcastMessage care are urmatorii parametri :

Intrare : Registrul AH contine E1h

DS:SI Adresa tamponului de cerere

ES:DI Adresa tamponului de raspuns

Iesire : AL cod eroare (00h = succes)

Tampon cerere :

WORD lo-hi contine lungimea tamponului ce urmeaza (max 9Eh)

BYTE 00h - numar subfunctie

BYTE numarul de conexiuni (1 )

BYTE [nr] lista de conexiuni unde se va trimite mesajul

BYTE lungimea mesajului (1 )

BYTE [lg] mesaj (sir caractere ASCII)

Tampon raspuns :

WORD contine lungimea tamponului raspuns ce urmeaza (max 65h)

BYTE numar conexiuni

BYTE [nr] lista rezultatelor pe conexiuni

00h succes

FCh mesaj rejectat din lipsa de spatiu in buffer

FDh numar conexiune invalid

FFh blocaj

Prima versiune a acestui program este scrisa in limbaj de asamblare iar a doua in C.

Analog exista o descriere pentru toate celelalte functii.

Tema

Folosind fisierul interrup.e sa se sintetizeze in scris toate functiile NetWare executate prin int 21h, analog cu SendBroadcastMessage

Aplicatii distribuite

Aplicatiile distribuite permit impartirea unei probleme complexe in subprobleme ce vor fi evaluate in paralel. In cadrul fiecarei unitati operatiile se executa secvential. In cazul in care evaluarea se face in paralel pe fiecare calculator dintr-o retea, calculatoarele trebuie sa comunice intre ele si sa partajeze resursele comune ale sistemului.

Starile unui proces


START PROCES insereaza procesul in lista proceselor active. La un moment dat un singur proces este activ, acesta fiind denumit procesul curent. Algoritmul de selectie a procesului curent este transparent pentru programator si incapsulat intr-un modul denumit planificator de procese (Scheduler). La un moment dat procesul curent, datorita producerii sau consumului de informatie, ajunge in situatia de a nu mai putea continua executia. Atunci trece in una sau mai multe cozi de asteptare, denumite lista proceselor 'adormite'. Procesul redevine curent cand cauza care a produs 'adormirea' dispare. Efectele laterale provocate de accesul concurent poarta numele de coliziune intre procese. Aceasta apare ori de cite ori o resursa este utilizata simultan de un numar de procese mai mare decat capacitatea sa.

Exemplu de resurse:

orice functie nereentranta :

Exemplu:

a) Functie nereentranta :

int i;

void f()

Daca aceasta functie e intrerupta, de exemplu, pentru i=3, ea va fi reluata pentru i=0.

b) Functie reentranta:

void f()

In acest caz variabila i va fi generata in stiva.

Observatie:

O functie reentranta este (in mod evident) nerecursiva.

functii ale sistemului de operare;

coprocesorul sau emulatorul de coprocesor;

un fisier;

variabile locale sau nelocale;

un echipament periferic.

O posibilitate de eliminare a coliziunilor intre procese este folosirea semafoarelor. Un semafor reprezinta o variabila de tip intreg, a carei valoare maxima indica numarul de procese ce pot utiliza simultan resursa. Considerand ca S reprezinta numarul de procese care mai pot utiliza resursa, utilizarea semafoarelor se face prin doua proceduri:

P(S) /* permisie de utilizare a resursei */

else

/* procesul e adormit */

}

V(S) /* eliberarea resursei */

Semaforul are o structura de forma :


Lista proceselor in asteptare asociate cu semaforul S

Functii sistem pentru lucrul cu semafoare (Novell NetWare 4.6)

INT 21h - Fn C5h

Open semaphore

Input:

AH = C5h

AL = 00h

DS:DX = pointer to semaphore name buffer :


CL = initial value

Output:

if Cy=0,

CX:DX = semaphore handle

BL = open count (nr. statii care au deschis semaforul)

if Cy=1,

AL = error code

Examine semaphore

Input:

AH = C5h

AL = 01h

CX:DX = semaphore handle

Output:

if Cy=0,

CX = semaphore value (sign extended)

DL = open count (nr. statii care au deschis semaforul)

if Cy=1,

AL = error code

Wait on semaphore (P)

Input:

AH = C5h

AL = 02h

CX:DX = semaphore handle

BP = timeout in timer ticks (1/18 sec)

Output:

if Cy=1,

AL = error code

Signal semaphore (V)

Input:

AH = C5h

AL = 03h

CX:DX = semaphore handle

Output:

if Cy=1,

AL = error code

Close semaphore

Input:

AH = C5h

AL = 04h

CX:DX = semaphore handle

Output:

if Cy=1,

AL = error code

Aplicatiile propuse implementeaza sincronizarea si comunicarea intreprocese : 2 sau mai multe procese urmaresc indeplinirea aceluiasi scop, motiv pentru care acestea trebuie sa comunice informatie intre ele. In acest scop se stabilesc raporturi de tip producator-consumator, care permit sincronizarea intre procese. Comunicarea se face prin intermediul unor zone comune de memorie iar sincronizarea prin semafoare.

Probleme

1. O posibilitate de comunicare intre calculatoarele unei retele este prin fisiere scrise pe hard disk, controlul alocarii resurselor facandu-se prin semafoare. Folosind programele semafor.c, r1.c, s1.c, r2.c, s2.c sa se implementeze doua procese de tip producator-consumator. Accesul la fisierul comun se face prin intermediul unui buffer. Pentru a evita scrierea in bufferul plin sau citirea dintr-un buffer gol se folosesc doua semafoare:

BufferEmpty

BufferFull

Aplicatia presupune folosirea a doua statii.

Algoritmul producatorului :


waitOnSemaphore (BufferEmpty)

Citeste informatie

Scrie fisier

SignalSemaphore (BufferFull) /* semnaleaza consumatorului ca informatia a fost depusa in fisierul de comunicare*/

Algoritmul consumatorului:


waitOnSemaphore(BufferFull)

Citeste fisier

SignalSemaphore(BufferEmpty)

Prelucrare informatie

2. Implementati procese de tip producator-consumator (se va realiza un producator si 2 consumatori). Acestia din urma vor primi de la producator subsiruri ale unui sir, pe care le vor sorta (crescator, de exemplu). Dupa receptia numarului 0 maximul subsirului este transmis spre statia emitatoare. Aceasta, folosind rezultatele partiale, va calcula maximul global.

Algoritmul producatorului:

waitOnSemaphore (BufferEmpty)

Citeste informatie

Scrie fisier

SignalSemaphore (BufferFull)

for i=1 to nr. produc

waitOnSemaphore(Rezultate)

Citeste fisier

Prelucrare informatie

Algoritmul consumatorului:

waitOnSemaphore(BufferFull)

Citeste fisier

SignalSemaphore(BufferEmpty)

Prelucrare informatie

Scriere rezultate in fisier

SignalSemaphore(Rezultate)

Observatie:

- se recomanda schimbarea numelui fisierului de comunicare, pentru a nu aparea suprapuneri in accesul la fisier.

- numele semafoarelor trebuie sa fie identice pentru perechi de statii producator-consumator si diferite de cele deja utilizate! Nu uitati ca

serverul este unic si ca definirea semafoarelor se face in memoria acestuia.

3. Sa se scrie programele pentru sortarea distribuita a unui sir de caractere.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 915
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved