Operační systém UNIX a jazyk C

Jan Brodský
Luděk Skočovský

SNTL Nakladatelství technické literatury Praha 1989, ISBN 80-03-00049-1

10. Implementace


10.6 Implementace roury

Roura se vytváří voláním

pipe(pd);
jádra, které volajícímu pocesu v poli pd vrátí dva deskriptory:
pd[0]  pro čtení z roury. 
pd[1]  pro zápis do roury.

Deskriptory roury jsou vlastně deskriptory souborů. K implementaci roury se využívá mechanismus tabulek otevřených souborů a aktivních i-uzlů, tak jak byl popsán v čl. 10.5.

Pro vytvoření roury jádro v tabulce aktivních i-uzlů přidělí volný i-uzel s identifikací předurčeného, obvykle systémového svazku (protože roura nemá jméno v žádném adresáři). Dále přidělí dva záznamy v systémové tabulce otevřených souborů. První z nich prohlásí za konec roury (obr. 10.14), druhý za začátek roury. Odkazy do tabulky aktivních i-uzlů vedou na dříve přidělený i-uzel, v obr. 10.16 jsou to šipky označené (1). Na záznamy v systémové tabulce otevřených souborů vedou odkazy z prvních dvou volných prvků pole ofile (s indexy, které jádro vrátí uživatelskému procesu v pd[0] a pd[1]) v obr. 10.16 šipky označené (2). Tyto odkazy dědí procesy, vzniklé voláním fork.

[OBR. 10.16]

Rouře nepřísluší prostor na disku. Pro implementaci datových operací se využívá sice blokových vyrovnávacích pamětí, ale je zablokován zápis na disk. Navíc ve struktuře inode je prostor pro adresy pouze 10 přímo dostupných bloků; musí tedy být rozdíl mezi ukazovátkem pro zápis a ukazovátkem pro čtení (které se opožďuje) nejvýše 5120 slabik, v obr. 10.16 šipky označené (3). Jinak by se pro evidenci dalších bloků (byť jen ve vyrovnávacích pamětech) musel použít mechanismus nepřímého adresování bloků (odst. 10.4.4) a celá záležitost by se zkomplikovala a zpomalila.

Proto jádro sleduje zaplněnost roury. Dosáhne-li stanovené meze (4096 slabik), proces-producent je zablokován.

Naopak, čtení z neprázdné roury vede k zablokování procesu-konzumenta. Dokončení operace zápisu zruší zablokování všech konzumentů a naopak dokončení čtení odblokuje všechny producenty.