IPC - Protseslararo aloqa
IPC nima? IPC bu bir nechta protsess o'rtasidagi bir-biri bilan ma'lumot almashinuv texnikasidir. Soddalashtirib aytganda, ishlab turgan A dastur qandaydir ma'lumotlarni B dasturga jo'natishi yoki qabul qilishidir. Odatda bu uchun OS larda bir nechta muqobil yechimlar mavjud bo'ladi. Bulardan asosiylari :
- Quvurlar (pipe)
- Baham ko'riladigan xotira bo'laklari (shared memory)
- Soketlar
- Fayllar
- RPC
- WM_COPYDATA (Windows da faqat oynali protsesslar uchun)
Quvurlar - IPC ning eng bazaviy usullaridan biridir. Nomidan ham ko'rinib turganidek, ishlash prinsipi huddi quvur (truba)ga o'xshaydi. Maxsus funksiya orqali bir A protsess quvur yaratadi va yaratilgan quvurning Yozish ko'rsatkichi orqali ma'lumotlarni unga jo'natadi. OS yadrosi esa yozilgan ma'lumotlarni protsess xotirasidan o'zining himoyalangan xotirasidagi maxsus bufferga yozib qo'yadi (bunga FIFO buffer sifatida qarash mumkin). Ikkinchi B protsess esa ushbu quvurning nomi orqali ochib, O'qish ko'rsatkichi orqali ma'lumotlarni o'qishi mumkin bo'ladi. Va kerakli ma'lumot ushbu B protsessning xotirasiga ko'chirib o'tkaziladi.
Asosan ikki turdagi quvurlar mavjud:
- Nomsiz quvurlar (Anonymous pipes) - qarindosh, ya'ni bir protsessdan tarqagan yoki ona-bola protsesslar o'rtasida ma'lumot almashinuvi uchun ishlatiladi. Nomi bo'lmaydi va shu sababli uning O'qish/Yozish ko'rsatkichini (handle) to'g'ridan-to'g'ri qarindosh protsesslarga o'tkazilib shu ko'rsatkichlar orqali ma'lumot o'qish/jo'natish mumkin bo'ladi. Yo'nalishi bir taraflama (simplex), bir taraf yo faqat o'qishi yoki faqat yozishi mumkin xolos.
- Nomlangan quvurlar (Named pipes) - ihtiyoriy protsesslar o'rtasida ma'lumot almashish uchun. Hatto protsesslar turli kompyuterlarda bo'lishi ham mumkin. Quvur yaratishda takrorlanmas nom berib yaratiladi, masalan \\.\pipe\Quvurginam yoki \\ServerNomi\pipe\Quvurginam (tarmoq orqali ishlashi uchun). Yo'nalishi ikkitaraflama (duplex). Quvurning ikkala tarafidagilar ham o'qishi, ham yozishi mumkin.
Baham ko'riladigan xotira bo'laklari - eng tez ma'lumot almashish usuli. Bunda bir nechta protsesslar barchalari uchun umumiy bo'lgan xotira qismlariga ma'lumot yozish/o'qish orqali ma'lumot almashiladi. A protsess shunday baham ko'rilgan xotiraga nimadir yozsa, B protsess huddi o'sha xotira manzilidan yozilgan ma'lumotni to'g'ridan-to'g'ri o'qishi mumkin (quvurlardagi kabi uni yadrodagi himoyalanga maxsus bufferga ko'chirib o'tkazish yo'qligi sababli tezlik ancha yuqori bo'ladi). Busiz esa odatda OS larda har bir protses uchun alohida virtual xotira ajratilib, protses shu virtual hududda ishlaydi va boshqa protsessning xotira hududiga ruxsati bo'lmaydi. Bir protses ma'lum nomdagi va ma'lum uzunlikdagi baham ko'riladigan hotira bo'lagini hosil qilsa, boshqa protseslar yuqoridagi nomni ko'rsatgan holda huddi o'sha xotira bo'lagiga ruxsat olib, unga yozishi/o'qishi mumkin bo'ladi. Minus tarafi sinxronizatsiya muammosini o'zingiz hal qilishingiz kerak, ya'niki bir vaqtda bir nechta protses bir manzildagi qiymatni o'zgartirganida uni tartibga solinmasa natija ko'tilmagan holatlarga olib kelishi mumkin. Va yana bir kamchiligi faqat bitta kompyuterdagi protseslar o'rtasida ishlaydi xolos.
Soketlar - bu haqda gapirishga hojat ham bo'lmasa kerak. Afzalligi lokal soket orqali bir kompyuterdagi protsesslar o'rtasida ma'lumot almashish mumkin va aniq bir OS ga bog'lanib qolgan usul emas. Va qolaversa UDS (UNIX Domain Sockets) soketlar orqali lokal kompyuterda OS ning tarmoq stekini "bezovta" qilmasdan ham ishlashi mumkin. UDS siz esa lokaldagi ikki protses o'rtasida ma'lumot jo'natganda ham ma'lumot tarmoq steki orqali keladi. UDS soketlar Windows 10 dan boshlab buyerga ham qo'shilgan. Bunday usulda yaratilgan soket IP+Port emas, fayl nomiga biriktiriladi.
Fayllar - fayllar orqali ma'lumot almashish eng eski va klassik usullardan biri. Prinsip oddiy - bir protses uzatiladigan ma'lumotlarni qandaydir fayl(lar)ga yozadi. Ikkinchi protses esa shu fayl(lar)dan kerakli ma'lumotlarni o'qiydi. Bunda fayl o'zgarishlari (nom, sana, razmer, boshqa attributlar) ni hisobga olgan holda jarayonni muvofiqlashtirish mumkin. Qolaversa OS larda fayldagi o'zgarishlarni bildiruvchi turli mexanizmlar ham mavjud.
RPC - IPC ning yana bir bo'lagi bo'lib, boshqa kompyuterdagi (albatta lokaldagini ham) protseduralarni chaqirish imkonini beradi. Yuqoridagi usullardan farqi biroz murakkabroq. Bunda chaqiriladigan protseduralar ta'rifi (nomi, attribut va parametrlari) oldindan tayyorlanib, keyin server tarafda protseduraning o'zi yaratiladi. Klient taraf esa serverdagi ushbu protsedurani kerakli parametrlarni uzatgan holda ishga tushirishi mumkin. O'rtada kim qaysi funksiyani, qanday parametrlar bilan chaqirayotgani serializatsiya qilinib, tarmoq orqali uzatiladi. Server taraf esa kelgan ma'lumotlarni deserializatsiya qilib kerakli protsedurani ishlatadi va natijani yana serializatsiya qilib klientga qaytaradi.
Tarmoq orqali yoki lokal ishlaganda ham ko'plab dasturlarda RPC mexanizmni faol ishlatiladi. Oddiy misol, tarmoqdagi kompyuterga kirib undagi faylni ochsangiz ham faylni ochish va o'qish buyruqlari SMB ichidagi RPC lar orqali amalga oshiriladi. Chunki fayl buyruqlari sizning kompyuteringizda emas, remote kompyuterda chaqirilishi kerak.
WM_COPYDATA - Agar siz Windows tizimida bo'lsangiz va ikkita protsesda oynalar mavjud bo'lsa unda ular o'rtasidagi ma'lumotni maxsus xabar orqali ham jo'natish mumkin. Bilamiz Windows da oynalar xabarlar orqali boshqariladi. Foydalanuvchi yoki OS tarafidan bo'layotgan oynaga nisbatan har qanday harakat xabarlar navbatiga yoziladi va shu orqali dastur nimalar yuz berayotganini bilib unga yarasha harakat qilishi mumkin. Masalan, siz dasturingiz oynasini o'lchamini sichqoncha yordamida o'zgartirsangiz, OS aynan shu oynangizga WM_SIZE, WM_SIZING kabi xabarlarni jo'natishi mumkin. Shundan siz oynangiz o'lchamini o'zgartirilayotganini bilib kerakli amallarni bajarishingiz mumkin. WM_COPYDATA ham ana shunday maxsus xabarlardan bo'lib, bunda bir protses ikkinchi protses ichidagi ma'lum oyna ko'rsatkichini aniqlab, so'ng o'sha oynaga WM_COPYDATA xabarini jo'natishi mumkin. Ya'ni siz oldin qaysi oynaga jo'natishni (2-protses oynasi) aniqlab (buni oynalarni izlash funksiyasi orqali topib olish mumkin) unga WM_COPYDATA xabarini jo'natasiz. Va albatta WM_COPYDATA ning parametrlarida almashinadigan ma'lumotni ham qo'shib jo'natasiz. OS esa ushbu jo'natayotgan xabaringizni kerneldagi maxsus xotiraga ko'chirib olib, keyin qabul qiluvchi oynaning xabarlar navbatiga WM_COPYDATA jo'natadi. Qabul qiluvchi oyna shunday xabar kelganini sezib uning parametridan nima ma'lumot kelganini o'qib olishi mumkin. Ikki protses xotira hududlari turlicha va bir-biriga ruxsati yo'qligidan, o'rtada OS sizga ma'lumotlarni o'z xotirasiga olib so'ng ikkinchi protses xotirasiga yetkazib beradi.
Yuqoridagi usullardan boshqa DDE (eskirgan), COM obyektlar kabi boshqa ma'lumot almashish usullari ham mavjud. Ular ham faqat Windows tizimi bo'lgani uchun universal emas.