Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avEllen Blomqvist
1
Jonny Karlsson 11.3.2008 PROCESSPROGRAMMERING Föreläsning 6 (11.3.2008) Innehåll: -IPC: Semaforer -Exekveringstrådar (threads) -Introduktion till Java Applet programmering
2
Jonny Karlsson 11.3.2008 Semaforer En semafor är en räknare som används för att kontrollera samtidig åtkomst av en delad resurs. Kan beskrivas som ett trafikljus: semafor == 0 visar rött ljus och sätter en process i väntetillstånd semafor > 0visar grönt ljus och tillåter en process att komma åt en delad resurs.
3
Jonny Karlsson 11.3.2008 Funktionsprincip 1.Testa semaforen som kontrollerar åtkomsten. 2.Om semaforens värde är positivt kan processen använda den delade resursen. Processen minskar samtidigt semaforens värde med 1 för att indikera att processen har använt en enhet hos resursen. 3.Om semaforens värde är 0 försätts processen i pausläge tills semaforens värde åter igen blir positivt. När en väntande process väcks upp startar den på nytt från steg 1. En process som blivit klar med en delad resurs ökar semaforens värde med 1. Samtidigt väcks en process som köar till samma delade resurs upp. Binära semaforer är den vanligaste semafortypen. Dessa kan endast anta värdet 1 (grönt) eller 0 (rött) En semafor som kan initialieras till vilket positivt heltalsvärde som helst kallas för heltalssemafor och kan användas för att t.ex. räkna hur många enheter hos en delad resurs som har använts.
4
Jonny Karlsson 11.3.2008 Semafor operationer Två typer: P-operationer V-operationer P-operationen används för att testa semaforen och minska semaforens värde med 1 (göra semaforen röd). V-operationen används för att öka på en semafors värde (göra semaforen grön) och väcka upp en väntande process som köar till samma delade resurs (göra semaforen grön).
5
Jonny Karlsson 11.3.2008 P-operation void P(semaphore s) { if(s > 0) if(s > 0) s--; s--; else else { enter_queue(); enter_queue(); pause(); pause(); P(s); P(s); }} Pseudo-kod för en P-operation
6
Jonny Karlsson 11.3.2008 V-operation void V(semaphore s) { s++; s++; if(!empty(process_queue)) if(!empty(process_queue)) wake_up(process_in_queue); wake_up(process_in_queue);} Pseudo-kod för en V-operation
7
Jonny Karlsson 11.3.2008 Programmeringsexempel semaphore s = 1; //1 while(1){ ej_kritisk_sektion_i(); //2 ej_kritisk_sektion_i(); //2 P(s); //3 P(s); //3 kritisk_sektion_i(); //4 kritisk_sektion_i(); //4 V(s); //5 V(s); //5} 1.Initialiserar semaforen med värdet 1 (grön) 2.Programmets icke-kritiska del = den del av programmet som inte hanterar en delad resurs 3.Före en kritisk sektion av programmet inleds utförs en P-operation.(1 – Testar, 2 väntar eller gör semaforen röd) 4.Programmets kritiska sektion = den del av programmet som hanterar en delad resurs. 5.När processen hanterat den delade resursen klart utför den en V-operation (Gör semaforen grön och väckar upp väntande processer)
8
Jonny Karlsson 11.3.2008 Ta i bruk en semafortabell #include int semget(key_t key, int nsems, int flag); keyPositivt heltal, samma i alla processer som använder samma semafor nsemsAntal semaforer som skall tas i bruk flagLiknande bitmönster som msgflg och shmflg (se meddelandeköer och delat minne). ex. 0777|IPC_CREAT ReturnerarSemaforidentifikator (heltal > 0) vid framgång -1 vid misslyckande
9
Jonny Karlsson 11.3.2008 Ta i bruk en semafortabell Process 1: #define SK 99 int SID; SID = semget(SK,1,0777|IPC_CREAT); Process 2: #define SK 99 int SID; SID = semget(SK,1,0777|IPC_CREAT); Ex. Process 1 och Process 2 skapar/tar i bruk en (en semafortabell innehållande endast en semafor) gemensam semafor.
10
Jonny Karlsson 11.3.2008 Hantering av en semafortabell #include int semctl(int semid, int semnum, int cmd, union semnum { int val; struct semid_ds *buf; unsigned short *array; } arg); semidsemaforidentifikatorn som returnerades av semget semnumindexvärdet på semafortabell-elementet där önskad semafor finns cmdsymbolikst värde som anger hurudan operation som skall utföras av semctl
11
Jonny Karlsson 11.3.2008 Hantering av en semafortabell GETVAL värdet på semaforen med index semnum returneras (fjärde parameter behövs ej, kan sättas till 0) GETVAL värdet på semaforen med index semnum returneras (fjärde parameter behövs ej, kan sättas till 0) SETVAL semaforen med index semnum får värdet arg.val (fjärde parameter skall vara ett heltal) SETVAL semaforen med index semnum får värdet arg.val (fjärde parameter skall vara ett heltal) GETPID processnummer returneras för den process som senast avläste eller ändrade värdet på semaforen med index semnum i semafortabellen. GETPID processnummer returneras för den process som senast avläste eller ändrade värdet på semaforen med index semnum i semafortabellen. GETNCNT ett heltal 0 returneras, detta heltal anger antalet processer, som väntar på att semaforen med index semnum skall inkrementeras (ifall index =+1 väntar processerna på en V-operation) GETNCNT ett heltal 0 returneras, detta heltal anger antalet processer, som väntar på att semaforen med index semnum skall inkrementeras (ifall index =+1 väntar processerna på en V-operation) GETZCNT ett heltal 0 returneras, detta heltal anger antalet processer som väntar på att semaforen med index semnum skall få värdet 0 GETZCNT ett heltal 0 returneras, detta heltal anger antalet processer som väntar på att semaforen med index semnum skall få värdet 0 GETALL värden på alla semaforer kopieras till tabellen arg.array.(semnum ej betydelse t.ex.0) GETALL värden på alla semaforer kopieras till tabellen arg.array.(semnum ej betydelse t.ex.0) SETALL semafortabellens semaforer får nya värden från tabellen arg.array (semnum ej betydelse) SETALL semafortabellens semaforer får nya värden från tabellen arg.array (semnum ej betydelse) IPC_RMID semafortabellen raderas. Alla processer som köar till någon av semaforerna väcks upp. IPC_RMID semafortabellen raderas. Alla processer som köar till någon av semaforerna väcks upp.
12
Jonny Karlsson 11.3.2008 Hantering av en semafortabell IPC_STAT semafortabellen status info sparas i den post som arg.buf adresserar. Denna post har datatypen struct semid_ds och definieras i sys/sem.h och sys/ipc.h IPC_STAT semafortabellen status info sparas i den post som arg.buf adresserar. Denna post har datatypen struct semid_ds och definieras i sys/sem.h och sys/ipc.h IPC_SET semafortabellen får nya status info från den post som arg.buf adresserar IPC_SET semafortabellen får nya status info från den post som arg.buf adresserar struct semid_dsInnehåller statusinfo om semaforen (se man-fil eller kursboken
13
Jonny Karlsson 11.3.2008 Hantering av en semafortabell /*initialiserar semaforvärdet i semafortabell[0] som indexeras /*av SID till värdet 1*/ semctl(SID, 0, SETVAL, 1); /*raderar semafortabell[0]*/ semctl(SID, 0, IPC_RMID, 0); Ex. Initialisering och radering av semafortabeller
14
Jonny Karlsson 11.3.2008 Semafor-operationer #include int semop(int semid, struct sembuf semoparray[], size_t nops); struct sembuf { ushort sem_num;Semaforens indexvärde i semafortabellen short sem_op;Semaforoperation sem_flgSemaforflagga: IPC_NOWAIT, SEM_UNDO eller 0 } (mera info om sem_op och sem_flg på nästa slide) nopsantalet semaforoperationer
15
Jonny Karlsson 11.3.2008 Semafor-operationer sem_op = -1P-operation: 1. semaforen testas 2. om semaforvärdet är > 0 får processen hantera delad resurs och utför operationen: semaforvärde += sem_op; (minskar semaforvärdet med 1) om semaforvärdet == 0 försätts processen i väntetillstånd med beaktande av värdet i semflg och efter att den uppväckts av en annan process utförs P-operationen på nytt. om semaforvärdet == 0 försätts processen i väntetillstånd med beaktande av värdet i semflg och efter att den uppväckts av en annan process utförs P-operationen på nytt. sem_op = 1V-operation: Operationen semaforvärde += semop (ökar semaforvärdet med 1) utförs alltid och samtidigt väcks alla processer som väntar på inkrementering av denna semafor.
16
Jonny Karlsson 11.3.2008 Semafor-operationer struct sembuf V_op, P_op; P_op.sem_num = 0; P_op.sem_op = -1; P_op.sem_flg = 0; V_op.sem_num = 0; V_op.sem_op = 1; V_op.sem_flg = 0; ej_kritisk_sektion(); semop(SID, &P_op, 1); kritisk_sektion(); semop(SID, &V_op, 1); Ex. P- och V-operationer
17
Jonny Karlsson 11.3.2008 Exekveringstrådar (threads) Exekveringstrådar är en lättviktsvariant av processer. Är egentilgen inga processer utan varje 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 11.3.2008 Introduktion till Java Applet programmering En ”Java Applet” är ett program som kan köras i en Web-bläddrare genom att använda en Java Virtual Machine (JVM). Basstrukturen för för en Applet ser ut som på följande sida.
19
Jonny Karlsson 11.3.2008 Introduktion till Java Applet programmering //Följande paket måste importeras import java.applet.*; import java.awt.*; // Nedärver den egna applet klassen från klassen Applet public class MinApplet extends Applet { // Följande metoder behövs I alla Applets // init – anropas första gången man kommer in på HTML-sidan där “appleten” finns public void init() {... } // start – anropas varje gång man kommer in på HTML-sidan där “appleten” finns public void start() {... } // stop – anropas om man lämnar sidan med “appleten” public void stop() {... } // destroy – anropas om man lämnar applet-sidan för gått (t.ex. Stänger av browsern) public void destroy {... } //paint – tillåter en att “rita” i en applet (t.ex. Skriva text eller rita en figur). Metoden anropas bl.a. om man flyttar på //brower-fönstret eller om repaint() anropas public void paint (Graphics g) { } }
20
Jonny Karlsson 11.3.2008 Introduktion till Java Applet programmering Efter att applet-koden kompilerats med javac (t.ex. I JCreator-editorn eller direkt från kommandoraden) kan en applet integreras i HTML koden på följande sätt: </html> För att ovanstående HTML-kod skall fungera förutsätts det att man har kompilerat MinApplet.java med framgång och att MinApplet.class finns i samma katalog som html- filen. Efter detta är det bara att öppna html-filen i en browser (internet-bläddrare) För att kunna köra en Java-applet via browsern krävs det att man har installerat Java Runtime Environment (JRE) på datorn och en plug-in för den i browsern.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.