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


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