Conveieri pentru transportoare și cozi de mesaje (canale de program)

O conductă (canalul programului de conducte sau, așa cum se numește uneori, un transportor) este un mijloc prin care datele pot fi schimbate între procese. Principiul conductei se bazează pe mecanica intrărilor / ieșirilor, care este folosită pentru a lucra cu fișiere în UNIX, adică sarcina care transmite actele de informare ca și cum ar scrie date într-un fișier, în timp ce sarcina pentru care este destinată această informație o citeste din acest fisier. Operațiile de înregistrare și de citire nu sunt efectuate de înregistrări, așa cum se face în fișierele obișnuite, ci printr-un flux de octeți, așa cum sa procedat în sistemele UNIX. Astfel, funcțiile prin care scrieți și citiți de pe canal sunt aceleași ca atunci când lucrați cu fișiere. De fapt, un canal este un flux de date între două (sau mai multe) procese. Acest lucru simplifică programarea și eliberează programatorii de utilizarea unor mecanisme noi. De fapt, conductele nu sunt fișiere pe disc, ci o memorie tampon care funcționează pe principiul FIFO, adică conform principiului coadajului obișnuit. Cu toate acestea, nu ar trebui să confundați conductele cu cozile de mesaje; Acestea din urmă sunt realizate în mod diferit și au alte posibilități.







Conducta are o anumită dimensiune 1. care nu poate depăși 64 KB și funcționează ciclic. Amintiți-vă de punerea în aplicare a unei coadă pe agende, atunci când există indicii la începutul și la sfârșitul coadă, care sunt ciclate prin matrice. Există o matrice și două indicatoare: unul indică primul element (se numește condițional, capul), iar al doilea - ultimul (să numim ittail).

În momentul inițial, ambii indicatori sunt zero. Adăugarea primului element într-o coadă goală face ca anteturile și anteturile să accepte o valoare de 1 (primul element apare în matrice). Ulterior, adăugarea unui element nou determină modificarea valorii celui de-al doilea pointer, deoarece marchează locația ultimului element al coadă. Citirea (și ștergerea) unui element (primul element din coada creată este întotdeauna citit și șters) are ca rezultat modificarea valorii indicatorului capului. Ca urmare a operațiilor de scriere (adăugare) și de citire (ștergere) a elementelor din matrice care simulează coada de elemente, indicatorii se vor muta de la începutul matricei până la sfârșitul acesteia. Când pointerul atinge valoarea indexului ultimului element al matricei, valoarea indicelui devine din nou unică (dacă matricea nu depășește, adică numărul elementelor din coadă nu depășește numărul elementelor din matrice). Putem spune că înfășurăm matricea într-un inel, organizând mișcarea circulară a indicatoarelor și coada, care urmăresc primul și ultimul element din coadă. Cele de mai sus sunt ilustrate în Fig. 6.5. Astfel funcționează transportorul.







Conveieri pentru transportoare și cozi de mesaje (canale de program)

Fig. 6.5. Eliminați o matrice

Ca structură de informații, un canal este descris de un identificator, de o dimensiune și de două indicii. Transportoarele sunt o resursă de sistem. Pentru a începe să lucrați cu conducta, procesul trebuie să-l comandați mai întâi din sistemul de operare și să îl aveți la dispoziție. Procesele care cunosc identificatorul conductei pot face schimb de date prin aceasta.

Acum ia în considerare interogările principale ale sistemului pentru a lucra cu ele. De exemplu, să luăm apeluri de la APIOS / 2 (în secțiunea următoare le vom folosi). Aplicațiile tradiționale de lucru cu țevi (conducte) sunt prezentate în secțiunea care descrie arhitectura sistemului UNIX (a se vedea Capitolul 8). Deci:

 Funcția de creare a transportorului:

DosCreatePipe (ReadHand1e, WriteHandle, PipeSize);

unde ReadHandle este un descriptor pentru citirea de la conductă, WriteHandle este un descriptor pentru scrierea în conductă, PipeSize este dimensiunea conductei.

 Funcția cititorului din conductă:

DosRead (ReadHandle, (PVOID) Informați, sizeof (Informați), BytesRead);

 Funcția de înregistrare în transportor:

DosWrite (WriteHand1e, (PVOID) Informați, s1zeof (Informați), BytesWrite);

unde WriteHandle este mânerul pentru a scrie în conductă, BytesWrite este numărul de octeți scrise.

Numai procesul care cunoaște identificatorul conductei corespunzătoare poate citi din conductă. Când lucrați cu o conductă, datele sunt puse direct în ea. Încă o dată, observăm că, datorită limitării dimensiunii conductei, programatorii se confruntă, de asemenea, cu limitări ale dimensiunii mesajelor transmise prin aceasta.







Trimiteți-le prietenilor: