Меѓупроцесни комуникации

уреди

Размена на податоци помеѓу две или повеќе одделни,независни процеси или нишки се нарекуваат Интерпроцесни комуникации. Меѓупроцесната комуникација во програмирањето е користи за размена на пораки, делење на ресурсите и синхронизација на различните процеси внатре во еден компјутер.Под овој термин најчесто се подразбираат семафори,редови за пораки е делење на меморијата кои денес постојат на поголемиот број од оперативните системи. Типично,апликациите користат ИПК категоризирана како клиент или сервер.Клиент е апликација или процес кој бара услуга од други апликации или процеси.А серверот е апликација или процес кој одговара т.е реагира на барањето на клиентот.Многу апликации делуваат и како двете,и како клиент и како сервер во зависност од ситуацијата. Кога комуникацијата е од еден процес на друг тогаш IPC се вели дека е unicast пр.Socket комуникација. Кога комуникацијата се извршува од еден процес на цела група на процеси тогаш се вели дека е multicast комуникација. Виндоус оперативниот систем обезбедува механизми за олеснување на комуникациите и споделубањето на податоци меѓу апликациите.Колективно активностите овозможени од овие механизми се нарекуваат Интерпроцесни комуникации. Постојат два фундаментално различни пристапи за ИПК:

  • процеси кои се сместени во еден ист компјутер.
  • процеси кои се сместени на различни компјутери.

Првиот начин е полесен за имплементација бидејќи процесите може да делат меморија или на корисничкиот простор или на системскиот простор.Ова е подеднакво точно за uniprocessors и за мultiprocessors. Во вториот случај компјутерите не делат виртуелна меморија,тие се поврзани преки И/О уредите (на пример сериски комуникација или Ethernet).Затоа процесите кои се смесени на различни компјутери не можат да користат меморија како средство за комуникација. IPC на еден компјутерски систем вклучува четири општи барања:

  • делена меморија
  • пораки
  • цевки
  • вдлабнувања
  • Делена меморија (shared memory)

Два или повеќе процеси може да мапираат сервер на нивниот виртуелен простор во идентичен сегмент на физичката меморија. Деливата меморија е најефикасен начин на IPC , но тоа може да бара синхронизација. UNIX System V Shared Memory System calls: sid = shmget(key, size, flags); // креирање на shared memory segment (SMS) int sid ; // Shared memory segment ID long key; //Клуч за идендификација // Identification key (instead of name) int size; // Големина на сегмент во битови (0 for existing SMS) int flags; // Access permission bits // (can be OR-ed with IPC_CREAT) p = shmat(sid, addr, flags); // Attach SMS (get the SMS address) char *p; //Моментална SMS адреса void addr; // (Recommended)desired address ( 0 for any) sts = shmdt(p); // Detach (unmap) SMS (doesn't destroy the SMS) sts = shmctl(sid,cmd,sbuf); // Control SMS int cmd; // Command, IPC_RMID for destruction

Win32 Shared Memory Во Windows 95 и Windows NT делената меморија се имплементира преку file mapping fh = CreateFile("fff",...); // Create a file "fff" HANDLE fh; // File handle // Create file-mapping object "xxx" mh = CreateFileMapping(fh,flags,size,"xxx"); HANDLE mh; // Handle of the file-mapping object int flags; // Access permission bits int size; // Size of the file-mapping object // Map view of file into user space p = MapViewOfFile(mh,flags,size); char *p; // Адреса на mapped file во user просторот. Ако file mapping се користи само за имплементирање на делената меморија, не е неопходно да се здружат физичката датотека со делената меморија. Ова може да се постигне со посебни справи (fh=0xFFFFFF) кои се користат наместо рачката на постоечкиот фајл. Друг начин за споделување на меморија во Win95/NT/2000 е преку глобални променливи на dynamic link libraries. Ова е помалку ефикасен начин, бидејќи пристапот до делива меморија се постигнува преку функциски повици.

Пораки

уреди

