Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Comunicatii generale in retea
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

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
- nu se pot pastra informaþii individuale pentru fiecare utilizator de reþea
- nu se poate marca fiºierul respectiv ca read-only sau shareable. Soluþia este crearea unor fiºiere separate cu datele privind configuraþii.
Pentru a detecta daca este sau nu instalata o reþea locala, trebuie executate teste specifice sau diferite combinaþii ale acestora.




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>
#include <dos.h>

void main(void)
A union REGS regs; if(_osmajor < 3)
A printf("Nu pot verifica daca este lansat SHARE.\n"); exit (1);
S else
A regs.h.ah=0x10; regs.h.al=0; int86(0x2f, &regs , &regs); if(regs.h.al != 0xFF)
A printf("SHARE.EXE is not loaded.\n"); exit (1);
S
S
S

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>
#include <dos.h>

void main(void)
A union REGS regs; unsigned char i;

for(i=1;i < 26;i++)
A regs.h.ah = 0x44; regs.h.al = 9; regs.h.bl = i; int86(0x21, &regs, &regs); if((regs.x.dx & 0x1000) == 0x1000) printf("\n drive remote %u present",i); else printf("\n drive local %u present",i);
S
S

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>
#include <dos.h>
#include <process.h>
#include <mem.h>

#define USGC unsigned char
#define USGI unsigned int
#define USGL unsigned long

typedef struct _ncb
A
USGC Ncb_Command; /* command code */
USGC Ncb_RetCode; /* return code */
USGC Ncb_Lsn; /* local session number */
USGC Ncb_Num; /* Datagram ADD NAME table entry */

char * Ncb_BufferOffset; /* I/O buffer offset */
USGI Ncb_BufferSegment; /* I/O buffer segment */

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 */
USGC Ncb_Sto; /* send timeouts in 1/2 second units */

char * Ncb_PostRtnOffset; /* offset of post routine */
USGI Ncb_PostRtnSegment; /* segment of post routine */

USGC Ncb_LanaNum; /* network adapter number to execute cmd */
USGC Ncb_CmdCplt; /* 0xFF ==> command pending, else cmplted */

char Ncb_ReservedAreaa14i; /* work area for network card */
S 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)
A ncb_ptr->Ncb_CmdCpt=0xFF;
_ES=FP_SEG(ncb_ptr); /*Turbo C poate direct*/
_BX=FP_OFF(ncb_ptr); /* accesa reg CPU*/
_AX=0x1000; geninterrupt(0x5C);
S

void main(void)
A int_5C_vector=getvect(0x5C); if(int_5C_vector == (void far*)NULL)
A printf("Eroare, NetBIOS nu este incarcat (INT 5C nu este prezenta) \n"); exit(1);
S memset(&test_ncb, NULL, sizeof(NCB)); test_ncb.Ncb_Command=0x7F;
NetBIOS(&test_ncb); if(test_ncb.Ncb_RetCode != 3)
A printf("Eroare, NetBIOS nu este incarcat (Nu este raspuns de la INT 5C)\n"); exit(1);
S
S

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>
#include <dos.h>

void main(void)
A

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, &regs, &regs, &sregs); if(regs.x.bx == 0) printf ("Nu este o reþea NetWare \n");
S

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>
#include <dos.h>

void main(void)
A union REGS regs;

if(_osmajor < 3)
A printf ("Nu pot verifica PCLP \n"); exit(1);
S else
A regs.h.ah.= 0xB8; regs.h.al = 0; int86(0x2f, &regs, &regs); if(regs.h.al == 0)
A printf(" programul PC LAN nu este incarcat.\n"); exit(1);
S
S
S

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 :
- SHARE trebuie instalat pentru a permite accesul la fiºiere ºi inregistrari
- testul de prezenþa a unitaþilor de disc de reþea trebuie sa indice cel puþin o unitate la distanþa, daca nu, NetBIOS trebuie sa fie operaþional pe staþia de lucru.

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 :

