Sergej Kuznecov. Mehanizmy mezhprocessnyh vzaimodejstvij v operacionnoj sisteme Unix
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
- IPC - Inter-Process Communication Facilities
- s poyavleniem UNIX System V Release 4.0 vse eti sredstva byli
uzakoneny i voshli v fakticheskij standart OS UNIX sovremennogo
obrazca
- v raznyh variantah sistemy sredstva IPC realizuyutsya po-raznomu
- effektivnost' realizacii razlichaetsya
- uslozhnyaetsya razrabotka mobil'nyh asinhronnyh programmnyh kompleksov
Paket sredstv IPC
- UNIX System V Release 3.0
- sredstva, obespechivayushchie vozmozhnost' nalichiya obshchej pamyati
mezhdu processami (segmenty razdelyaemoj pamyati - shared memory
segments)
- sredstva, obespechivayushchie vozmozhnost' sinhronizacii processov
pri dostupe s sovmestno ispol'zuemym resursam, naprimer, k razdelyaemoj
pamyati (semafory - semaphores)
- sredstva, obespechivayushchie vozmozhnost' posylki processom soobshchenij
drugomu proizvol'nomu processu (ocheredi soobshchenij - message
queues)
Obshchie svojstva vseh treh mehanizmov:
- dlya kazhdogo mehanizma podderzhivaetsya obshchesistemnaya
tablica, elementy kotoroj opisyvayut vseh sushchestvuyushchih v dannyj
moment predstavitelej mehanizma (konkretnye segmenty, semafory
ili ocheredi soobshchenij)
- element tablicy soderzhit nekotoryj chislovoj klyuch, kotoryj
yavlyaetsya vybrannym pol'zovatelem imenem predstavitelya sootvetstvuyushchego
mehanizma
- process, zhelayushchij nachat' pol'zovat'sya odnim iz mehanizmov,
obrashchaetsya k sisteme s sistemnym vyzovom iz semejstva "get",
otvetnym parametrom yavlyaetsya chislovoj deskriptor
- klyuch IPC_PRIVATE
- klyuch IPC_CREAT
- zashchita dostupa osnovyvaetsya na teh zhe principah, chto i zashchita
dostupa k fajlam
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);
- size
opredelyaet zhelaemyj razmer segmenta v bajtah
- esli v tablice razdelyaemoj pamyati nahoditsya element, soderzhashchij
zadannyj klyuch, i prava dostupa ne protivorechat tekushchim harakteristikam
processa, to znacheniem sistemnogo vyzova yavlyaetsya deskriptor sushchestvuyushchego
segmenta
- real'nyj razmer segmenta mozhno uznat' s pomoshch'yu sistemnogo
vyzova shmctl
- inache sozdaetsya novyj segment s razmerom ne men'she ustanovlennogo
v sisteme minimal'nogo razmera segmenta razdelyaemoj pamyati i ne
bol'she ustanovlennogo maksimal'nogo razmera
- sozdanie segmenta ne oznachaet nemedlennogo vydeleniya pod nego
osnovnoj pamyati
- otkladyvaetsya do vypolneniya pervogo sistemnogo vyzova podklyucheniya
segmenta k virtual'noj pamyati nekotorogo processa
- pri vypolnenii poslednego sistemnogo vyzova otklyucheniya segmenta
ot virtual'noj pamyati sootvetstvuyushchaya osnovnaya pamyat' osvobozhdaetsya
virtaddr = shmat(id, addr,
flags);
- id
- eto ranee poluchennyj deskriptor segmenta
- addr - zhelaemyj
processom virtual'nyj adres, kotoryj dolzhen sootvetstvovat' nachalu
segmenta v virtual'noj pamyati
- virtaddr - real'nyj
virtual'nyj adres nachala segmenta
- ne obyazatel'no sovpadaet so znacheniem pryamogo parametra addr
- esli addr ==
0, yadro vybiraet naibolee udobnyj virtual'nyj adres nachala segmenta
shmdt(addr);
- addr
- virtual'nyj adres nachala segmenta v virtual'noj pamyati, ranee
poluchennyj ot sistemnogo vyzova shmat
shmctl(id, cmd, shsstatbuf);
- cmd
identificiruet trebuemoe konkretnoe dejstvie
- vazhna funkciya unichtozheniya segmenta razdelyaemoj pamyati
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:
- znachenie semafora
- identifikator processa, kotoryj hronologicheski poslednim rabotal
s semaforom
- chislo processov, ozhidayushchih uvelicheniya znacheniya semafora
- chislo processov, ozhidayushchih nulevogo znacheniya semafora
Tri sistemnyh vyzova:
- semget
dlya sozdaniya i polucheniya dostupa k naboru semaforov
- semop dlya manipulirovaniya
znacheniyami semaforov
- semctl dlya vypolneniya
upravlyayushchih operacij nad naborom semaforov
id = semget(key, count,
flag);
- key,
flag
i id
- obychnyj smysl
- count - chislo
semaforov v nabore semaforov, obladayushchih odnim i tem zhe klyuchom
- individual'nyj semafor identificiruetsya deskriptorom nabora
semaforov i nomerom semafora v nabore
- esli nabor semaforov s ukazannym klyuchom uzhe sushchestvuet, to
chislo semaforov v gruppe mozhno uznat' s pomoshch'yu sistemnogo vyzova
semctl
oldval = semop(id, oplist,
count);
- id
- deskriptor gruppy semaforov
- oplist - massiv
opisatelej operacij nad semaforami gruppy
- count - razmer
etogo massiva
- vozvrashchaetsya znachenie poslednego obrabotannogo semafora
|lement massiva oplist:
- nomer semafora v ukazannom nabore semaforov
- operaciya
- flagi
Esli proverka prav dostupa prohodit normal'no
- ukazannye v massive oplist
nomera semaforov ne vyhodyat za predely obshchego razmera nabora semaforov
- dlya kazhdogo elementa massiva oplist
znachenie semafora izmenyaetsya v sootvetstvii so znacheniem polya
"operaciya"
Znachenie polya operacii polozhitel'no
- znachenie semafora uvelichivaetsya na edinicu
- vse processy, ozhidayushchie uvelicheniya znacheniya semafora,
aktiviziruyutsya (probuzhdayutsya)
Znachenie polya operacii ravno nulyu
- esli znachenie semafora ravno nulyu, vybiraetsya
sleduyushchij element massiva oplist
- inache chislo processov, ozhidayushchih nulevogo znacheniya
semafora, uvelichivaetsya na edinicu
- obrativshijsya process perevoditsya v sostoyanie
ozhidaniya (usyplyaetsya)
Znachenie polya operacii otricatel'no
(1) ego absolyutnoe znachenie men'she ili ravno znacheniyu
semafora
- eto otricatel'noe znachenie pribavlyaetsya k znacheniyu
semafora
- esli znachenie semafora stalo nulevym, to yadro
aktiviziruet vse processy, ozhidayushchie nulevogo znacheniya etogo semafora
(2) znachenie semafora men'she absolyutnoj velichiny
polya operacii
- chislo processov, ozhidayushchih uvelicheniya znacheniya
semafora uvelichivaetsya na edinicu
- tekushchij process otkladyvaetsya
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
- lish' soobshchat' v otvetnyh parametrah o vozniknovenii
situacii, privedshej by k blokirovaniyu processa
semctl(id, number, cmd,
arg);
- id
- eto deskriptor gruppy semaforov
- number
- nomer semafora v gruppe
- cmd
- kod operacii
- arg - ukazatel'
na strukturu, soderzhimoe kotoroj interpretiruetsya v zavisimosti
ot operacii
Mozhno unichtozhit' individual'nyj semafor v ukazannoj
gruppe
Ocheredi soobshchenij
CHetyre sistemnyh vyzova:
- msgget
dlya obrazovaniya novoj ocheredi soobshchenij ili polucheniya deskriptora
sushchestvuyushchej ocheredi
- msgsnd
dlya posylki soobshcheniya (ego postanovki v ochered' soobshchenij)
- msgrcv
dlya priema soobshcheniya (vyborki soobshcheniya iz ocheredi)
- msgctl dlya vypolneniya
upravlyayushchih dejstvij
msgqid = msgget(key, flag);
Soobshcheniya hranyatsya v vide svyaznogo spiska
Dekskriptor ocheredi soobshchenij - indeks v massive
zagolovkov ocheredej soobshchenij
V zagolovke ocheredi hranyatsya:
- ukazateli na pervoe i poslednee soobshchenie v dannoj
ocheredi
- chislo soobshchenij
- obshchij razmer v bajtah soobshchenij, nahodyashchihsya v ocheredi
- identifikatory processov, kotorye poslednimi poslali ili prinyali
soobshchenie cherez dannuyu ochered'
- vremennye metki poslednih vypolnennyh operacij msgsnd,
msgrsv i msgctl
Struktury dannyh, ispol'zuemye dlya
organizacii ocheredej soobshchenij
msgsnd(msgqid, msg, count,
flag);
- msg
- eto ukazatel' na strukturu, soderzhashchuyu celochislennyj tip soobshcheniya
i simvol'nyj massiv
- count - zadaet
razmer soobshcheniya v bajtah
- flag opredelyaet
dejstviya yadra pri vyhode za predely dopustimyh razmerov vnutrennej
bufernoj pamyati
Usloviya uspeshnoj postanovki soobshcheniya v ochered':
- process dolzhen imet' pravo na zapis' v ochered'
- dlina soobshcheniya ne dolzhna prevoshodit' verhnij predel
- obshchaya dlina soobshchenij ne dolzhna prevoshodit' ustanovlennogo
predela
- tip soobshcheniya dolzhen byt' polozhitel'nym celym chislom
Process prodolzhaet svoe vypolnenie
YAdro aktiviziruet (probuzhdaet) vse processy, ozhidayushchie postupleniya
soobshchenij iz ocheredi
Prevyshaetsya verhnij predel summarnoj dliny
soobshchenij
- obrativshijsya process otkladyvaetsya do razgruzki
ocheredi
- no est' flag IPC_NOWAIT
(kak dlya semaforov)
count = msgrcv(id, msg,
maxcount, type, flag);
- msg
- ukazatel' na strukturu dannyh v adresnom prostranstve pol'zovatelya
dlya razmeshcheniya prinyatogo soobshcheniya
- maxcount
- razmer oblasti dannyh (massiva bajtov) v strukture msg
- type
specificiruet tip soobshcheniya, kotoroe zhelatel'no prinyat'
- flag
ukazyvaet yadru, chto sleduet predprinyat', esli v ukazannoj ocheredi
soobshchenij otsutstvuet soobshchenie s ukazannym tipom
- count
- real'noe chislo bajtov, peredannyh pol'zovatelyu
Znacheniem parametra type yavlyaetsya nul'
- vybiraetsya pervoe soobshchenie
- kopiruetsya v zadannuyu pol'zovatel'skuyu strukturu
dannyh
- processy, otlozhennye po prichine perepolneniya
ocheredi soobshchenij, aktiviziruyutsya
- esli znachenie parametra maxcount
okazyvaetsya men'she real'nogo razmera soobshcheniya, yadro ne udalyaet
soobshchenie iz ocheredi i vozvrashchaet kod oshibki
- esli zadan flag MSG_NOERROR,
to vyborka soobshcheniya proizvoditsya, i v bufer pol'zovatelya perepisyvayutsya
pervye maxcount
bajtov soobshcheniya
Znachenie type est' polozhitel'noe celoe chislo
- vybiraetsya pervoe soobshchenie s takim zhe tipom
Znachenie type est' otricatel'noe celoe chislo
- vybiraetsya pervoe soobshchenie, znachenie tipa kotorogo
men'she ili ravno absolyutnomu znacheniyu type
V ocheredi otsutstvuyut soobshcheniya, sootvetstvuyushchie
specifikacii type
- process otkladyvaetsya do poyavleniya v ocheredi
trebuemogo soobshcheniya
- no est' flag IPC_NOWAIT
msgctl(id, cmd, mstatbuf);
- opros sostoyaniya opisatelya ocheredi soobshchenij
- izmenenie ego sostoyaniya
- unichtozhenie ocheredi soobshchenij
Programmnye kanaly
Sozdanie neimenovannogo programmnogo kanala
pipe(fdptr);
- fdptr
- eto ukazatel' massiva iz dvuh celyh chisel dlya razmeshcheniya deskriptora
dlya chteniya iz programmnogo kanala (s pomoshch'yu read)
i zapisi v programmnyj kanal (s pomoshch'yu write)
- obychnye deskriptory fajlov
- dva elementa tablicy otkrytyh fajlov processa
Sozdanie imenovannyh programmnyh kanalov
(ili poluchenie dostupa k sushchestvuyushchim)
Obychnyj sistemnyj vyzov open
- esli kanal otkryvaetsya na zapis', i ni odin process
ne otkryl ego dlya chteniya, to process blokiruetsya do teh por, poka
nekotoryj process ne otkroet etot kanal dlya chteniya
- analogichno obrabatyvaetsya otkrytie dlya chteniya
- imeetsya flag NO_DELAY
Zapis' i chtenie: read
i write
- pri zapisi dannye pomeshchayutsya v nachalo kanala
- pri chtenii vybirayutsya iz konca kanala
- vozmozhny otkladyvaniya processov
Okonchanie raboty processa: close
- pri vypolnenii poslednego zakrytiya kanala po
zapisi vse processy, ozhidayushchie chteniya iz programmnogo kanala,
aktiviziruyutsya s vozvratom koda oshibki iz sistemnogo vyzova
Programmnye gnezda (sockets)
Podderzhivaemyj yadrom mehanizm, skryvayushchij osobennosti
setevoj sredy i pozvolyayushchij edinoobrazno vzaimodejstvovat' processam
- vypolnyayushchimsya na odnom komp'yutere
- v predelah odnoj lokal'noj seti
- raznesennym na raznye komp'yutery territorial'no raspredelennoj
seti
Pervoe reshenie:
Tri sostavlyayushchih:
- komponent urovnya programmnyh gnezd (nezavisyashchij
ot setevogo protokola i sredy peredachi dannyh)
- komponentom protokol'nogo urovnya (nezavisyashchij ot sredy peredachi
dannyh)
- komponentom urovnya upravleniya setevym ustrojstvom
Odna iz vozmozhnyh konfiguracij
programmnyh gnezd
Dopustimye kombinacii protokolov i drajverov zadayutsya
pri konfiguracii sistemy
- vo vremya raboty sistemy menyat' nel'zya
Po duhu organizaciya programmnyh gnezd blizka k idee
potokov
No menee gibkaya shema
- ne dopuskaet izmeneniya konfiguracii "na
hodu"
Vzaimodejstvie processov osnovano na modeli "klient-server"
- process-server "slushaet (listens)"
svoe programmnoe gnezdo
- process-klient pytaetsya obshchat'sya s processom-serverom
cherez drugoe programmnoe gnezdo
- yadro podderzhivaet vnutrennie soedineniya i marshrutizaciyu
dannyh ot klienta k serveru
Programmnye gnezda s obshchimi kommunikacionnymi svojstvami,
takimi kak sposob imenovaniya i protokol'nyj format adresa, gruppiruyutsya
v domeny
- "domen sistemy UNIX"
dlya processov, kotorye vzaimodejstvuyut cherez programmnye gnezda
v predelah odnogo komp'yutera
- "domen Internet"
dlya processov, kotorye vzaimodejstvuyut v seti v sootvetstvii s
semejstvom protokolov TCP/IP
Dva tipa programmnyh gnezd
- s virtual'nym soedineniem (stream sockets)
- dejtagrammnye gnezda (datagram sockets)
Virtual'nye soedineniya:
- peredacha dannyh ot klienta k serveru v vide nepreryvnogo
potoka bajtov s garantiej dostavki
- do nachala peredachi dannyh dolzhno byt' ustanovleno
soedinenie
Dejtagrammnye programmnye gnezda:
- ne garantiruyut absolyutnoj nadezhnoj, posledovatel'noj
dostavki soobshchenij i otsutstviya dublikatov dejtagramm
- ne trebuetsya predvaritel'noe ustanovlenie soedinenij
Po umolchaniyu obespechivaetsya podhodyashchij protokol
dlya kazhdoj dopustimoj kombinacii "domen-gnezdo"
- TCP dlya virtual'nyh soedinenij
- UDP dlya dejtagrammnogo sposoba kommunikacij
Sozdanie novogo programmnogo gnezda:
sd = socket(domain, type,
protocol);
- domain
- domen gnezda
- type - tip (s
virtual'nym soedineniem ili dejtagrammnoe)
- protocol - zhelaemyj
setevoj protokol
- sd - deskriptor
programmnogo gnezda
Zakrytie (unichtozhenie) gnezda
close(sd)
Svyazyvanie ranee sozdannogo programmnogo gnezda
s imenem:
bind(sd, socknm, socknlen);
- sd
- deskriptor ranee sozdannogo programmnogo gnezda
- socknm - adres
struktury, kotoraya soderzhit imya (identifikator) gnezda, sootvetstvuyushchee
trebovaniyam domena dannogo gnezda i ispol'zuemogo protokola
- dlya domena sistemy UNIX imya yavlyaetsya imenem ob®ekta v fajlovoj
sisteme
- pri sozdanii programmnogo gnezda sozdaetsya fajl
- socknlen - dlina
v bajtah struktury socknm
Zapros svyazi s sushchestvuyushchim programmnym gnezdom
so storony processa-klienta:
connect(sd, socknm, socknlen);
- smysl parametrov, kak u funkcii bind
- imya programmnogo gnezda na drugoj storone kommunikacionnogo
kanala
- u gnezda s deskriptorom sd
i u gnezda s imenem socknm
dolzhny byt' odinakovye domen i protokol
- esli tip gnezda s deskriptorom sd
- dejtagrammnyj, to connect
sluzhit dlya informirovaniya sistemy ob adrese naznacheniya paketov,
kotorye v dal'nejshem budut posylat'sya s pomoshch'yu funkcii send
Informirovaniya o tom, chto process-server planiruet
ustanovlenie virtual'nyh soedinenij cherez ukazannoe gnezdo:
listen(sd, qlength);
- qlength
- maksimal'naya dlina ocheredi zaprosov na ustanovlenie soedineniya,
kotorye dolzhny buferizovat'sya sistemoj, poka ih ne vyberet process-server
Vyborka processom-serverom ocherednogo zaprosa na
ustanovlenie soedineniya s ukazannym programmnym gnezdom sluzhit
funkciya accept:
nsd = accept(sd, address, addrlen);
- sd
- deskriptor sushchestvuyushchego programmnogo gnezda, dlya kotorogo ranee
byla vypolnena funkciya listen
- address
- massiv dannyh, v kotoryj dolzhna byt' pomeshchena informaciya, harakterizuyushchaya
imya programmnogo gnezda klienta
- addrlen
- adres, po kotoromu nahoditsya dlina massiva address
- vypolnenie funkcii privodit k ustanovleniyu virtual'nogo
soedineniya
- nsd
- novyj deskriptor programmnogo gnezda, kotoryj dolzhen ispol'zovat'sya
pri rabote cherez dannoe soedinenie
- po adresu addrlen
pomeshchaetsya real'nyj razmer massiva dannyh, kotorye zapisany po
adresu address
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:
- msg
ukazyvaet na bufer s dannymi, kotorye trebuetsya poslat'
- length
- dlina etogo bufera
- flags
== MSG_OOB
vneocherednaya posylka dannyh
V recv:
- buf
ukazyvaet na bufer, v kotoryj sleduet pomestit' prinimaemye dannye
- length
- maksimal'naya dlina etogo bufera
- flags
== MSG_PEEK
perepis' soobshcheniya v pol'zovatel'skij bufer bez ego udaleniya
iz sistemnyh buferov
Vmesto send
i recv
mozhno ispol'zovat' read
i write
- vypolnyayutsya analogichno send
i recv
Dlya posylki i priema soobshchenij v dejtagrammnom
rezhime:
count = sendto(sd, msg,
length, flags, socknm, socknlen);
count = recvfrom(sd, buf,
length, flags, socknm, socknlen);
- smysl parametrov sd,
msg,
buf
i lenght
analogichen smyslu odnoimennyh parametrov funkcij send
i recv
- socknm
i socknlen
funkcii sendto
zadayut imya programmnogo gnezda, v kotoroe posylaetsya soobshchenie
- mogut byt' opushcheny, esli do etogo vyzyvalas'
funkciya connect
- parametry socknm
i socknlen
funkcii recvfrom
pozvolyayut serveru poluchit' imya poslavshego soobshchenie processa-klienta
Nemedlennaya likvidaciya ustanovlennogo soedineniya:
shutdown(sd, mode);
- nemedlenno ostanovit' kommunikacii
- so storony posylayushchego processa
- so storony prinimayushchego processa
- s obeih storon
- v zavisimosti ot znacheniya parametra mode
shutdown otlichayutsya
ot close:
- vypolnenie close
poslednej "pritormazhivaetsya" do okonchaniya popytok sistemy
dostavit' uzhe otpravlennye soobshcheniya
- shutdown razryvaet
soedinenie, no ne likvidiruet deskriptory ranee soedinennyh gnezd
- dlya likvidacii trebuetsya vyzov close
Potoki (streams)
UNIX System V
- biblioteka TLI (Transport Layer Interface)
- transportnyj servis na osnove steka protokolov TCP/IP
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