Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avAdam Axelsson
1
Jonny Karlsson 4.3.2008 1 PROCESSPROGRAMMERING Föreläsning 5 (4.3.2008 ) Innehåll: IPC: meddelandeköer IPC: delat minne
2
2Jonny Karlsson 4.3.2008 IPC IPC = Inter Process Communication En samling systemanrop för processkommunikation Innehåller tre slags kommunikationsverktyg: Meddelande köer ”message queue” Delat minne”shared memory” Semaforer”semaphores”
3
3Jonny Karlsson 4.3.2008 Meddelandeköer En meddelandekö är en länkad lista som kan bestå av ett visst antal meddelanden. Meddelanden som sätts in i en meddelandekö sparas i datorns minne och Kerneln sköter om köhanteringen. Ett meddelande som finns i en meddelandkö bör ha tre egenskaper: 1.Data 2.En längd 3.Ett typ-värde En meddelandekö avviker från algoritmen för en vanlig kö eftersom man nödvändigtvis inte måste avhämta data från ena ändan av kön. Man kan istället hämta ett meddelande på basen av meddelandets typ
4
4Jonny Karlsson 4.3.2008 Meddelandeköer Figur. Exempel på kommunikation mellan två processer via en meddelandkö
5
5Jonny Karlsson 4.3.2008 Skapa/ta i bruk en meddelandekö Systemanropet msgget() #include #include <sys/msg.h int msgget(key_t key, int flag); keyEtt heltal som karakteriserar en existerande meddelandekö flagEtt heltal som vanligen byggs upp med ”bitwise or”-operatorn: Komponenter: skyddskod|symboliskt ”kommandovärde” 0777|IPC_CREATFulla rättigheter och skapar kön om den ej finns, om kön finns tas den existerande kön i bruk. 0777|IPC_EXECL’’ och skapar kön om dej ej finns. Om kön finns misslyckas msgget() ReturnerarID för meddelandenkön
6
6Jonny Karlsson 4.3.2008 Skapa/ta i bruk en meddelandekö Process 1: #define MSGKEY 75 int koID; koID = msgget(MSGKEY,0777|IPC_CREAT); Process 2: #define MSGKEY 75 int koID; koID = msgget(MSGKEY,0777|IPC_CREAT); Ex. Två processer skapar och tar i bruk en och samma meddelandekö. Ena processen skapar (Den som exekveras först) och den andra tar i bruk.
7
7Jonny Karlsson 4.3.2008 Skicka data till en meddelandekö #include #include int msgsnd(int koID, const void *msgptr, size_t msgsize, int flag); koIDMeddelandeköns ID msgptrEn pekare på en post innehållande data och meddelandetyp ( ) msgsizeAnger meddelandets längd i byte flagHeltal som definierar åtgärd ifall meddelandet inte ryms i kön: flag = 0 Väntar till det finns plats i kön flag = IPC_NOWAITmsgsnd() misslyckas Returnerar0 vid framgång -1 vid misslyckande
8
8Jonny Karlsson 4.3.2008 Skicka data till en meddelandekö Andra parametern i msgsnd() är en pekare på en post som bör vara av följande typ: struct meddelandeformat { long mdlTyp; char text[size]; }; mdlTypEtt heltalsvärde > 0 som definierar meddelandets typ textMeddelandet som en teckensträng
9
9Jonny Karlsson 4.3.2008 Skicka data till en meddelandekö #define maxsize 10 struct mdlformat { long mdltyp; long mdltyp; char text[maxsize]; char text[maxsize];}; struct mdlformat mdlpost; mdlpost.mdltyp = 1; strcpy(mdlpost.text, ”text”); msgsnd(koID, &mdlpost, maxsize, 0); Ex. Skickar ett meddelande av typ 1 innehållande en teckensträng till en meddelandkö med ID=koID. Processen väntar tills meddelandet får plats i kön.
10
10Jonny Karlsson 4.3.2008 Ta emot data från en meddelandekö #include #include int msgrcv(int koID, const void *msgptr, size_t maxsize, long msgtyp, int flag); koIDMeddelandeköns ID msgptrEn pekare på en post innehållande data och meddelandetyp maxsizeMottagna meddelandets maximala längd msgtypBetecknar typen på det meddelande som skall tas emot: msgtyp = 0Tar emot första meddelandet i kön msgtyp > 0Tar emot ett meddelande med angiven typ som är först i kön msgtyp < 0Tar emot första meddelandet med minsta typ- värde
11
11Jonny Karlsson 4.3.2008 Ta emot data från en meddelandekö flagDefinierar ågärd ifall kön är tom eller meddelandets längd > maxsize: 0Blir och vänta på ett meddelande av rätt typ, msgrcv() misslyckas om meddelandets längd > maxsize IPC_NOWAITmsgrcv() misslyckas om data med rätt typ inte finns att hämta i kön MSG_NOERROREtt överlångt meddelande förkortas till maxsize
12
12Jonny Karlsson 4.3.2008 Ta emot data från en meddelandekö #define maxsize 10; struct mdlformat { long mdltyp; long mdltyp; char text[maxsize]; char text[maxsize];}; struct mdlformat mdlpost: msgrcv(koID, &mdlpost, maxsize, 1, IPC_NOWAIT); Ex. Tar emot första meddelandet av typ 1 från en meddelandkö med ID=koID. Om inget meddelande av typ 1 finns att hämta ur meddelandkön misslyckas msgrcv (returnerar -1)
13
13Jonny Karlsson 4.3.2008 Hantering av en meddelandekö Varje meddelandkö är associerad med struktur (struct) som definierar meddelandköns egenskaper: struct msqid_ds { struct ipc_perm msg_perm; //IPC-rättigheter struct msg *msg_first; //Pekare på första msg struct msg *msg_last; //Pekare på sista msg ulong msg_cbytes; //Köstorlek (bytes) ulong msg_qnum; //Antal msg i kön ulong msg_qbytes;//Maximal köstorlek pid_t msg_lspid; //Senaste msgsnd() PID pid_t msg_lrpid; //Senaste msgrcv() PID time_t msg_stime; //Senaste msgsnd() tid time_t msg_rtime; //Senaste msgrcv() tid time_t msg_ctime; //Senaste ändring (tid) }
14
14Jonny Karlsson 4.3.2008 Hantering av en meddelandekö #include #include int msgctl(int koID, int cmd, struct msqid_ds *buf); koIDMeddelandköns ID cmdEtt heltal som definierar hanteringens åtgärd: cmd = IPC_RMIDMeddelandkön raderas (buf saknar här bet.) cmd = IPC_STATMeddelandköns statusinfo kopieras till fältena i den post som utpekas av buf cmd = IPC_SETMeddelandköns status ställs in enligt fältena i den post som buf adresserar bufPekare på en post av typ struct_msqid_ds
15
15Jonny Karlsson 4.3.2008 Hantering av en meddelandekö struct msqid_ds kohant; msgctl(koID, IPC_STAT, &kohant) printf(”%d\n”, kohant.msg_qnum); Ex. Skriver ut på skärmen antalet meddelanden som finns i meddelandkön med ID=koID
16
16Jonny Karlsson 4.3.2008 Delat minne Två eller flera processer kan kommunicera med varandra genom att använda en gemensam minnesplats En process kommer åt information sparad i en delad minnesplats via en pekarvariabel som pekar till minnesplatsen Delat minne är den snabbaste typen av IPC-kommunikation eftersom data ej fysiskt behöver flyttas via två kommunicerande processer.
17
17Jonny Karlsson 4.3.2008 Användningsprincip Process 1: 1.Initialiserar ett gemensamt nyckelvärde 2.Skapar ett gemensamt minnessegment med ett angivet nyckelvärde 3.Minnessegmentet ”bakas in i” den nuvarande processens adressrymd 4.Minnessegmentet kan läsas/skrivas via en pekarvariabel. 5.Friger/raderar det gemensamma minnessegmentet Process 2: 1.Initialiserar ett gemensamt nyckelvärde 2.Tar i bruk ett gemensamt minnessegment med ett angivet nyckelvärde 3.Minnessegmentet ”bakas in i” den nuvarande processens adressrymd 4.Minnessegmentet kan läsas/skrivas via en pekarvariabel
18
18Jonny Karlsson 4.3.2008 Skapa/ta i bruk gemensamt minne #include int shmget(key_t key, int size, int flag); keyEtt nyckelvärde som identifierar ett delat minne sizeMinnessegmentets storlek i byte flagEtt bitmönster som skapas med bitwise or (|). Ena komponenten anger skyddskoden, t.ex. 0777, och den andra komponenten är ett av följande symboliska värden: IPC_CREATSkapar minnessegmentet om det ej finns IPC_EXECLshmget misslyckas om minnessegmentet finns ReturnerarEn identifikator för det delade minnet (icke negativt heltal) om shmget lyckas. -1 vid misslyckande
19
19Jonny Karlsson 4.3.2008 Skapa/ta i bruk gemensamt minne Process 1: #define MN 99 int MID; MID = shmget(MN,128,0777|IPC_CREAT); Process 2: #define MN 99 int MID; MID = shmget(MN,128,0777|IPC_CREAT); Ex. Två processer skapar och tar i bruk ett gemensamt minnessegment. Ena processen skapar (Den som exekveras först) och den andra tar i bruk.
20
20Jonny Karlsson 4.3.2008 ”Baka in” delat minnessegment i exekverande process adressrymd #include void *shmat(int MID, void *addr, int flag); MIDIdentifikatorn för det skapade/ibruktagna delade minnet (positivt heltal som returnerats av shmget()) addrÖnskad begynnelseadress för delat minne. addr = 0UNIX väljer begynnelseadressen (rekommenderas) flagBitmönster. Vanligen 0 eller SHM_RND eller SHM_RDONLY eller SHM_RND|SHM_RDONLY SHM_RNDÖnskad begynnelseadress avrundas till närmaste möjliga värde SMH_RDONLYNuvarande process får endast läsa delat minne
21
21Jonny Karlsson 4.3.2008 ”Baka in” delat minnessegment i exekverande process adressrymd Returnerarvoid pekare på det delade minnessegmentet -1 vid misslyckande
22
22Jonny Karlsson 4.3.2008 ”Baka in” delat minnessegment i exekverande process adressrymd Process 1: #define MN 99 int MID; MID = shmget(MN,128,0777|IPC_CREAT); char *teckentabb; teckentabb = (char *) shmat(MID, 0, 0); strcpy(teckentabb, ”Hej process 2!”); Process 2: #define MN 99 int MID; MID = shmget(MN,128,0777|IPC_CREAT); char *teckentabb; teckentabb = (char *) shmat(MID, 0, 0); printf(”Läser %s ur minnet\n”, teckentabb); Ex. Förverkliga en gemensam teckentabell
23
23Jonny Karlsson 4.3.2008 Hantering av delat minnessegment Ett delat minnessegments egenskaper kan kontrolleras och ändras m.h.a följande struktur: struct shmid_ds { struct ipc_perm shm_perm; IPC-rättigheter struct anon_map *shm_amp; Pekare för Kerneln int shm_segsz; Storlek på minnessegment ushort shm_lkcnt; Låsningsräknare pid_t shm_lpid; PID för senaste shmop() pid_t shm_cpid; Minnesskaparens PID ulong shm_nattch; Antal anslutna processer ulong shm_cnattch; Används av shminfo() time_t shm_atime; Tid för senaste anslutn. time_t shm_dtime; Tid för senaste frånkoppl time_t shm_ctime; Tid för senaste ändring }
24
24Jonny Karlsson 4.3.2008 Statushantering av delat minnessegment Tillståndet hos ett delat minne hanteras med systemandopet shmctl(): #include int shmctl(int MID, int cmd, struct shmid_ds *buf); MIDIdentifikatorn för det delade minnet. (Heltal som returnerats av shmget()) cmdKommando/åtgärd: IPC_STATMeddelandeköns statusinfo kopieras till fältena i den post som utpekas av buf IPC_SETMeddelandeköns statusinfo ställs in enligt fältena i den post som utpekas av buf IPC_RMIDFriger delat minne (3:e param = 0)
25
25Jonny Karlsson 4.3.2008 Statushantering av delat minnessegment bufPekare till en post av typen shmid_ds (se föregående slide) Returnerar0 vid framgång -1 vid misslyckande
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.