Податочната структура (пораката m) е копирана од просторот на испраќачот во message buffer во системскиот простор, потоа се копира повторно од баферот во системскиот простор во структурата на процесот на испраќачкиот процес. Со цел да се направат пораки кои работат паралелно со граничниот процес (process boundary), порачните бафери треба да бидат именувани: секој процес кој креира message buffer име (кернелот ќе креира нов message object и ќе се врати на ракување, или само ќе се врати на ракување ако message buffer-от е создаден од друг процес).Ракувањето кое се враќа од страна на кернелот е локално са секој процес. Трансферот на пораки е нормално синхронизиран, примачот процес на пораки е блокиран ако message buffer е празен и испраќачкиот процес на пораки е блокиран ако message buffer-от е полн.Обично ОС ја подржува неблокирачката акција. Пораките можат да бидат или од фиксна или од променлива големина.Во вториот случај баферот е организиран како ред од поглавја од пораки,додека просторот за тогашната порака е динамички доделен.Пораките се помалку ефективни од делената меморија (бараат складирање и синхронизација) но некогаш се посоодветни во built-in синхронизација. UNIX System V Messages Пораките оригинално се имплементираат во UNIX System V како дополнителни средства за IPC. ( Windows 95/NT користи имиња на цевки кои се многу помоќни од System V пораките).

Цевки

уреди

Цевките оригинално се користат во UNIX и се направени дури и помоќни во Windows 95/NT/2000.Цевките се спроведуваат во file системот.Тие се во основа фајлови со само два file offsets: еден за читање и еден за пишување.Пишување на цевка и читање од цевка е строго во ФИФО начинот.(Затоа цевките исто така се викаат и фифови). За ефикасност цевките се во јадрото на датотеката (фајлот), односно тие опстојуваат во меморијата наместо во дискот,како и секоја друга глобална структура на податоци.Затоа цевките мора да бидат ограничени во големината односно бројот на блокови на цевката мора да биде лимитиран.(Во UNIX ограничување е тоа дека цевките користат само директни блокови). Откако цевките ќе имаат ограничена големина и дисциплина при ФИФО влезот,читањето и пишувањето процеси е синронизирано на сличен начин како и кај message buffer-oт.Пристапните функции кај цевките се исти као и кај фајловите: WriteFile() и ReadFile(). Постојат два вида на цевки на цевки: anonymous (неименувани) и именувани цевки. Суштинската разлика помеѓу обичните фајлови и цевките е тоа што фајловите може да имаат многу фајл offsets како што се отворените фајлови, додека цевките имаат само два фалј offsets без разлика на бројот на отворените фајлови.Затоа фајл offsets (неутрализираните фајлови) се преселуваат од фајл табелата во фајл заглавјето (header) Последично е дека фајл табелата не е неопходна, но таа се чува за да го направи пристапот до фајлот во согласност со сите типови на фајлови (датотеки).

Анонимни цевки

уреди

Анонимните цевки немаат имиња, затоа тие може да се употребуваат само меѓу поврзани процеси кои може да ги наследат фајл дескрипторите. Анонимните цевки типично се користат за две програми: стандардниот излез од една програма е пренасочен на цевката за влез (рачката за пишување), додека стандардниот влез од втората програма е пренасочен на цевката за излез (рачката за читање).Цевката е создадена од страна на родител (обично најаавната школка), и цевките рачки се пренесуваат на децата преку механизмот на наследство. Анонимните цевки не можат да се користат преку мрежата. Исто така, анонимните цевки се еднонасочни- за да комуницираат два поврзани процеси во двете насоки, две анонимни цевки мора да се креираат. Еве пример од Win32 како функционираат анонимните цевки употребени за program piping: //******************************************************************* // Oваа програма имплементира piping oд програмите p1.exe и p2.exe // преку анонимна цевка. Програмот креира два процеси-деца. // (кои егзекутираат слики p1.exe и p2.exe) и цевка, потоа преминуваат на // pipe рачките кај децата. // // The program is invoked as: pipe p1 p2 (нема аргументи на command line) //*******************************************************************

  1. include <windows.h>
  2. include <iostream.h>

