Ocenite etot tekst:


Mehanizmy mezhprocessnyh vzaimodejstvij v operacionnoj sisteme Unix

Sergej Kuznecov, uchebnye materialy konferencii Industriya Programmirovaniya 96, Centr Informacionnyh Tehnologij

Tradicionnyj podhod OS UNIX - reakciya na slozhnosti Multics

Voznikshie problemy

Izbytochnyj nabor sistemnyh sredstv, prednaznachennyh dlya obespecheniya vozmozhnosti vzaimodejstviya i sinhronizacii processov, kotorye ne obyazatel'no svyazany otnosheniem rodstva

Paket sredstv IPC

Obshchie svojstva vseh treh mehanizmov:

Razdelyaemaya pamyat'

shmget sozdaet novyj segment razdelyaemoj pamyati ili nahodit sushchestvuyushchij segment s tem zhe klyuchom

shmat podklyuchaet segment s ukazannym deskriptorom k virtual'noj pamyati obrashchayushchegosya processa

shmdt otklyuchaet ot virtual'noj pamyati ranee podklyuchennyj k nej segment s ukazannym virtual'nym adresom nachala

shmctl sluzhit dlya upravleniya parametrami, svyazannymi s sushchestvuyushchim segmentom

Posle podklyucheniya segmenta razdelyaemoj pamyati k virtual'noj pamyati processa, on mozhet obrashchat'sya k sootvetstvuyushchim elementam pamyati s ispol'zovaniem obychnyh mashinnyh komand chteniya i zapisi

shmid = shmget(key, size, flag);

virtaddr = shmat(id, addr, flags);

shmdt(addr);

shmctl(id, cmd, shsstatbuf);

Semafory

Obobshchenie klassicheskogo mehanizma semaforov obshchego vida Diekstry

Celesoobraznost' obobshcheniya somnitel'na

Obychno ispol'zovalsya oblegchennyj variant dvoichnyh semaforov

Izvesten algoritm realizacii semaforov obshchego vida na osnove dvoichnyh

Semafor v OS UNIX:

Tri sistemnyh vyzova:

id = semget(key, count, flag);

oldval = semop(id, oplist, count);

|lement massiva oplist:

Esli proverka prav dostupa prohodit normal'no

Znachenie polya operacii polozhitel'no

Znachenie polya operacii ravno nulyu

Znachenie polya operacii otricatel'no

(1) ego absolyutnoe znachenie men'she ili ravno znacheniyu semafora

(2) znachenie semafora men'she absolyutnoj velichiny polya operacii

Stremlenie dobit'sya vozmozhnosti izbegat' tupikovyh situacij

Sistemnyj vyzov semop vypolnyaetsya kak atomarnaya operaciya

Flag IPC_NOWAIT zastavlyaet yadro OS UNIX ne blokirovat' tekushchij process

semctl(id, number, cmd, arg);

Mozhno unichtozhit' individual'nyj semafor v ukazannoj gruppe

Ocheredi soobshchenij

CHetyre sistemnyh vyzova:

msgqid = msgget(key, flag);

Soobshcheniya hranyatsya v vide svyaznogo spiska

Dekskriptor ocheredi soobshchenij - indeks v massive zagolovkov ocheredej soobshchenij

V zagolovke ocheredi hranyatsya:

Struktury dannyh, ispol'zuemye dlya organizacii ocheredej soobshchenij

msgsnd(msgqid, msg, count, flag);

Usloviya uspeshnoj postanovki soobshcheniya v ochered':

Process prodolzhaet svoe vypolnenie

YAdro aktiviziruet (probuzhdaet) vse processy, ozhidayushchie postupleniya soobshchenij iz ocheredi

Prevyshaetsya verhnij predel summarnoj dliny soobshchenij

count = msgrcv(id, msg, maxcount, type, flag);

Znacheniem parametra type yavlyaetsya nul'

Znachenie type est' polozhitel'noe celoe chislo

Znachenie type est' otricatel'noe celoe chislo

V ocheredi otsutstvuyut soobshcheniya, sootvetstvuyushchie specifikacii type

msgctl(id, cmd, mstatbuf);

Programmnye kanaly

Sozdanie neimenovannogo programmnogo kanala

pipe(fdptr);

Sozdanie imenovannyh programmnyh kanalov (ili poluchenie dostupa k sushchestvuyushchim)

Obychnyj sistemnyj vyzov open

Zapis' i chtenie: read i write

Okonchanie raboty processa: close

Programmnye gnezda (sockets)

Podderzhivaemyj yadrom mehanizm, skryvayushchij osobennosti setevoj sredy i pozvolyayushchij edinoobrazno vzaimodejstvovat' processam

Pervoe reshenie:

Tri sostavlyayushchih:

Odna iz vozmozhnyh konfiguracij programmnyh gnezd

Dopustimye kombinacii protokolov i drajverov zadayutsya pri konfiguracii sistemy

Po duhu organizaciya programmnyh gnezd blizka k idee potokov

No menee gibkaya shema

Vzaimodejstvie processov osnovano na modeli "klient-server"

Programmnye gnezda s obshchimi kommunikacionnymi svojstvami, takimi kak sposob imenovaniya i protokol'nyj format adresa, gruppiruyutsya v domeny

Dva tipa programmnyh gnezd

Virtual'nye soedineniya:

Dejtagrammnye programmnye gnezda:

Po umolchaniyu obespechivaetsya podhodyashchij protokol dlya kazhdoj dopustimoj kombinacii "domen-gnezdo"

Sozdanie novogo programmnogo gnezda:

sd = socket(domain, type, protocol);

Zakrytie (unichtozhenie) gnezda

close(sd)

Svyazyvanie ranee sozdannogo programmnogo gnezda s imenem:

bind(sd, socknm, socknlen);

Zapros svyazi s sushchestvuyushchim programmnym gnezdom so storony processa-klienta:

connect(sd, socknm, socknlen);

Informirovaniya o tom, chto process-server planiruet ustanovlenie virtual'nyh soedinenij cherez ukazannoe gnezdo:

listen(sd, qlength);

Vyborka processom-serverom ocherednogo zaprosa na ustanovlenie soedineniya s ukazannym programmnym gnezdom sluzhit funkciya accept:

nsd = accept(sd, address, addrlen);

Peredacha i priem dannyh cherez programmnye gnezda s ustanovlennym virtual'nym soedineniem:

count = send(sd, msg, length, flags);

count = recv(sd, buf, length, flags);

V send:

V recv:

Vmesto send i recv mozhno ispol'zovat' read i write

Dlya posylki i priema soobshchenij v dejtagrammnom rezhime:

count = sendto(sd, msg, length, flags, socknm, socknlen);

count = recvfrom(sd, buf, length, flags, socknm, socknlen);

Nemedlennaya likvidaciya ustanovlennogo soedineniya:

shutdown(sd, mode);

shutdown otlichayutsya ot close:

Potoki (streams)

UNIX System V

Pozvolyayut organizovyvat' raznoobraznye vidy kommunikacii processov

Mnogoobrazie i slozhnost' nabora funkcij biblioteki TLI

Otnositsya k teme realizacij semiurovnevoj modeli ISO/OSI


Last-modified: Thu, 28 May 1998 14:33:09 GMT
Ocenite etot tekst: