|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Comunicatii generale in retea | ||||||
|
||||||
Ori de cate ori este posibil se va evita scrierea de cod care utilizeaza
facilitaþi specifice unui anumit furnizor de subansamble ºi
componente LAN. Exista totuºi situaþii in care este
necesara scrierea de cod specific. PC DOS nu ofera o modalitate
standard sigura de testare a prezenþei unui soft de reþea.
Deoarece aplicaþia trebuie sa testeze acest lucru sunt necesare
teste ale instalarii, specifice pentru diferite reþele. La crearea
unui fiºier intr-o reþea NetWare, acesta primeºte automat
atributul “nonshareable”. Pentru a modifica acest atribut trebuie
apelata o funcþie specifica din NetWare. Cand shellul
NetWare detecteaza terminarea unui program, inchide toate fiºierele,
elibereaza semafoarele pentru excludere mutuala, etc. Exista
situaþii de memorie insuficienta pentru execuþia mai multor
funcþii la cel mai inalt nivel posibil. De exemplu, pentru a lucra
simultan cu SPX, IPX ºi NetBIOS, se poate executa NetBIOS intr-o
reþea NetWare numai daca exista memorie suficienta
pentru emulatorul NetBIOS. Exista situaþii in care, din diferite
motive, compatibilitatea este redusa. De exemplu, sunt situaþii
in care este necesar sa se lanseze PC DOS pe File Server, caz in
care se strica compatibilitatea cu Novell. Pentru salvare/restaurare
de fiºiere, in cazul in care File-Serverul este dotat cu banda
Streamer, trebuie utilizat software-ul asociat, sub DOS. Nu trebuie memorate
informaþii de configurare a reþelei de catre utilizator in
fiºiere executabile, deoarece aceasta creeaza doua
probleme : p8l5lj Test SHARE instalat Programul SHARE.EXE se ataºeaza intreruperii DOS 2FH, denumita "intrerupere multiplexata". Aceasta a fost adaugata la PC DOS 3.0 ºi daca este invocata la versiuni mai mici, programul apelant se blocheaza. Convenþiile de apel arata ca registrul AH trebuie sa conþina numarul de multiplexare, care identifica un anumit program de tratare a intreruperii, iar registrul AL va fi incarcat cu funcþia specifica ce trebuie executata. Pentru programul SHARE.EXE, numarul de multiplexare este 10H, iar funcþia care testeaza daca este instalat este 0. Daca SHARE este instalat, la reintoarcere AL conþine 0FFH. #include <stdio.h> void main(void) Testare Unitate de Disc Reþea 0 alta modalitate de a detecta o reþea locala instalata consta in apelul funcþiei DOS IOCTL (funcþia 44H subfuncþia 9). Prin aceasta funcþie se testeaza daca o unitate de disc logica este locala sau la distanþa. Numarul unitaþii 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 distanþa. Ca exemplu, sa executam acest test pentru toate discurile hard posibile, de la C pina la Z, cautindu-se cel puþin un disc la distanþa. #include <stdio.h> void main(void) for(i=1;i < 26;i++) Exista o problema in legatura cu aceasta metoda : IOCTL nu face diferenþa dintre un disc (drive) de reþea ºi un CDROM. Programele de I/E pentru CDROM utilizeaza aceleaºi informaþii DOS interne pe care le utilizeaza ºi reþeaua pentru a identifica unitaþi la distanþa. Exista o funcþie MSCDEX, funcþia 15H subfuncþia 0, care este o intrare pentru INT 2FH. Aceasta reintoarce numarul de unitaþi logice CDROM in registrul BX. Daca BX=0 dupa apel, nu exista unitaþi CDROM. Daca BX diferit de 0, CX conþine primul disc CDROM (D: = 3, E: = 4 etc.). Test de instalare NetBIOS Exista multe reþele care se bazeaza pe NetBIOS. Pentru a testa daca NetBIOS este instalat, se trimite in mod deliberat o comanda incorecta ºi se testeaza raspunsul. Se utilizeaza o structura NCB (NetWork Control Block), aºa cum este ceruta de NetBIOS. #include <stdio.h> #define USGC unsigned char typedef struct _ncb char * Ncb_BufferOffset; /* I/O buffer offset */ USGI Ncb_Length; /* length of data in I/O buffer */ char Ncb_CallNamea16i; /* remote system name for CALL */ char Ncb_Namea16i; /* local adapter network name */ USGC Ncb_Rto; /* receive timeouts in 1/2 second units */ char * Ncb_PostRtnOffset; /* offset of post routine */ USGC Ncb_LanaNum; /* network adapter number to execute cmd */ char Ncb_ReservedAreaa14i; /* work area for network card */ NCB test_ncb; void interrupt (*int_5C_vector)(void); /*----------------------------------------------------------------------*/ void NetBIOS(NCB far *ncb_ptr) void main(void) Test de instalare NetWare Acest test cere programului Netware Shell informaþii privind versiunea. Codul de apel al funcþiei este 0EAH (in registrul AH) ºi subfuncþia are codul 1 (in registrul AL). BX este iniþializat cu 0, iar ES:DI se incarca cu un pointer de tip far spre un tampon de primire a raspunsului (sunt necesari 50 de octeþi). La revenire, BX conþine informaþii privind versiunea, iar daca este 0, inseamna ca NetWare Shell nu este instalat. #include <stdio.h> void main(void) union REGS regs; /*din <DOS.h> in cele mai multe din compilatoare*/ struct SREGS sregs; char reply_buffera50i; regs.h.ah = 0xEA; regs.h.al = 1; regs.x.bx = 0; sregs.es = FP_SEG((void far *)reply_buffer); regs.x.di =FP_OFF((void far *)reply_buffer); int86x(0x21, ®s, ®s, &sregs); if(regs.x.bx == 0) printf ("Nu este o reþea NetWare \n"); Test de instalare PC LAN Programul PC LAN utilizeaza, de asemenea, intreruperea multiplexata (2FH), numarul de multiplexare al sau este 0B8H ºi testul de instalare se face similar ca ºi pentru programul SHARE. Daca la reintoarcere din intreruperea 2FH, avem AL=0, programul PC LAN nu este incarcat. #include <stdio.h> void main(void) if(_osmajor < 3) Test prezenþa reþea locala particulara Exista anumite limite privind testele de indicare a prezenþei
unei reþele 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 fiºier pentru mai multe taskuri. Testul de prezenþa
a unor unitaþi de discuri de tip reþea este excelent, deoarece,
printr-un raspuns afirmativ, acest test indica prezenþa
unui File Server. Se poate defini astfel un test pentru o reþea particulara,
in general reþele de cost scazut, astfel : Identificarea unei staþii de lucru Dupa ce s-a obþinut asigurarea ca aplicaþia se executa
in reþea, este necesar sa se identifice staþia. In
general, aceasta se face prin atribuirea unui nume maºinii, metoda
suportata de PC DOS. Exista doua dezavantaje ale acestei
metode : - in unele reþele locale mai multe staþii pot avea acelaºi nume de maºina, sau o staþie pur ºi simplu nu mai are nici un nume. Soluþia ambelor probleme consta in execuþia unui program care pune in corespondenþa identitatea utilizatorului cu numele unic al maºinii. Pentru a testa daca fiecare nume de maºina este unic se trimite un mesaj simplu in reþea ºi fiecare staþie care-ºi recunoaºte numele va trimite raspunsul "present". Aceasta tehnica este specifica reþelelor care utilizeaza NetBIOS. ID Utilizator sub NetWare Pe linga numele maºinii, care este setat printr-o comanda
in LOGIN SCRIPT, NetWare are un mecanism propriu de identificare a utilizatorilor,
printr-un proces in doua etape : regs.h.ah=0xDC; int86(0x21, ®s, ®s); connect_num=regs.h.al; Al doilea pas consta in apelarea funcþiei GetConnection Information. Pentru apel trebuie furnizate adresele a doua tampoane : primul este un tampon, de cerere de 40 de octeþi struct Cealalta zona este un tampon de raspuns de 63 de octeþi. struct Apelul efectiv consta in scrierea codului funcþiei 0E3H in AH ºi a indicatoarelor spre cele doua tampoane in perechile de registre DS:SI - request_buffer ºi ES:DI - reply_buffer, iar apoi se executa INT 21 H. #include <stdio.h> void main(void) regs.h.ah=0xDC; int86(0x21, ®s, ®s); connect_num=regs.h.al; request_buffer.request_length=2; request_buffer.subfuncþion=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.ºi=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, ®s, ®s, &sregs); printf(" ID utilizator este %s\n" , reply_buffer.object_name); printf(" %s s-a conectat la " ,reply_buffer.object_name); printf(" an: %d" ,reply_buffer.login_timea0i); printf(" luna: %d" ,reply_buffer.login_timea1i); printf(" zi: %d" ,reply_buffer.login_timea2i); printf(" ora: %d" ,reply_buffer.login_timea3i); printf(" min: %d" ,reply_buffer.login_timea4i); printf(" sec: %d" ,reply_buffer.login_timea5i); printf(" sutimi: %d" ,reply_buffer.login_timea6i); printf(" \n"); La intoarcere, numele obiectului este transmis in tamponul de raspuns ºi poate fi tratat ca un ºir obiºnuit. printf(" ID utilizator este %s\n" , reply_buffer.object_name); Metode de sincronizare ºi control Sistemul de operare NetWare este multiutilizator ºi multitasking. Din
punctul de vedere al programatorului, un sistem multiutilizator trebuie sa
asigure urmatoarele trei elemente : In plus faþa de aceste trei funcþii generale, sistemele
de operare pentru reþele locale trebuie sa ofere un mecanism care
sa determine daca un PC este intr-o reþea 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 staþii de lucru, A ºi B,
executa doua programe diferite ºi ca amindoua
programele trebuie sa actualizeze aceleaºi doua fiºiere
din File Server. Amandoua programele trebuie sa blocheze
accesul la cele doua fiºiere pentru a le actualiza. Ambele programe
ajung in acelaºi timp in punctul in care vor sa
actualizeze cele doua fiºiere. Secvenþa de evenimente este
urmatoarea : Pentru a elimina interblocarea definitiva, de cele mai multe ori este necesara repornirea ºi iniþializarea staþiilor, care insa lasa date inconsistente in fiºierele care erau deschise in acelaºi moment. In cele ce urmeaza se da un exemplu de procedura care realizeaza deschiderea fiºierului 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 fiºier. 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 staþii pot cere deschiderea fiºierului pentru citire astfel : handle = open("ONEWRITE.FIL", O_RDONLY | O_DENYNONE); Acces concurent Daca se doreºte control la nivel de inregistrare pentru accesul concurent la fiºiere, fiºierul trebuie deschis in mod D_NONE.DENYNONE. open ("SHARE.FIL" , O_RDWR | O_DENYNONE); In tabelul urmator se arata relaþia dintre modurile de acces ºi modurile de utilizare concurenta a fiºierelor. Utilizarea concurenta a fiºierelor NetWare NetWare adauga un set de funcþii care completeaza PC-DOS-ul
cu "Servicii de sincronizare". Aceste servicii Novell constau in
: - blocarea pentru acces a setului de fiºiere - eliberarea fiºierelor dupa acces - ºtergerea listei fiºierelor marcate Accesul la funcþii NetWare din limbaj de asamblare Toate funcþiile NetWare sunt apelabile prin intermediul intreruperii
software INT 21H, asemenea majoritaþii funcþiilor DOS. Subfuncþiile
folosite se afla in domeniul B6H-F3H. Aceste funcþii utilizeaza
rutine din modulul shell al reþelei (NETX.COM). Apelul lor in absenþa
modulului shell va provoca o eroare de funcþie inexistenta. O atenþie deosebita trebuie acordata faptului ca
ordinea octeþilor, respectiv a cuvintelor, este inversa celei obiºnuite
in reprezentarea aceloraºi tipuri de date in PC-uri. Singurele
excepþii sunt lungimile tampoanelor de eroare ºi de raspuns.
Este, deci, responsabilitatea programului ce apeleaza aceste funcþii
sa realizeze conversia, in formatul cerut de reþea, a datelor
de tip WORD ºi DWORD, inainte de apel. De asemenea, valorile WORD
ºi DWORD, intoarse de funcþiile NetWare ca raspuns,
vor trebui convertite de programul de aplicaþie in formatul intern
al calculatorului pe care se lucreaza, inainte de folosirea lor.
Unele funcþii NetWare necesita pentru transferul de parametri doua
tampoane, unul de cerere ºi altul de raspuns. Adresele acestor tampoane
se transmit prin registre. Tamponul de cerere conþine informaþii
ce vor fi trimise pe reþea. Tamponul de raspuns conþine informaþii
furnizate de reþea ca raspuns. In cadrul acestor tampoane
nu trebuie sa existe octeþi nefolosiþi (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 doreºte apelarea funcþiilor
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 octeþi
din acest tampon trebuie sa conþina numarul de octeþi
al restului pachetului. Aceasta valoare nu va include primii doi octeþi.
Acest cuvant trebuie specificat in formatul specific calculatorului
"Low-High" (singura excepþie de la regula de mai sus). Adresa
tamponulul de raspuns este transmisa prin perechea de registre
DS:SI. Primii doi octeþi din acest tampon trebuie sa conþina
numarul de octeþi rezervaþi pentru restul pachetului. Aceasta
valoare este folosita de shell ºi trebuie sa fie suficient
de mare pentru a putea cuprinde raspunsul dat de reþea. Lungimea
tamponului de raspuns trebuie iniþializata totdeauna cu
numarul de octeþi rezervaþi in acest scop, chiar daca
shell-ul nu intoarce nimic ca raspuns. Serviciile de comunicaþie
prin mesaje permit programelor de aplicaþie : luna/zi/an ore:minute STN numar_statie: mesaj Funcþia poate fi utilizata de utilitare sau de programe de aplicaþie
care au nevoie sa inregistreze informaþii, de exemplu cu
scopul de a le folosi pentru contabilitate. Exemplul Programul HELLO trimite mesajul "Hello !" catre toate conexiunile active. Se comporta, deci, exact ca ºi comanda : SEND "Hello !" to EVERYONE Se va folosi funcþia de difuzare de mesaje SendBroadcastMessage care are urmatorii parametri : Intrare : Registrul AH conþine E1h BYTE algi mesaj (ºir caractere ASCII) Tampon raspuns : Prima versiune a acestui program este scrisa in limbaj de asamblare
iar a doua in C. Tema Folosind fiºierul interrup.e sa se sintetizeze in scris toate funcþiile NetWare executate prin int 21h, analog cu SendBroadcastMessage Aplicaþii distribuite Aplicaþiile distribuite permit imparþirea unei probleme complexe in subprobleme ce vor fi evaluate in paralel. In cadrul fiecarei unitaþi operaþiile se executa secvenþial. In cazul in care evaluarea se face in paralel pe fiecare calculator dintr-o reþea, calculatoarele trebuie sa comunice intre ele ºi 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 selecþie a procesului curent este transparent pentru programator ºi incapsulat intr-un modul denumit planificator de procese (Scheduler). La un moment dat procesul curent, datorita producerii sau consumului de informaþie, ajunge in situaþia de a nu mai putea continua execuþia. Atunci trece in una sau mai multe cozi de aºteptare, 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 funcþie nereentranta : Exemplu: a) Funcþie nereentranta : int i; void f()A for (i=0;i < 4;i++) Daca aceasta funcþie e intrerupta, de exemplu, pentru i=3, ea va fi reluata pentru i=0. b) Funcþie reentranta: void f()A int i; for (i=0;i < 4;i++) In acest caz variabila i va fi generata in stiva. Observaþie: O funcþie reentranta este (in mod evident) nerecursiva. • funcþii ale sistemului de operare; 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 */ V(S) /* eliberarea resursei */ Semaforul are o structura de forma : Lista proceselor in aºteptare asociate cu semaforul S Funcþii sistem pentru lucrul cu semafoare (Novell NetWare 4.6)INT 21h - Fn C5h Open semaphore Input: CL = initial value Examine semaphore Input: Wait on semaphore (P) Input: Signal semaphore (V) Input: Close semaphore Input: Aplicaþiile propuse implementeaza sincronizarea ºi comunicarea intreprocese : 2 sau mai multe procese urmaresc indeplinirea aceluiaºi scop, motiv pentru care acestea trebuie sa comunice informaþie 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 reþele este prin fiºiere 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 fiºierul 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 Aplicaþia presupune folosirea a doua staþii. Algoritmul producatorului : waitOnSemaphore (BufferEmpty) Algoritmul consumatorului: waitOnSemaphore(BufferFull) 2. Implementaþi procese de tip producator-consumator (se va realiza un producator ºi 2 consumatori). Aceºtia din urma vor primi de la producator subºiruri ale unui ºir, pe care le vor sorta (crescator, de exemplu). Dupa recepþia numarului 0 maximul subºirului este transmis spre staþia emiþatoare. Aceasta, folosind rezultatele partiale, va calcula maximul global. Algoritmul producatorului: waitOnSemaphore (BufferEmpty) Algoritmul consumatorului: waitOnSemaphore(BufferFull) Observaþie: - se recomanda schimbarea numelui fiºierului de comunicare, pentru
a nu aparea suprapuneri in accesul la fiºier. 3. Sa se scrie programele pentru sortarea distribuita a unui
ºir de caractere. |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|