Sistemnaya arhitektura QNX4 --------------------------------------------------------------- (S) QNX Software Systems Ltd., 1996 Avtor: QNX Software Systems Ltd. Russkoe izdanie: SWD Software Ltd. WWW: http://www.swd.ru/qnx/support/literature/sysarch/ E-mail: books.qnx@swd.ru Date: 04 Mar 2002 ---------------------------------------------------------------
Vpervye na russkom yazyke kniga o QNX. Rob Kerten "Vvedenie v QNX/Neutrino 2". Annotaciya, Zakaz pechatnoj versii(400 r.)

Sistemnaya arhitektura QNX4

Kniga Sistemnaya arhitektura soprovozhdaet operacionnuyu sistemu QNX i prednaznachena kak dlya razrabotchikov prilozhenij, tak i dlya konechnyh pol'zovatelej.

V knige podrobno rassmatrivaetsya struktura i funkcii QNX. V nej opisany mikroyadro, sistemnye menedzhery, a takzhe unikal'nyj mehanizm svyazi mezhdu processami, osnovannyj na peredache soobshchenij. Prezhde chem ispol'zovat' QNX, rekomenduetsya snachala prochitat' etu knigu.

Za informaciej ob ustanovke i ispol'zovanii QNX, obratites' k knige Rukovodstvo pol'zovatelya OS QNX

Sistemnaya arhitektura soderzhit sleduyushchie glavy:



 

Koncepciya QNX

|ta glava ohvatyvaet sleduyushchie temy:

CHto takoe QNX?

Glavnaya obyazannost' operacionnoj sistemy sostoit v upravlenii resursami komp'yutera. Vse dejstviya v sisteme - dispetcherizaciya prikladnyh programm, zapis' fajlov na disk, peresylka dannyh po seti i t.p. - dolzhny vypolnyat'sya sovmestno nastol'ko slitno i prozrachno, naskol'ko eto vozmozhno.

Nekotorye oblasti primeneniya pred®yavlyayut bolee zhestkie trebovaniya k upravleniyu resursami i dispetcherizacii programm, chem drugie. Prilozheniya real'nogo vremeni, naprimer, polagayutsya na sposobnost' operacionnoj sistemy obrabatyvat' mnogochislennye sobytiya v predelah ogranichennogo intervala vremeni. CHem bystree reagiruet operacionnaya sistema, tem bol'shee prostranstvo dlya manevra imeet prilozhenie real'nogo vremeni v predelah zhestkih vremennyh ramok.

Operacionnaya sistema QNX ideal'na dlya prilozhenij real'nogo vremeni. Ona obespechivaet vse neot®emlemye sostavlyayushchie sistemy real'nogo vremeni: mnogozadachnost', dispetcherizaciyu programm na osnove prioritetov i bystroe pereklyuchenie konteksta.

QNX - udivitel'no gibkaya sistema. Razrabotchiki legko mogut nastroit' operacionnuyu sistemu takim obrazom, chtoby ona otvechala trebovaniyam konkretnyh prilozhenij. QNX pozvolyaet vam sozdat' sistemu, ispol'zuyushchuyu tol'ko neobhodimye dlya resheniya vashej zadachi resursy. Konfiguraciya sistemy mozhet izmenyat'sya v shirokom diapazone - ot yadra s neskol'kimi nebol'shimi modulyami do polnocennoj setevoj sistemy, obsluzhivayushchej sotni pol'zovatelej.

QNX dostigaet svoego unikal'nogo urovnya proizvoditel'nosti, modul'nosti i prostoty blagodarya dvum fundamental'nym principam:

Arhitektura mikroyadra sistemy QNX

QNX sostoit iz nebol'shogo yadra, koordiniruyushchego rabotu vzaimodejstvuyushchih processov. Kak pokazano na risunke, struktura bol'she napominaet ne ierarhiyu, a komandu, v kotoroj neskol'ko igrokov odnogo urovnya vzaimodejstvuyut mezhdu soboj i so svoim "zashchitnikom" - yadrom.


fig: i/modules.gif


Mikroyadro sistemy QNX koordiniruet rabotu sistemnyh menedzherov.


Nastoyashchee yadro

YAdro - eto "serdce" lyuboj operacionnoj sistemy. V nekotoryh operacionnyh sistemah na nego vozlagaetsya tak mnogo funkcij, chto yadro, po suti, zamenyaet vsyu operacionnuyu sistemu!

V QNX zhe Mikroyadro - eto nastoyashchee yadro. Vo-pervyh, kak i sleduet yadru real'nogo vremeni, yadro QNX imeet ochen' malen'kij razmer. Vo-vtoryh, ono vypolnyaet dve vazhnejshie funkcii:

