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.) |
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:
|ta glava ohvatyvaet sleduyushchie temy:
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:
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.
Mikroyadro sistemy QNX koordiniruet rabotu sistemnyh menedzherov.
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.
Vse uslugi operacionnoj sistemy, za isklyucheniem teh, kotorye vypolnyayutsya yadrom, v QNX predostavlyayutsya cherez standartnye processy. Tipichnaya konfiguraciya QNX imeet sleduyushchie sistemnye 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 - 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:
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.
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.
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.
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.
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.
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.
|ta glava ohvatyvaet sleduyushchie temy:
Mikroyadro QNX otvechaet za vypolnenie sleduyushchih funkcij:
Vnutri mikroyadra QNX.
Mikroyadro QNX podderzhivaet tri vazhnejshie formy svyazi mezhdu processami: soobshcheniya, proksi i signaly.
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.
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:
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.
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.
Bolee podrobno dispetcherizaciya processov v QNX rassmatrivaetsya v razdele "Dispetcherizaciya processov" dalee v etoj glave. |
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 |
Izmenenie sostoyaniya processov v tipichnom sluchae peredachi soobshcheniya.
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.
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:
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.
Vyzvav zapros Receive(), process B mozhet poluchit' soobshchenie, napravlennoe emu processom A:
pid = Receive( 0, msg, msg_len )
Vyzov funkcii Receive() soderzhit sleduyushchie argumenty:
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.
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:
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.
Pri razrabotke programm, ispol'zuyushchih peredachu soobshchenij, neobhodimo imet' v vidu sleduyushchee:
Nesmotrya na takuyu kazhushchuyusya prostotu, vyzov funkcii Send() delaet gorazdo bol'she, chem prostoj vyzov bibliotechnoj podprogrammy. Funkciya Send() mozhet prozrachno dlya vyzyvayushchej programmy peredat' zapros na drugoj uzel seti, gde i budet v dejstvitel'nosti vypolnyat'sya obsluzhivayushchij zapros kod. Pri etom takzhe mozhet byt' zadejstvovana parallel'naya obrabotka dannyh bez izderzhek na sozdanie novogo processa. Process-server mozhet srazu, kak tol'ko stanet vozmozhnym, vyzvat' funkciyu Reply(), pozvolyaya tem samym zaprashivavshemu processu vozobnovit' vypolnenie i, v to zhe vremya, prodolzhit' vypolnenie samomu.
Server poluchil soobshchenie ot klienta A i klienta B (no eshche ne otvetil im). Soobshcheniya ot klientov C, D, E eshche ne polucheny.
QNX takzhe predostavlyaet sleduyushchie dopolnitel'nye vozmozhnosti po peredache 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.
Sleduet po vozmozhnosti izbegat' ispol'zovaniya funkcii Creceive(), t.k. ona pozvolyaet processu nepreryvno vypolnyat'sya s neizmenyayushchimsya urovnem prioriteta. |
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.
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:
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 |
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.
Process-klient zapuskaet proksi 3 raza, v rezul'tate chego server poluchaet 3 "konservirovannyh" soobshcheniya ot proksi.
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.
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() |
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.
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 |