- daca o staþie de lucru se lanseaza totdeauna sub un anumit nume, acest nume identifica staþia ca atare ºi nu utilizatorul care lucreaza la staþie
- 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 :
- mai intai se afla numarul de conexiune al staþiei atribuit de File Server in momentul in care se face LOGIN
- acest rezultat este utilizat pentru a obþine informaþii despre acel numar de conexiune, inclusiv ID-entificatorul utilizatorului, denumit nume de obiect.
Primul pas se face prin apelarea funcþiei GetConnection Number. Pentru a face acest apel, in AH se introduce 0DCH ºi apoi se apeleaza INT 21H. In AL se reintoarce numarul conexiunii, intre 1 ºi 100.

regs.h.ah=0xDC; int86(0x21, &regs, &regs); 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
A unsigned int request_length; unsigned char subfuncþion; unsigned char buffer_connect_num;
S request_buffer;

Cealalta zona este un tampon de raspuns de 63 de octeþi.

struct
A unsigned int reply_length; unsigned long object_id; unsigned int object_type; char object_namea48i; char login_timea7i;
S reply_buffer;

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>
#include <dos.h>

void main(void)
A union REGS regs; struct SREGS sregs; unsigned char connect_num; int i; structA unsigned int request_length; unsigned char subfuncþion; unsigned char buffer_connect_num;
S request_buffer; structA unsigned int reply_length; unsigned long object_id; unsigned int object_type; char object_namea48i; char login_timea7i;
S reply_buffer;

regs.h.ah=0xDC; int86(0x21, &regs, &regs); 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, &regs, &regs, &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");
S

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 :
1) o modalitate de identificare a fiecarui utilizator, pentru ca programele sa ºtie cu cine comunica
2) mecanisme de control, pentru a determina daca o aplicaþie poate sa foloseasca fiºiere in mod concurent cu alþi utilizatori, sau aplicaþia trebuie sa aiba acces exclusiv
3) pentru acele fiºiere care sunt folosite in mod concurent trebuie furnizate funcþii de excludere mutuala pe durata unor operaþii elementare cu fiºierul sau cu o parte a sa

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 :
1 - Programul A blocheaza fiºierul 1
2 - Programul A scrie datele din fiºierul 1, care trebuie sa fie reflectate in fiºierul 2
3 - Programul B blocheaza fiºierul 2
4 - Programul B scrie datele in fiºierul 2, care trebuie sa fie reflectate ºi in fiºierul 1
5 - Programul A incearca blocarea accesului la fiºierul 2, cerere respinsa
6 - Programul B incearca blocarea accesului la fiºierul 1, rezulta o blocare definitiva (deadlock)

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)
A if (errno == ENOENT) printf ("Nu este un astfel de fisier \n"); else if (errno == EMFILE) printf("Prea multe fisiere deschise \n); else if (errno == EACCES) printf ("Fisierul este READ_ONLY sau deja deschis \n); else if (errno == EINVACC) printf ("Mod de acces invalid \n);
S

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 :

- marcarea fiºierelor care trebuie blocate pentru acces
- 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.
Tipurile de date folosite in cadrul reþelei sunt :
- BYTE - 8 biþi
- WORD -16 biþi, in ordinea "High-Low" a octeþilor
- DWORD - 32 biþi, in ordinea "High-Low" a cuvintelor

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 :
• sa emita mesaje de 1 pana la 55 de octeþi in vederea difuzarii la mai multe destinaþii
• sa stabileasca unul sau mai multe canale de mesaje cu anumite staþii de lucru, legate la acelaºi server
Un astfel de canal ofera posibilitatea transmiterii de mesaje de 1 pana la 126 de octeþi. Difuzarea de mesaje ºi comunicaþia 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 octeþi. Pentru serviciul de comunicaþie prin canale, serverul menþine 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 staþiei destinatare ºi afiºat pe linia cea mai de jos (a 25-a linie) a ecranului. Funcþiile de comunicare prin mesaje sunt folosite de programele utilitare SEND, CASTON ºi CASTOFF, care se folosesc pentru a emite mesaje in vederea difuzarii, a permite sau a inhiba recepþionarea mesajelor difuzate.
Funcþii puse la dispoziþie de Shell, pentru transmiterea mesajelor :

E1h(09h) - BroadcastToConsole - trimite un mesaj care va fi afiºat 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 funcþii 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 staþiei de lucru
E3h(ODh) - LogNetworkMessage - depune un mesaj in fiºierul NET$LOG.MSG al serverului implicit. Inregistrarea din fiºier va avea urmatorul format :

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.
E1h(06h) - OpenMessagePipe - creaza o jumatate de canal de comunicaþie intre staþia de lucru ºi una sau mai multe conexiuni. Cealalta jumatate a canalului (canalelor) trebuie create de conexiunea (conexiunile) destinatara, cu ajutorul aceleiaºi funcþii.
E1h(00h) - SendBroadcastMessage - trimite un mesaj spre difuzare la un numar de conexiuni de pe acelaºi server
E1h(04h) - SendPersonalMessage - trimite un mesaj catre una sau mai multe conexiuni cu care staþia de lucru a deschis canale de mesaje
0DEh - SetBroadcastMode - stabileºte modul in care sunt tratate mesajele difuzate destinate acestei staþii de lucru

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
DS:SI Adresa tamponului de cerere
ES:DI Adresa tamponului de raspuns
Ieºire : AL cod eroare (00h = succes)
Tampon cerere :
WORD lo-hi conþine lungimea tamponului ce urmeaza (max 9Eh)
BYTE 00h - numar subfuncþie
BYTE numarul de conexiuni (1..100)
BYTE anri lista de conexiuni unde se va trimite mesajul

BYTE lungimea mesajului (1..55)
BYTE algi mesaj (ºir caractere ASCII)

Tampon raspuns :
WORD conþine lungimea tamponului raspuns ce urmeaza (max 65h)
BYTE numar conexiuni
BYTE anri lista rezultatelor pe conexiuni
00h succes
FCh mesaj rejectat din lipsa de spaþiu 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 funcþii.

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++)
.
.
.
S

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++)
.
.
.
S

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;
• coprocesorul sau emulatorul de coprocesor;
• un fiºier;
• 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 */
A if ( S > 0)A
--S; /* Procesul continua */
S else
/* procesul e adormit */
S

V(S) /* eliberarea resursei */
A
.
.
++ S;
/* daca exista vreun proces in lista proceselor de aºteptare asociate lui S, acesta este transferat in lista proceselor active */
S

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:
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. staþii 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. staþii 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

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
BufferFull

Aplicaþia presupune folosirea a doua staþii.

Algoritmul producatorului :

waitOnSemaphore (BufferEmpty)
Citeºte informaþie
Scrie fiºier
SignalSemaphore (BufferFull) /* semnaleaza consumatorului ca informaþia a fost depusa in fiºierul de comunicare*/

Algoritmul consumatorului:

waitOnSemaphore(BufferFull)
Citeºte fiºier
SignalSemaphore(BufferEmpty)
Prelucrare informaþie

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)
Citeºte informaþie
Scrie fiºier
SignalSemaphore (BufferFull) for i=1 to nr. produc
waitOnSemaphore(Rezultate)
Citeºte fiºier
Prelucrare informaþie

Algoritmul consumatorului:

waitOnSemaphore(BufferFull)
Citeºte fiºier
SignalSemaphore(BufferEmpty)
Prelucrare informaþie
Scriere rezultate in fiºier
SignalSemaphore(Rezultate)

Observaþie:

- se recomanda schimbarea numelui fiºierului de comunicare, pentru a nu aparea suprapuneri in accesul la fiºier.
- numele semafoarelor trebuie sa fie identice pentru perechi de staþii producator-consumator ºi diferite de cele deja utilizate! Nu uitaþi ca serverul este unic ºi ca definirea semafoarelor se face in memoria acestuia.

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


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta