ХАБАРЛАМАЛАР
Бұдан бұрын қарастырылған сигналдар механизмі процестер
арасындағы ақпарат алмасуды қажет етпейтін жағдайларда процесс
аралық өзара әрекеттесуді ұйымдастыруда ыңғайлы. Мысалы, өзара
әрекеттесуші процестер мәтіндік ақпарат алмасқан жағдайда, сигналдар
нашар қолданылады.
Дегенмен, сигналдар мына жағдайда қолданылуы мүмкін, мысалы
әр символ нақты сигналдар тізбегімен кодталады, жіберілімнің басы
және аяғы нақты типтің сигналдарымен белгіленеді. Мұндай тәсілдің
ыңғайлылығы бір символды жіберу үшін сигналдардың үлкен саны
жеткілікті (латын әрпін жібері үшін — символ жіберілімінң басы және
аяғын бейнелейтін төртеу шамасында), ал бұл сигналдар жоғалған
кезде, ақпараттардың жоғалуымен байланысты. Одан басқа, мұндай
алмасу тәсілі процестің екі ақпарат алмасушысы да бір уақытта жұмыс
жасағанда ғана қолданылады.
Процестер арасында ақпарат алмасу үшін (мүмкін, әр түрлі
209
уақыттарда орындалатындар) UNIX-жүйелерінде хабарлама механизмі
бар.
Бұл механизмнің жұмысы, ортақ қолжетімді пошталық жәшікті еске
түсіреді. Адамдар бұл жәшікке конвертке мекен-жай атын жазып,
хаттарын сала алады, ал мекенжайлар ара-тұра пошталық жәшіктің
мазмұнын тексереді, оларды мекенжай аттарымен қондыра отырып,
өзіне арналған хатты алады. Сонымен қатар жәшікке хатты салуда,
тізбектеулі сақталады, егер адамға бірнеше хат келген болса, басында
ол ең бірінші келгендерін оқиды, одан кейін жаңаларына өтеді.
Хаттардың мекенжай бойынша бөлінгенінен басқа, хаттардың әр түрлі
жәшік бойынша бөлінуі мүмкін, мысалы бір жәшік тек екі адамның
сұхбаттасуына арналуы мүмкін.
Хабарлама механизмі осы тәрізді жұмыс жасайды, операциялық
жүйе - хабарламалар кезегі деп аталатын - хабарламалар тізбегі
сақталатын арнайы жадтың саласын көрсетеді, мұнда процестер
пошталық жәшік сияқты, өзінің хабарламаларын сыйдыра алады. Әр
хабарлама, жіберілетін ақпаратты таситын, сандық идентификатор мен
ақпараттар блогынан тұрады. Ақпараттарды кезекке орналастыру және
оларды кезектен алып тастау FIFO (first in — first out) принципі
бойынша жүреді, яғни кезектен ең көне хабарлама алынып тастайды.
Дегенмен тізімдегі әр хабарлама идентификаторға ие, ол кезектегі
барлық хабарламалардың ішіндегі ең көне болуы міндетті емес,
идентификаторы берілген көне хабарламалар алынады (10.6 - сурет ).
Осылайша, операциялық жүйе хабарламалардың сақталуына
кепілдік береді және кезек түсу ретімен олардың өңделуіне мүмкіндік
береді. Дегенмен хабарламалардың өзіне арналған емес, басқа
процеспен кезектен алынуына кепілдік бермейді. Бұл алынатын
хабарламаның идентификаторы кабылдаушы – процесті беруімен
байланысты.
210
10.6-сурет. Хабарламалар кезегінің құрылымы
Хабарламалар кезегі және ондағы хабарламалар, оны пайдаланатын
процестерге тәуелді емес. Осылайша, жөнелтуші процесі хабарламаны
кезекке қояды және өзінің орындалуын тоқтататын жағдайлар болуы
мүмкін. Қабылдаушы-процесс, жөнелтуші-процестің қолжетімсіз
болуына қарамастан, бұл хабарламаны қабылдап алады.
Әр хабарлама кезегі, кезекке хабарлама қоятын және бір-біріне
тәуелсіз кезектен алып тастайтын, бірнеше процеспен қолданылуы
мүмкін. Сонымен қатар процестің әрі өзінің идентификатор жинағын
қолданады. Дегенмен , егер бірнеше процесс бір идентификаторды
қолданатын болса, әртүрлі жіберушілерден келген хабарламалар
араласып кетуі мүмкін.
Бірнеше процестің, бір уақытта кезекке бірдей идентификаторлы екі
хабарламаны сыйғызатын жағдай да болуы мүмкін. Мұнда
хабарламаларды кезекке сыйғызу реті ерікті болады және операциялық
жүйенің ядросының жасалуына байланысты болады.
Бірнеше процестің бір уақытта кезектен, берілген идентификаторлы
соңғы хабарламаны алуына тырысатын жағдайларда болуы мүмкін.
Хабарламаны процеске беру реті анықталмаған және ОЖ ядросының
жасалуына байланысты.
Әдетте мұндай жағдайлар өзімен күрделі мәселелерді ұсынбайды,
себебі бір кезекте ақпараттар алмасатын процестер жұбын байқап
жобаласа, байланыспайтын көптеген идентификаторларды қолданады.
Құрылған кезек, ОЖ процесінің құрылуымен және осыған құқығы бар
211
процеспен өшірілу сәтіне дейін болады немесе ОЖ жұмысының
аяқталуына дейін. Кезек өмірінің уақыты, оны құрған процесс өмірі
уақытынан ұзақ болуы мүмкін.
Хабарламалар кезегінің параметрі, kemel.msgmni, kemel.msgmax
және kemel.msgmnb параметрлерімен анықталады. Параметр kernel.
msgmni хабарламалар кезегінде идентификатордың максималды
санын, kemel.msgmax — байтта хабарлама максималды өлшемін
анықтайды, ал kemel.msgmnb байтта кезектің максималды өлшемін
береді. Бұл параметрлерді /proc файлдық жүйеде орналасқан
файлдарды пайдаланып, өзгертуге болады. Ол үшін мына
командаларды қолдануға болады:
echo 2048 > /proc/sys/kernel/msgmax
echo 4096 > /proc/sys/kernel/msgmni
Бұл өзгерістерді, оның қайта жүктелімінен кейін де, жүйеде сақтау
үшін бұл параметрлердің мәндерін қолмен /etc/sysctl.conf файлына
енгізу керек. Бұл файлды «kemel.msgmnb=8192» түрінде жолға түсіру
керек немесе sysctl -w
= командасын қолдану керек,
мысалы sysctl -w kernel.msgmnb=8192.
Хабарламалар кезегі параметріндегі ағымдағы мәндері туралы
ақпараттарды, ipcs –lq командасының көмегімен алуға болады:
$ ipcs -lq
Messages: Limits ------------
max queues system wide = 496
// MSGMNI
max size of message (bytes) = 8192
// MSGMAX
default max size of queue (bytes) = 16384
// MSGMNB
Қазіргі сәтте пайда болған кезектерді қарау үшін жүйеде ipcs
командасы қолданылады. Параметрсіз іске асатын, командалар жалпы
жадының барлық пайда болған бөліктерін, семафорды және кезектерді
шығарады. Пайда болған кезектерді қарау үшін командалық жолдан -q
параметрімен ipcs іске асыру қажет:
$ ipcs -q
Message Queues ------------
key
msqid owner perms used-bytes
messages
0x000001f4
0
admin 644
20
1
0x1cda78da
486
root
600
18920
211
|