int main(int argc, char *argv[]) { // Креирање анонимна цевка SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = 0; sa.bInheritHandle = TRUE; // Цевките се наследни (default е FALSE) HANDLE rh,wh; // Читање и пишување на рачките на цевката. if(!CreatePipe(&rh,&wh,&sa,0)) { cout << "Не може да се креира цевка " << GetLastError()<< endl; return (1); } //Креирање на првиот процес-дете p1 PROCESS_INFORMATION pi1; STARTUPINFO si1; GetStartupInfo(&si1); // Get default startup structure si1.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si1.hStdOutput = wh; // Std output oд p1 е влез во цевката si1.dwFlags = STARTF_USESTDHANDLES; CreateProcess( argv[1], // Името на p1's сликата (без ".exe." 0,0,0, TRUE, // Секоја отворена рачка-наследник oд родител ќе биде наследена на детето

0,0,0, &si1,&pi1); CloseHandle(wh); // Цевките-рачки не се повеќе потребни //Креирање на вториот процес-дете p2 PROCESS_INFORMATION pi2; STARTUPINFO si2; GetStartupInfo(&si2); // Get default startup structure si2.hStdInput = rh; // Std влез на p2 е излез на цевката si2.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); si2.dwFlags = STARTF_USESTDHANDLES; CreateProcess( 0,argv[2], // Име на p1 сликата (без ".exe." 0,0, TRUE, // Секоја отворена рачка-наследник oд родител ќе биде наследена на детето 0,0,0, &si2,&pi2); WaitForSingleObject(pi1.hProcess,INFINITE); CloseHandle(pi1.hProcess); WaitForSingleObject(pi2.hProcess,INFINITE); CloseHandle(pi2.hProcess); CloseHandle(rh); return(0); }

Именувани цевки

уреди

Главните карактеристики на Win32 именуваните цевки: • Може да се користат за комуницирање меѓу неповрзани процеси • Процесите може да бидат конектирани на различни машини преку мрежа • Тие се ориентирани преку пораки т.е може да се користат за праќање и примање на пораки не само на бајтови • Тие се full duplex-процесот може да чита и пишува на самиот крај на цевката • Именуваните цевки може да се инстанцираат, т.е неколку независни инстанци од иста цевка може да бидат создадени. (Тоа значи дека серверот може да комуницира независно со неколку клиенти). Именуваните цевки исто така постојат и во UNIX (byte streams), со некои ограничувања: UNIX цевките се полу дуплексни; UNIX цевките се ограничени на една машина; UNIX се бајт ориентирани. Спроведувањето на именуваните цевки користат директориум за влез во секоја цевка.Ова ги прави цевките видливи низ процесот и границите на машината.

Вдлабнувања

уреди

Window именуваните цевки обезбедуваат синхронизирана комуникација помеѓу неповрзани процеси кои може да егзекутираат на различни машини поврзани преку мрежа. Сепак машините мора да имаат исти оперативни системи. Со цел да се инсталираат (run) апликации преку мрежа на хетерогени платформи, постојат поопшти, механизми за подржувачи на мрежа кои се викаат Беркли (Berkeley) вдлабнувања и резервирани процедурални повици (Remote Procedure Calls-RPC). Ќе подискутираме само за вдлабнувањата (sockets) бидејќи тие се поопшти, поефикасни и полесни за поставување од RPC-то. Вдлабнувањата се имплементираат во слујот на системскиот софтвер наречен вдлабнувачки слој, кој што седи на врвот на слојот на протоколот. Протоколскиот слој заедно со мрежниот драјвер (софтвер) и мрежниот контролер (хардвер) обезбедуваат вмрежување. Вдлабнувањата обично се користат во сервер/клиент комуникацијата: серверот креира вдлабнување и се поврзува за комуникациската порта и чека барање за конекција од клиентот. Клиентот исто така создава вдлабнување од ист тип, тогаш бара конекција од позната порта на позната машина. Еднаш кога серверот го прифаќа барањето за конекција на клиентот, ќе креира ново вдлабнување и услов за друга порта, што ќе биде користена за понатамошни комуникации со клиентот. Еднаш кога ова ќе се направи, податоците може да течат помеѓу вдлабнувањето на клиентот и второто вдлабнување на серверот. Првото вдлабнување на серверот останува отворено и чека барања од други клиенти. Чекањето за нови барања и комуницирања меѓу клиентите со основани врски е нормално направено преку различни нишки.