V otlichie ot vseh ostal'nyh processov, yadro nikogda ne poluchaet upravleniya v rezul'tate dispetcherizacii. Vhodyashchij v sostav yadra kod vypolnyaetsya tol'ko v rezul'tate pryamyh vyzovov iz processa ili apparatnogo preryvaniya.

Sistemnye processy

Vse uslugi operacionnoj sistemy, za isklyucheniem teh, kotorye vypolnyayutsya yadrom, v QNX predostavlyayutsya cherez standartnye processy. Tipichnaya konfiguraciya QNX imeet sleduyushchie sistemnye processy:

Sistemnye i pol'zovatel'skie processy

Sistemnye processy prakticheski nichem ne otlichayutsya ot lyubyh napisannyh pol'zovatelem programm - oni ne imeyut kakogo-libo skrytogo ili osobogo interfejsa, nedostupnogo pol'zovatel'skim processam.

Imenno za schet takoj sistemnoj arhitektury QNX obladaet unikal'noj narashchivaemost'yu. Tak kak bol'shinstvo uslug operacionnoj sistemy predostavlyayutsya standartnymi processami QNX, to rasshirenie operacionnoj sistemy trebuet vsego lish' napisaniya novoj programmy, obespechivayushchej novuyu uslugu!

Fakticheski, granica mezhdu operacionnoj sistemoj i prikladnoj programmoj mozhet byt' ochen' razmyta. Edinstvennyj kriterij, po kotoromu my mozhem otlichit' prikladnye processy i sistemnye servisnye processy, sostoit v tom, chto process operacionnoj sistemy upravlyaet kakim-libo resursom v interesah prikladnogo processa.

Predpolozhim, chto vy napisali server bazy dannyh. Kak zhe dolzhen byt' klassificirovan etot process?

Tochno tak zhe, kak server fajlovoj sistemy prinimaet zaprosy (v QNX realizovannye cherez mehanizm soobshchenij) na otkrytie fajlov i zapis' ili chtenie dannyh, eto budet delat' i server bazy dannyh. Hotya zaprosy k serveru bazy dannyh mogut byt' i bolee slozhnymi, shodstvo oboih serverov zaklyuchaetsya v tom, chto oba oni obespechivayut dostup k resursu posredstvom zaprosov. Oba oni yavlyayutsya nezavisimymi processami, kotorye mogut byt' napisany pol'zovatelem i zapuskat'sya po mere neobhodimosti.

Server bazy dannyh mozhet rassmatrivat'sya kak process v odnom sluchae i kak prilozhenie v drugom. |to dejstvitel'no ne imeet znacheniya! Vazhno to, chto sozdanie i vypolnenie takih processov v QNX ne trebuet absolyutno nikakih izmenenij v standartnyh komponentah operacionnoj sistemy.

Drajvery ustrojstv

Drajvery ustrojstv - eto processy, kotorye yavlyayutsya posrednikami mezhdu operacionnoj sistemoj i ustrojstvami i izbavlyayut operacionnuyu sistemu ot neobhodimosti imet' delo s osobennostyami konkretnyh ustrojstv.

Tak kak drajvery zapuskayutsya kak obychnye processy, dobavlenie novogo drajvera v QNX ne vliyaet na drugie chasti operacionnoj sistemy. Takim obrazom, dobavlenie novogo drajvera v QNX ne trebuet nichego, krome neposredstvenno zapuska etogo drajvera.

Posle zapuska i zaversheniya procedury inicializacii, drajver mozhet vybrat' odin iz dvuh variantov povedeniya:

Svyaz' mezhdu processami (IPC)

V tipichnoj dlya mnogozadachnoj sistemy real'nogo vremeni situacii, kogda neskol'ko processov vypolnyayutsya odnovremenno, operacionnaya sistema dolzhna predostavit' mehanizmy, pozvolyayushchie im obshchat'sya drug s drugom.

Svyaz' mezhdu processami (Interprocess communication, sokrashchenno IPC) yavlyaetsya klyuchom k razrabotke prilozhenij kak sovokupnosti processov, v kotoryh kazhdyj process vypolnyaet otvedennuyu emu chast' obshchej zadachi.

QNX predostavlyaet prostoj, no moshchnyj nabor vozmozhnostej IPC, kotorye sushchestvenno oblegchayut razrabotku prilozhenij, sostoyashchih iz vzaimodejstvuyushchih processov.

Peredacha soobshchenij

QNX byla pervoj kommercheskoj operacionnoj sistemoj svoego klassa, kotoraya ispol'zovala peredachu soobshchenij v kachestve osnovnogo sposoba IPC. Imenno posledovatel'noe voploshchenie metoda peredachi soobshcheniya v masshtabah vsej operacionnoj sistemy obuslovlivaet moshchnost', prostotu i elegantnost' QNX.

Soobshcheniya v QNX - eto posledovatel'nost' bajt, peredavaemyh ot odnogo processa drugomu. Operacionnaya sistema ne pytaetsya analizirovat' soderzhanie soobshcheniya - peredavaemye dannye imeyut smysl tol'ko dlya otpravitelya i poluchatelya, i ni dlya kogo bolee.

Peredacha soobshcheniya pozvolyaet ne tol'ko obmenivat'sya dannymi, no i yavlyaetsya sposobom sinhronizacii vypolneniya neskol'kih processov. Kogda oni posylayut, poluchayut ili otvechayut na soobshcheniya, processy preterpevayut razlichnye "izmeneniya sostoyaniya", kotorye vliyayut na to, kogda i kak dolgo oni mogut vypolnyat'sya. Znaya sostoyaniya i prioritety processov, yadro organizuet ih dispetcherizaciyu takim obrazom, chtoby maksimal'no effektivno ispol'zovat' resursy central'nogo processora (CP).

Prilozhenie real'nogo vremeni i drugie otvetstvennye prilozheniya po pravu nuzhdayutsya v nadezhnom mehanizme peredachi soobshchenij, t.k. vhodyashchie v sostav etih prilozhenij processy tesno vzaimosvyazany. Realizovannyj v QNX mehanizm peredachi soobshchenij sposobstvuet uporyadocheniyu i povysheniyu nadezhnosti programm.

QNX kak set'

V prostejshem sluchae lokal'naya set' obespechivaet razdelyaemyj dostup k fajlam i periferijnym ustrojstvam dlya neskol'kih soedinennyh mezhdu soboj komp'yuterov. QNX idet gorazdo dal'she etogo prostejshego predstavleniya i ob®edinyaet vsyu set' v edinyj odnorodnyj nabor resursov.

Lyuboj process na lyubom komp'yutere v sostave seti mozhet neposredstvenno ispol'zovat' lyuboj resurs na lyubom drugom komp'yutere. S tochki zreniya prilozhenij, ne sushchestvuet nikakoj raznicy mezhdu mestnym ili udalennym resursom, i ispol'zovanie udalennyh resursov ne trebuet kakih-libo special'nyh sredstv. Bolee togo, chtoby opredelit', nahoditsya li takoj resurs kak fajl ili ustrojstvo na lokal'nom komp'yutere ili na drugom uzle seti, v programmu potrebuetsya vklyuchit' special'nyj dopolnitel'nyj kod!

Pol'zovateli mogut imet' dostup k fajlam po vsej seti, ispol'zovat' lyuboe periferijnoe ustrojstvo, zapuskat' programmy na lyubom komp'yutere seti (pri uslovii, chto oni imeyut nadlezhashchie polnomochiya). Svyaz' mezhdu processami osushchestvlyaetsya edinoobrazno, nezavisimo ot ih mestopolozheniya v seti. V osnove takoj prozrachnoj podderzhki seti v QNX lezhit vseob®emlyushchaya koncepciya IPC na osnove peredachi soobshchenij.

Model' edinogo komp'yutera

QNX iznachal'no proektirovalsya kak setevaya operacionnaya sistema. V nekotoryh otnosheniyah QNX set' napominaet skoree bol'shuyu |VM, nezheli nabor mini-komp'yuterov. Pol'zovatelyam izvestno, chto v rasporyazhenii lyuboj iz prikladnyh programm imeetsya bol'shoj nabor resursov. No v otlichie ot bol'shoj |VM, QNX obespechivaet bystruyu reakciyu sistemy, t.k. sootvetstvuyushchij ob®em vychislitel'nyh resursov mozhet byt' vydelen na kazhdom uzle v sootvetstvii s potrebnostyami kazhdogo pol'zovatelya.

V usloviyah upravleniya proizvodstvom ispol'zuyutsya programmiruemye kontrollery i drugie ustrojstva vvoda/vyvoda, a takzhe kompleksy programm, rabotayushchie v rezhime real'nogo vremeni, kotorym mozhet potrebovat'sya bol'she resursov, chem drugim menee otvetstvennym prilozheniyam, takim kak tekstovyj redaktor. Set' QNX dostatochno "otzyvchiva", chtoby podderzhivat' odnovremenno oba etih tipa prilozhenij, QNX pozvolyaet sfokusirovat' vychislitel'nuyu moshchnost' sistemy na proizvodstvennom oborudovanii (tam, gde eto neobhodimo), v to zhe vremya, ne zhertvuya interfejsom pol'zovatelya.

Gibkaya podderzhka seti

QNX set' mozhet byt' postroena s ispol'zovaniem razlichnogo oborudovaniya i standartnyh promyshlennyh protokolov. V silu svoej polnoj prozrachnosti dlya prikladnyh programm i pol'zovatelej, novye setevye arhitektury mogut byt' vnedreny v lyuboe vremya, ne razrushaya operacionnoj sistemy.


Note: Spisok podderzhivaemogo QNX setevogo oborudovaniya popolnyaetsya so vremenem. Dlya polucheniya podrobnoj informacii obratites' k dokumentacii na setevoe oborudovanie, kotoroe vy ispol'zuete.

Kazhdomu uzlu QNX seti prisvaivaetsya unikal'nyj nomer, kotoryj stanovitsya ego identifikatorom. |tot nomer takzhe edinstvennyj vidimyj priznak togo, funkcioniruet QNX kak set' ili kak odnoprocessornaya operacionnaya sistema.

Takaya stepen' prozrachnosti yavlyaetsya eshche odnim primerom bol'shih vozmozhnostej arhitektury QNX, osnovannoj na peredache soobshchenij. Vo mnogih operacionnyh sistemah takie vazhnye funkcii kak podderzhka seti, IPC ili dazhe peredacha soobshchenij vypolneny v vide nadstroek nad operacionnoj sistemoj, a ne integrirovany neposredstvenno v ee serdcevinu. Rezul'tatom takogo podhoda yavlyaetsya neuklyuzhij i neeffektivnyj interfejs s "dvojnym standartom", kogda svyaz' mezhdu processami - eto odno delo, v to vremya kak proniknovenie v skrytyj interfejs tainstvennogo monolitnogo yadra - sovershenno drugoe delo!

QNX, naprotiv, ishodit iz togo, chto effektivnaya svyaz' yavlyaetsya klyuchom k effektivnoj rabote. Peredacha soobshchenij yavlyaetsya, takim obrazom, kraeugol'nym kamnem arhitektury QNX, uvelichivaet effektivnost' vseh bez isklyucheniya tranzakcij mezhdu processami v sisteme, nezavisimo ot togo, idet li rech' o peredache dannyh po vnutrennej shine personal'nogo komp'yutera ili po koaksial'nomu kabelyu na rasstoyanie neskol'kih mil'.

Teper' davajte perejdem k bolee podrobnomu rassmotreniyu struktury QNX.

Mikroyadro

|ta glava ohvatyvaet sleduyushchie temy:

Vvedenie

Mikroyadro QNX otvechaet za vypolnenie sleduyushchih funkcij:


fig: i/kernel.gif


Vnutri mikroyadra QNX.


Svyaz' mezhdu processami

Mikroyadro QNX podderzhivaet tri vazhnejshie formy svyazi mezhdu processami: soobshcheniya, proksi i signaly.

IPC posredstvom soobshchenij

Soobshcheniya v QNX - eto pakety bajt, kotorye sinhronno peredayutsya ot odnogo processa k drugomu. QNX pri etom ne analiziruet soderzhanie soobshcheniya. Peredavaemye dannye ponyatny tol'ko otpravitelyu i poluchatelyu i nikomu bolee.

Primitivy peredachi soobshchenij

Dlya neposredstvennoj svyazi drug s drugom vzaimodejstvuyushchie processy ispol'zuyut sleduyushchie funkcii yazyka programmirovaniya Si:
Funkciya yazyka Si: Naznachenie:
Send()posylka soobshchenij
Receive()poluchenie soobshchenij
Reply()otvet processu, poslavshemu soobshchenie

|ti funkcii mogut byt' ispol'zovany kak lokal'no, t.e. dlya svyazi mezhdu processami na odnom komp'yutere, tak i v predelah seti, t.e. dlya svyazi mezhdu processami na raznyh uzlah.

Sleduet zametit', odnako, chto daleko ne vsegda voznikaet neobhodimost' ispol'zovat' funkcii Send(), Receive() i Reply() v yavnom vide. Biblioteka funkcij yazyka Si v QNX postroena na osnove ispol'zovaniya soobshchenij - v rezul'tate, kogda process ispol'zuet standartnye mehanizmy peredachi dannyh (takie, kak, naprimer, programmnyj kanal - pipe), on kosvennym obrazom ispol'zuet peredachu soobshchenij.


fig: i/messpass.gif


Process A posylaet soobshchenie processu B, kotoryj poluchaet ego, obrabatyvaet i posylaet otvet


Na risunke izobrazhena posledovatel'nost' sobytij, imeyushchih mesto, kogda dva processa, process A i process B, ispol'zuyut funkcii Send(), Receive() i Reply() dlya svyazi drug s drugom:

  1. Process A posylaet soobshchenie processu B, vyzvav funkciyu Send(), kotoraya peredaet sootvetstvuyushchij zapros yadru. V etot moment vremeni process A perehodit v SEND-blokirovannoe sostoyanie i ostaetsya v etom sostoyanii do teh por, poka process B ne vyzovet funkciyu Receive() dlya polucheniya soobshcheniya.
  2. Process B vyzyvaet Receive() i poluchaet soobshchenie ot processa A. Pri etom sostoyanie processa A izmenyaetsya na REPLY-blokirovan. Process B pri vyzove funkcii Receive() v dannom sluchae ne blokiruetsya, t.k. k etomu momentu ego uzhe ozhidalo soobshchenie ot processa A.

    Zamet'te, chto esli by process B vyzval Receive() do togo, kak emu bylo poslano soobshchenie, to on by popal v sostoyanie RECEIVE-blokirovan do polucheniya soobshcheniya. V etom sluchae process-otpravitel' soobshcheniya nemedlenno posle posylki soobshcheniya popal by v sostoyanie REPLY-blokirovan.

  3. Process B vypolnyaet obrabotku poluchennogo ot processa A soobshcheniya i zatem vyzyvaet funkciyu Reply(). Otvetnoe soobshchenie peredaetsya processu A, kotoryj perehodit v sostoyanie gotovnosti k vypolneniyu. Vyzov Reply() ne blokiruet process B, kotoryj takzhe gotov k vypolneniyu. Kakoj iz etih processov budet vypolnyat'sya, zavisit ot ih prioritetov.

Sinhronizaciya processov

Peredacha soobshchenij ne tol'ko pozvolyaet processam obmenivat'sya dannymi, no i predostavlyaet mehanizm sinhronizacii vypolneniya neskol'kih vzaimodejstvuyushchih processov.

Davajte snova rassmotrim privedennyj vyshe risunok. Posle togo kak process A vyzval funkciyu Send(), on ne mozhet prodolzhat' vypolnenie do teh por, poka ne poluchit otvet na poslannoe soobshchenie. |to garantiruet, chto vypolnyaemaya processom B po zaprosu processa A obrabotka dannyh budet zavershena prezhde, chem process A prodolzhit vypolnenie. Bolee togo, posle vyzova processom B zaprosa na poluchenie dannyh Receive(), on ne mozhet prodolzhat' vypolnenie do teh por, poka ne poluchit sleduyushchee soobshchenie.


Note: Bolee podrobno dispetcherizaciya processov v QNX rassmatrivaetsya v razdele "Dispetcherizaciya processov" dalee v etoj glave.

Blokirovannye sostoyaniya

Kogda processu ne razreshaetsya prodolzhat' vypolnenie, t.k. on dolzhen ozhidat' okonchaniya opredelennoj stadii protokola peredachi soobshcheniya, - process nazyvaetsya blokirovannym.

Vozmozhnye blokirovannye sostoyaniya processov privedeny v sleduyushchej tablice:
Esli process vydal: To process:
Zapros Send(), i otpravlennoe im soobshchenie eshche ne polucheno processom-poluchatelem SEND-blokirovan
Zapros Send(), i otpravlennoe im soobshchenie polucheno processom-poluchatelem, no otvet eshche ne vydan REPLY-blokirovan
Zapros Receive(), no eshche ne poluchil soobshchenie RECEIVE-blokirovan


fig: i/states.gif


Izmenenie sostoyaniya processov v tipichnom sluchae peredachi soobshcheniya.



Note: Dlya polucheniya informacii obo vseh vozmozhnyh sostoyaniyah processa smotri glavu "Menedzher processov".

Ispol'zovanie Send(), Receive() i Reply()

Davajte teper' bolee podrobno rassmotrim vyzovy funkcij Send(), Receive() i Reply(). Vospol'zuemsya rassmotrennym vyshe primerom peredachi soobshcheniya ot processa A k processu B.

Funkciya Send()

Predpolozhim, chto process A vydaet zapros na peredachu soobshcheniya processu V. |to vypolnyaetsya posredstvom vyzova funkcii Send():

Send( pid, smsg, rmsg, smsg_len, rmsg_len );

Pri vyzove funkcii Send() ispol'zuyutsya sleduyushchie argumenty:

