Do spisu tresci tematu 7
7.4.1.Strumienie
Spis tresci
Mysle, ze jest tu zbedny, gdyz podtemat ten nie jest zbyt obszerny.
Co to sa strumienie i skad sie wziely?
Pomysl strumieni zrodzil sie z powodu checi ulepszenia schematu obslugi
urzadzen. Ma on na celu usuniecie niektorych wad tego schematu, np.
duplikacji funkcji przez rozne podprogramy obslugi urzadzen, brak wspolnych
mechanizmow zarowno na poziomie podprogramow jak i uzytkownika, trudnosc w
polaczeniu w jedna calosc konwencjonalnych dyscyplin linii. Ma to miejsce
glownie przy podprogramach implementujacych protokoly sieciowe, ale nie tylko.
Dobrym rozwiazanie bylyby tu listy znakowe, ale sa one zbyt kosztowne.
Strumien jest to pelne dupleksowe polaczenie procesu z
podprogramem obslugi urzadzen. Sklada sie ono z powiazanych liniowo par
kolejek, z ktorych pierwszy element odpowiada za wejscie a drugi za wyjscie.
Kiedy proces pisze do strumienia, to jadro przesyla je w dol kolejek
wyjsciowych, natomiast gdy podprogram obslugi urzadzenia otrzyma dane
wejsciowe, to przekazuje je w gore kolejek wejsciowych. Kazda para kolejek
jest zwiazana z jakims modulem np. podprogramem obslugi urzadzenia,
dyscyplina linii lub protokolem. Kazda para kolejek jest umieszczona w jednym
spojnym obszarze, wiec latwo jest sie miedzy nimi komunikowac.
Jak wyglada taka kolejka?
W kodzie w C wygladalo by to mniej wiecej tak:
struct str_queue {
int *(open)();/*procedura otwarcia*/
int *(close)();/*procedura zamkniecia*/
int *(put)();/*procedura wstawienia komunikatu do kolejki*/
int *(select)();/*wybor kolejki do wykonania*/
struct str_queue *next;
struct msg_list *msg;/*wskaznik do listy komunikatow*/
struct private *state;/*wskaznik do danych o kolejce*/
int flag;/*flagi*/
};
Jak to dziala?
Strumienie sa zwiazane z urzadzeniami znakowymi. Gdy wywolywana jest funkcja
open, nastepuje standardowe sprawdzenie czy jest to znakowy plik
specjalny a potem czy jest to podprogram obslgi strumieni.Jesli tak to jadro
w przypadku pierwszej operacji otwarcia strumienia przydziela dwie pary kolejek
jedna dla podprogramu obslugi urzadzenia a druga dla naczelnika strumienia.
Modul naczelnika jest jednakowy dla wszystkich otwartych strumieni, zawiera
ogolne procedury wstawiania oraz oslugi a takze interfejs do funkcji wyzszego
poziomu jadra tzn. read, write, ioctl. Przydzielany jest tez wskaznik
umieszczany w i-wezle wskazujacy na pare kolejek zwiazanych z naczelnikiem.
Jesli jest to kolejna proba otwarcia urzadzenia to znajdowany jest poprzednio
utworzony strumien wlasnie na podstawie wskaznika w i-wezle.

Moduly komunikuja sie za pomoca komunikatow przesylanych pomiedzy sasiadami
w strumieniu. Komunikat sklada sie z listy naglowkow bloku komunikatu.Kazdy
naglowek wskazuje na poczatek oraz koniec danych tego bloku.Sa dwa typy
komunikatow: sterujace-pojawiaja sie w wyniku wykonania funkcji ioctl
lub zajscia innych z gory okreslonych warnkow np. zerwania lacznosci z
terminalem oraz komunikaty z danymi pojawiajace sie na skutek wywolan funkcji
write lub po nadejsciu danych od urzadzenia. Komunikat moze byc
odeslany do nastepnej kolejki lub przetwarzany w danym module.Ustawiana jest
flaga "sa dane do przetworzenia". Kiedy jadro wybierze dany modul do wykonania
(uzywajac przerwania) podprogram obslgi takiego przerwania wykona odpowiednie
dla danego modul funkcje obslugi.
Do otwartego strumienia mozemy wstawiac dowolne moduly za pomoca funkcji
ioctl. Dba o to procedura wstawiania. Mozemy np. wstawic do strumienia
obslugujacego terminal modul dyscypliny linii. Przykladem zastosowania strumieni
moga byc tzw. pseudoterminale tzn. uzytkownik korzysta z kilku terminali
wirtualnych zrealizowanych jako rozne okna na ekranie terminala fizycznego.
Problemy zwiazane z implementacja strumieni
- koniecznosc implementacji zarowno procedur obslugi jak i wstawiania
(nie da sie zrealizowac 'eleganckich' strumieni tylko z jednym rodzajem tych
procedur
- moduly musza przechowywac informacje o swoim stanie (uniemozliwia zasypianie
procesow)
- trudnosc w rozliczaniu procesow
- niemozliwosc wprowadzenia trybu surowego pracy terminala
- brak mozliwosci zwielokrotniania na poziomie jadra
ZRODLA: glownie podrecznik Maurice'a Bacha, jako ze wspolnie z kolegami
stwierdzilismy, ze w Linuxie nie ma strumieni.
UWAGA: informacja podana wyzej juz teraz nie jest aktualna,
por. Linux STREAMS
(JMD:1999.03.31)
poczatek strony
Wykonanie: Piotr Suchodol