Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avDavid Bengtsson
1
Jonny Karlsson 29.11.2005 PROCESSPROGRAMMERING Föreläsning 12 (29.11.2005) Innehåll: -Datakanaler och datakanalpar -Kommunikation på samma dator med datakanaler -Exekveringstrådar
2
Jonny Karlsson 29.11.2005 Datakanaler Är idag den vanligast använda tekniken för datakommunikation Kan användas för kommunikation mellan processer på samma dator. Kan användas för för kommunikation mellan processer på olika datorer som är anslutna till ett nätverk. Stöds praktiskt taget av alla nya UNIX system (LINUX, SOLARIS, IRIX) Tekniken baserar sig på transportering dataströmmar via uttag.
3
Jonny Karlsson 29.11.2005 Datakanaler
4
Datakanaler Då två processer kommunicerar med varandra via datakanaler fungerar den ena processen som server och den andra som klient. Båda processerna bör skapa ett uttag till datakanelen med systemanropet socket() Servern bör koppla in sin kommunikationadress med systemanropet bind() Servern skapar en kommunikationskö till datakanalen med systemanropet listen() Servern inväntar en uppkoppling av en klient med systemanropet accept() Klienten kopplar sitt uttag till serverns adress med systemanropet connect(). Klienten kan utföra connect() först efter att servern utfört accept(). Efter detta kan processerna kommunicera via en uttagsdeskriptor med systemanropen t.ex. med systemanropen read() och write().
5
Jonny Karlsson 29.11.2005 Att skapa ett uttag #include int socket(int format, int typ, int protokoll); formatSymbolikst heltalsvärde som betecknar uttagets s.k. addressfamilj: AF_UNSPECOspecificerad AF_UNIXLokal kommunikation på samma UNIX-dator AF_INETKommunikation över ett TCP/IP nät typSymboliskt heltalsvärde som definierar datakommunikationens interna struktur: SOCK_STREAMLikadan struktur som vid filhantering. (ÖVRIGA)Se man fil. protokollSymboliskt heltalsvärde som betecknar uttagets s.k. protokollfamilj: 0UNIX väljer protokollet PF_UNSPECOspecificerad PF_UNIXSamma UNIX-dator PF_INETTCP/IP-nät
6
Jonny Karlsson 29.11.2005 Att skapa ett uttag OBS! Synkroniserade par av read() och write() förutsätter typ=SOCK_STREAM RETURNERAREn uttagsdeskriptor (heltal > 0) -1 vid misslyckande
7
Jonny Karlsson 29.11.2005 Inkoppling av serverns kommunikationsadress (utförs av serverprocessen) #include bind(int uttagsdeskr, struct sockaddr adress, int längd); uttagsdeskrUttagsdeskriptorn till datakanalen som socket() returnerade adressPekare på en post innehållande serverprocessens adressinformation längdStorleken/längden (i byte) hos den post som adress pekar på RETURNERAR0 vid framgång -1 vid misslyckande
8
Jonny Karlsson 29.11.2005 Inställning av kommunikationskön (utförs av serverprocessen) #include listen(int uttagsdeskr, int kölängd); uttagsdeskrUttagsdeskriptorn till datakanalen som socket() returnerade kölängdMaximala antalet platser i kommunikationskön (bör vara > 0)
9
Jonny Karlsson 29.11.2005 Väntan på en uppkoppling (utförs av serverprocessen) #include int accept(int uttagsdeskr, struct sockaddr &adress, int &längd); uttagsdeskr uttagsdeskrUttagsdeskriptorn till datakanalen som socket() returnerade adressPekare på en post till vilken klientens adressinformation kopieras längdAdressen till en heltalsvariabel innehållande storleken på den post som adress pekar på (antal byte, heltalsvariabeln skall initialiseras till detta värde) RETURNERAREtt datakanaldeskriptorvärde vid framgång -1 vid misslyckande
10
Jonny Karlsson 29.11.2005 Uppkoppling till en serverprocess (utförs av klientprocessen) #include connect(int uttagsdeskr, struct sockaddr adress, int längd); uttagsdeskrUttagsdeskriptorn till datakanalen som socket() returnerade adressAdresspekare på en post som innehåller serverprocessens adressinformation längdStorkilek (i byte) på den post som adress pekar på
11
Jonny Karlsson 29.11.2005 Stängning av kommunikation (utförs både av server- och klientprocessen) #include int shutdown(int uttagsdeskr, int mode); uttagsdeskrUttagsdeskriptorn till datakanalen som socket() returnerade mode0 = inkommande kommunikation avstängs 1 = utgående kommunikation avstängs 2 = all kommunikationavstängs RETURNERAR0 vid lyckat anrop -1 vid misslyckande
12
Jonny Karlsson 29.11.2005 Avbrytning av förbindelse till inkopplad datakanal (utförs både av server- och klientprocessen) close(uttagsdeskriptor);
13
Jonny Karlsson 29.11.2005 Kommunikation på samma dator Adressinfor sparas i en post av typen struct sockaddr: #include #include struct sockaddr { u_short sa_family;//adressfamilj char sa_data[14];//teckentabell för namn }; i sa_family sparas samma värde som gavs som argument till socket() d.v.s. i detta fall AF_UNIX eftersom kommunikationen skall ske lokalt. I sa_data sparas namnet på ett datakanalsobjekt ex. /tmp/sockname Namnet på ett datakanal-objekt skall vara ett nytt datakan-objekt i angiven lokal katalog (jämför namngivna rörledningar)
14
Jonny Karlsson 29.11.2005 Kommunikation på samma dator Serverprocess int sd,ns,len; struct sockaddr serv,cli; len=sizeof(cli); /* initialisering */ sd=socket(AF_UNIX,SOCK_STREAM,0); serv.sa_family=AF_UNIX; unlink(”/tmp/sockname”); /* radering */ strcpy(serv.sa_data,”/tmp/sockname”); bind(sd, &serv,sizeof(serv)); listen(sd,3); while(1) { ns=accept(sd,&cli,&len); if(!fork()) { close(sd); /* kommunikation via ns */ shutdown(ns,2); close(ns); exit(0); } close(ns);
15
Jonny Karlsson 29.11.2005 Kommunikation på samma dator Klientprocess int sd; struct sockaddr serv; sd=socket(AF_UNIX,SOCK_STREAM,0); serv.sa_family=AF_UNIX; strcpy(ser.sa_data,”/tmp/sockname”); connect(sd,&serv,sizeof(serv)); ----------------------------- /* kommunikation via sd */ ------------------------------ shutdown(sd,2); close(sd); För mer detaljerad information om datakanaler, se föreläsningskompendiet sid 31-35
16
Jonny Karlsson 29.11.2005 Datakanalpar Kan enkelt skapas med följande systemanrop: int pd[2]; int socketpair(AF_UNIX, SOCK_STREAM, 0 pd); Detta resulterar i två deskriptorer i pd[] tabellen. Dessa deskriptorer kan sedan användas på samma sätt som vid rörledningar som skapats med pipe() anropet.
17
Jonny Karlsson 29.11.2005 Exekveringstrådar Exekveringstrådar (POSIX-THREADS) är en lättviktsvariant av processer. Är egentilgen inga processer utan varja tråd hör till en process Alla trådar exekveras parallellt. Skillnad mellan trådar och processer: En process består av en programdel, en datadel och en mängd tillgängliga resurser (öppna deskriptorer, reserverat minne o.s.v.). En tråd består av en ”uppgift” (är oftast en funktion som utför trådens arbete) och delar på samma data och resurser som andra trådar. P.g.a. att trådarna delar på gemensamma resurser och att de inte kör ett helt program är de resurssnåla, både CPU-mässigt och minnesmässigt. Tiden att skapa en ny tråd är obetydlig, medan en processklyvning kan ta en viss tid. (Processklyvning kopierar ju all data och programkod till den nya processen)
18
Jonny Karlsson 29.11.2005 Att skapa en ny tråd #include #include pthread_create(&a_thread, a_thread_attribute, (void *) &thread_function, (void *) pthread_create(&a_thread, a_thread_attribute, (void *) &thread_function, (void *) &some_argument) &some_argument) a_threadEn pekare av typen pthread_t som pekar på en variabel där trådens ID sparas a_thread_attributeExtra argument, oftast används NULL thread_functionEn pekare på den funktion som skall utföra trådens arbete some_argumentEn eventuell parameter till trådens funktion
19
Jonny Karlsson 29.11.2005 Att fördröja en tråd Funktionen sleep() kan ej användas eftersom denna funktion fördröjer en hel process genom att försätta processen i pause() läge. Eftersom alla trådar är en del av samma process betyder det att samtliga trådar komer att fördöjas. Det rätta sättet att fördröja enast en tråd är följande: struct timespec delay; delay.tv_sec = 2; delay.tv_nsec = 0; pthread_delay_np(&delay);
20
Jonny Karlsson 29.11.2005 Att avsluta en tråd Om man vill avsluta en tråds arbete före huvudtråden bör tråden anropa funktionen pthread_exit(): #include #include void pthread_exit(void *retval); retvalTrådens returvärde
21
Jonny Karlsson 29.11.2005 Mutex-semaforer Typiskr för processer med flera trådar är tt de jobbar indivduellt med lokalt skapade variabler och förenar resultatet via globala variabler Det är därför viktigt att de gemensamma resurserna skyddas med semaforer. De gemensamma resurserna kan t.ex. skyddas med POSIX-trådar som definierar färdigt programmerade binära semaforer, s.k. mutex-semaforer. Det finns fyra olika funktioner för hantering av mutex-semaforer: pthread_mutex_init()Initialisera mutex pthread_mutex_lock()Lås mutex pthread_mutex_unock()Lås upp mutex pthread_mutex_destroy()Radera mutex En ny mutex deklareras med: pthread_mutex_t mutex; Se Programexempel på sid 4 i http://people.arcada.fi/~karlssoj/procprog/material/exekveringstradar.pdf
22
Jonny Karlsson 29.11.2005 Heltalssemaforer Följande färdigt definierade funktioner kan användas för att hantera heltalssemaforer: sempaphore_init()Initialisering semaphore_up()Ökar semaforvärdet semaphore_down();Minskar semaforvärdet semaphore_destroy();Raderar semafor semaphore_decrement();Räknar ner (blockerar ej) Alla funktioner tar en parameter vilken är en pekare på ett semaphore objekt Se Programexempel på sid 6 i http://people.arcada.fi/~karlssoj/procprog/material/exekveringstradar.pdf
23
Jonny Karlsson 29.11.2005 En tråd väntar på en annan En tråd kan vänta på en annan tråd med funktionen pthread_join(): pthread_t some_thread; void *exit_status; pthread_join(some_thread, &exit_status); Funktionen är ungefär samma som funktionen wait() vid inväntning av avslutning av barnprocesser. Funktionen pthread_join() har en viss instabiliet: Ifall tråden som man väntar på redan avslutats kan funktionen skapa ett felmeddelande i stället för att enbart direkt returnera.
24
Jonny Karlsson 29.11.2005 Övriga användbara trådhanteringsfunktioner pthread_yield()Informerar processhanteraren att tråden är villig att uppoffra en del av sin exekveringstid. Funktionen tar inga parametrar och kan bidra till att övringa trådar får mera exekveringstid. pthread_self()Returnerar innevarande tråds ID nummer. pthread_detatch()Informerar Kerneln om att trådens exit-status inte komer att behövas av någon efterföljande pthread_join() funktion. Detta ökar trådarnas prestanda.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.