pid
identifikator processa (process ID), kotoromu prednaznachaetsya soobshchenie (t.e. processa B); etot identifikator ispol'zuetsya dlya obrashcheniya k processu so storony operacionnoj sistemy i drugih processov;
smsg
bufer soobshcheniya (t.e. soobshchenie, podlezhashchee posylke)
rmsg
bufer otveta (budet soderzhat' otvet ot processa B)
smsg_len
dlina posylaemogo soobshcheniya v bajtah
rmsg_len
maksimal'naya dlina otveta, kotoryj mozhet prinyat' process A, v bajtah

Obratite vnimanie, chto budet peredano ne bolee smsg_len bajt i ne bolee chem rmsg_len bajt budet polucheno v kachestve otveta - eto garantiruet, chto ne proizojdet sluchajnogo perepolneniya buferov.

Funkciya Receive()

Vyzvav zapros Receive(), process B mozhet poluchit' soobshchenie, napravlennoe emu processom A:

pid = Receive( 0, msg, msg_len )

Vyzov funkcii Receive() soderzhit sleduyushchie argumenty:

pid
identifikator processa, kotoryj poslal soobshchenie (t.e. process A)
0
(nol') oznachaet, chto process B zhelaet prinyat' soobshchenie ot lyubogo processa
msg
bufer, kuda budet pomeshcheno prinimaemoe soobshchenie
msg_len
maksimal'nyj razmer dannyh, kotorye budut pomeshcheny v bufer priema, v bajtah

Esli znacheniya argumentov smsg_len v vyzove funkcii Send() i msg_len v vyzove funkcii Receive() otlichayutsya, drug ot druga, to naimen'shee iz nih opredelyaet razmer dannyh, kotorye budut peredany.

Funkciya Reply()

Posle uspeshnogo polucheniya soobshcheniya ot processa A, process B dolzhen otvetit' processu A, vyzvav funkciyu Reply():

Reply( pid, reply, reply_len );

Vyzov funkcii Reply() soderzhit sleduyushchie argumenty:

pid
identifikator processa, kotoromu prednaznachaetsya otvet (t.e. process A)
reply
bufer, soderzhashchij otvet
reply_len
dlina dannyh, peredavaemyh v kachestve otveta, v bajtah

Esli znacheniya argumentov reply_len pri vyzove funkcii Reply() i rmsg_len pri vyzove funkcii Send() otlichayutsya drug ot druga, to naimen'shee iz nih opredelyaet razmer peredavaemyh dannyh.

Reply-upravlyaemyj obmen soobshcheniyami

Primer obmena soobshcheniyami, kotoryj my tol'ko chto rassmotreli, illyustriruet naibolee rasprostranennyj sluchaj ispol'zovaniya soobshchenij - sluchaj, kogda dlya processa, vypolnyayushchego funkcii servera, normal'nym yavlyaetsya sostoyanie RECEIVE-blokirovan v ozhidanii kakih-libo zaprosov klienta. |to nazyvaetsya send-upravlyaemyj obmen soobshcheniyami: process-klient iniciiruet dejstvie, posylaya soobshcheniya, otvet servera na soobshchenie zavershaet dejstvie.

Sushchestvuet i drugaya model' obmena soobshcheniyami, ne stol' rasprostranennaya, kak rassmotrennaya vyshe, hotya v nekotoryh situaciyah ona dazhe bolee predpochtitel'na: reply-upravlyaemyj obmen soobshcheniyami, pri kotorom dejstvie iniciiruetsya vyzovom funkcii Reply(). V etom sluchae process-"rabotnik" posylaet serveru soobshchenie, govoryashchee o tom, chto on gotov k rabote. Server ne otvechaet srazu, a "zapominaet", chto rabotnik gotov vypolnit' ego zadanie. V posledstvii server mozhet iniciirovat' dejstvie, otvetiv ozhidayushchemu zadanie rabotniku. Process-rabotnik vypolnit zadanie i zavershit dejstvie, poslav serveru soobshchenie, soderzhashchee rezul'taty svoej raboty.

Dopolnitel'nye svedeniya

Pri razrabotke programm, ispol'zuyushchih peredachu soobshchenij, neobhodimo imet' v vidu sleduyushchee:


fig: i/blocproc.gif


Server poluchil soobshchenie ot klienta A i klienta B (no eshche ne otvetil im). Soobshcheniya ot klientov C, D, E eshche ne polucheny.


Dopolnitel'nye vozmozhnosti

QNX takzhe predostavlyaet sleduyushchie dopolnitel'nye vozmozhnosti po peredache soobshchenij:

Uslovnyj priem soobshchenij

Obychno, kogda process hochet prinyat' soobshchenie, on vyzyvaet funkciyu Receive() dlya ozhidaniya prihoda soobshcheniya. |to obychnyj sposob polucheniya soobshchenij, kotoryj prigoden v bol'shinstve sluchaev.

Odnako vozmozhna situaciya, kogda processu neobhodimo opredelit', imeyutsya li ozhidayushchie priema soobshcheniya, ne popadaya pri etom v sostoyanie RECEIVE-blokirovan v sluchae ih otsutstviya. Naprimer, processu trebuetsya oprashivat' rabotayushchee s vysokoj skorost'yu ustrojstvo, kotoroe ne sposobno generirovat' preryvanie, i v to zhe vremya on dolzhen otvechat' na soobshcheniya ot drugih processov. V etom sluchae process mozhet ispol'zovat' funkciyu Creceive(), kotoraya libo prochitaet ozhidayushchee priema soobshchenie, libo nemedlenno vernet upravlenie processu v sluchae otsutstviya ozhidayushchih priema soobshchenij.


Note: Sleduet po vozmozhnosti izbegat' ispol'zovaniya funkcii Creceive(), t.k. ona pozvolyaet processu nepreryvno vypolnyat'sya s neizmenyayushchimsya urovnem prioriteta.

CHtenie ili zapis' chasti soobshcheniya

Inogda zhelatel'no chitat' ili zapisyvat' soobshcheniya po chastyam s tem, chtoby ispol'zovat' uzhe vydelennyj dlya soobshcheniya bufer vmesto vydeleniya otdel'nogo rabochego bufera.

Naprimer, menedzher vvoda/vyvoda mozhet prinimat' dannye v vide soobshchenij, kotorye sostoyat iz zagolovka fiksirovannoj dliny i sleduyushchih za nim dannyh peremennoj dliny. V zagolovke ukazyvaetsya razmer dannyh (ot 0 do 64 Kbajt). V etom sluchae menedzher vvoda/vyvoda mozhet snachala prinyat' tol'ko zagolovok soobshcheniya, a zatem ispol'zovat' funkciyu Readmsg() dlya chteniya dannyh peremennoj dliny neposredstvenno v sootvetstvuyushchij bufer vyvoda. Esli razmer dannyh prevyshaet razmer bufera, to menedzher mozhet neodnokratno vyzyvat' funkciyu Readmsg() po mere osvobozhdeniya bufera vyvoda. Analogichnym obrazom, funkciya Writemsg() mozhet byt' ispol'zovana dlya poetapnogo kopirovaniya dannyh v vydelennyj dlya otvetnogo soobshcheniya bufer neposredstvenno v tele processa, poslavshego soobshchenie, umen'shaya, takim obrazom, potrebnost' menedzhera vvoda/vyvoda v vydelenii vnutrennih buferov.

Sostavnye soobshcheniya

Do sih por my rassmatrivali soobshcheniya kak nepreryvnuyu posledovatel'nost' bajt. Odnako soobshcheniya chasto sostoyat iz dvuh ili bolee otdel'nyh chastej. Naprimer, soobshchenie mozhet imet' zagolovok fiksirovannoj dliny, za kotorym sleduyut dannye peremennoj dliny. Dlya togo chtoby izbezhat' kopirovaniya chastej takogo soobshcheniya vo vremennye promezhutochnye bufery pri peredache ili prieme, mozhet byt' ispol'zovano sostavnoe soobshchenie, sostoyashchee iz dvuh ili bolee otdel'nyh buferov soobshchenij. Imenno blagodarya etoj vozmozhnosti menedzhery vvoda/vyvoda QNX, takie kak Dev i Fsys, dostigayut svoej vysokoj proizvoditel'nosti.

Sleduyushchie funkcii pozvolyayut obrabatyvat' sostavnye soobshcheniya:


fig: i/multimsg.gif


Sostavnye soobshcheniya mogut byt' opisany s pomoshch'yuqqq¸0 special'noj mx struktury. Mikroyadro ob®edinyaet chasti takogo soobshcheniya v edinyj nepreryvnyj potok dannyh.


Zarezervirovannye kody soobshchenij

QNX nachinaet vse soobshcheniya s 16-ti bitnogo slova, nazyvaemogo kodom soobshcheniya. Zametim, odnako, chto eto ne yavlyaetsya obyazatel'nym dlya vas trebovaniem pri napisanii sobstvennyh programm. QNX ispol'zuet kody soobshchenij v sleduyushchih diapazonah:
Zarezervirovannyj diapazon: Opisanie:
0x0000 - 0x00FF Soobshcheniya Menedzhera processov
0x0100 - 0x01FF Soobshcheniya vvoda/vyvoda (obshchie dlya vseh serverov vvoda/vyvoda)
0x0200 - 0x02FF Soobshcheniya Menedzhera fajlovoj sistemy
0x0300 - 0x03FF Soobshcheniya Menedzhera ustrojstv
0x0400 - 0x04FF Soobshcheniya Menedzhera seti
0x0500 - 0x0FFF Zarezervirovany dlya budushchih sistemnyh processov QNX

IPC posredstvom proksi

Proksi - eto forma neblokiruyushchego soobshcheniya, osobenno podhodyashchego dlya izveshcheniya o nastuplenii sobytiya, kogda posylayushchij process ne nuzhdaetsya v dialoge s poluchatelem. Edinstvennaya funkciya proksi sostoit v posylke fiksirovannogo soobshcheniya opredelennomu processu, kotoryj yavlyaetsya vladel'cem proksi. Podobno soobshcheniyam, proksi mogut byt' ispol'zovany v predelah vsej seti.

Ispol'zuya proksi, process ili obrabotchik preryvaniya mozhet poslat' soobshchenie drugomu processu, ne blokiruyas' i ne ozhidaya otveta.

Vot nekotorye primery ispol'zovaniya proksi:

Dlya sozdaniya proksi ispol'zuetsya funkciya yazyka Si qnx_proxy_attach(). Lyuboj drugoj process ili obrabotchik preryvaniya, kotoromu izvesten identifikator proksi, mozhet vospol'zovat'sya funkciej yazyka Si Trigger() dlya togo, chtoby zastavit' proksi peredat' zaranee zadannoe soobshchenie. Zapros Trigger() obrabatyvaetsya Mikroyadrom.

Proksi mozhet byt' "zapushcheno" neodnokratno - kazhdyj raz pri etom ono posylaet soobshchenie. Proksi mozhet nakaplivat' ochered' dlinoj do 65535 soobshchenij.


fig: i/prxytrig.gif


Process-klient zapuskaet proksi 3 raza, v rezul'tate chego server poluchaet 3 "konservirovannyh" soobshcheniya ot proksi.


IPC posredstvom signalov

Signaly yavlyayutsya tradicionnym sposobom asinhronnoj svyazi, kotoraya ispol'zuetsya v techenie mnogih let v razlichnyh operacionnyh sistemah.

QNX podderzhivaet bol'shoj nabor signalov, sootvetstvuyushchih standartu POSIX, krome togo, signaly, istoricheski prisushchie nekotorym UNIX-sistemam, i ryad signalov, unikal'nyh dlya QNX.

Kak porodit' signal

Schitaetsya, chto signal dostavlen processu togda, kogda vypolnyaetsya opredelennoe v processe dlya dannogo signala dejstvie. Process mozhet posylat' signal samomu sebe.
Esli vy hotite: Ispol'zujte:
Porodit' signal iz komandnoj stroki Utility: kill i slay
Porodit' signal vnutri processa Funkcii Si: kill() i raise()

Poluchenie signalov

Process mozhet prinyat' signal odnim iz treh sposobov, v zavisimosti ot togo, kak v processe opredelena obrabotka signalov:

V promezhutke vremeni mezhdu momentom, kogda signal porozhden, i momentom, kogda on dostavlen, signal nazyvaetsya ozhidayushchim. Dlya processa ozhidayushchimi odnovremenno mogut byt' neskol'ko razlichnyh signalov. Signaly dostavlyayutsya processu, kogda planirovshchik yadra delaet etot process gotovym k vypolneniyu. Process ne dolzhen stroit' nikakih predpolozhenij otnositel'no poryadka, v kotorom budut dostavleny ozhidayushchie signaly.

Perechen' signalov
Signal: Opisanie:
SIGABRT Signal nenormal'nogo zaversheniya, porozhdaetsya funkciej abort().
SIGALRM Signal tajm-auta, porozhdaetsya funkciej alarm().
SIGBUS Ukazyvaet na oshibku kontrolya chetnosti operativnoj pamyati (osobaya dlya QNX interpretaciya). Esli vo vremya vypolneniya obrabotchika dannogo signala proizojdet vtoraya takaya oshibka, to process budet zavershen.
SIGCHLD Zavershenie porozhdennogo processa. Dejstvie po umolchaniyu - ignorirovat' signal.
SIGCONT Esli process v sostoyanii HELD, to prodolzhit' vypolnenie. Dejstvie po umolchaniyu - ignorirovat' signal, esli process ne v sostoyanii HELD.
SIGDEV Generiruetsya, kogda v Menedzhere ustrojstv proishodit vazhnoe i zaproshennoe sobytie.
SIGFPE Oshibochnaya arifmeticheskaya operaciya (celochislennaya ili s plavayushchej zapyatoj), naprimer, delenie na nol' ili operaciya, vyzvavshaya perepolnenie. Esli vo vremya vypolneniya obrabotchika dannogo signala proizojdet vtoraya takaya oshibka, to process budet zavershen.
SIGHUP Gibel' processa, kotoryj byl vedushchim seansa, ili zavisanie upravlyayushchego terminala.
SIGILL Obnaruzhenie nedopustimoj apparatnoj komandy. Esli vo vremya vypolneniya obrabotchika dannogo signala proizojdet vtoraya takaya oshibka, to process budet zavershen.
SIGINT Interaktivnyj signal "vnimanie" (Break)
SIGKILL Signal zaversheniya - dolzhen byt' ispol'zovan tol'ko v ekstrennyh situaciyah. |tot signal ne mozhet byt' "pojman" ili ignorirovan. Server mozhet zashchitit' sebya ot etogo signala posredstvom funkcii yazyka Si qnx_pflags(). Dlya etogo server dolzhen imet' status privilegirovannogo pol'zovatelya.
SIGPIPE Popytka zapisi v programmnyj kanal, kotoryj ne otkryt dlya chteniya.
SIGPWR Perezapusk komp'yutera v rezul'tate nazhatiya Ctrl-Alt-Shift-Del ili vyzova utility shutdown.
SIGQUIT Interaktivnyj signal zaversheniya.
SIGSEGV Obnaruzhenie nedopustimoj ssylki na operativnuyu pamyat'. Esli vo vremya vypolneniya obrabotchika dannogo signala proizojdet vtoraya takaya oshibka, to process budet zavershen.
SIGSTOP