Tillfälle 14 (F): Fördjupat studium av parallellitet och synkronisering: processer, trådar, schemaläggning och signaler.



Relevanta dokument
HI1025 Operativsystem 7.0 hp, KTH Haninge, VT2017

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

HI1025 Operativsystem, KTH Haninge, VT2012

#include <pthread.h> #include <stdio.h> int p1[2]; void* char_print (void* parameter) { int fds; fds = *((int *)parameter); int i;

Utkast. Programmering. Signals. Olika typer av program. Sommarkurs Avbrott i mjukvara.

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

printenv sort pager printenv grep args sort pager

Signaler. Icke tillförlitliga signaler. Vad göra?

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

... Funktionsanrop. Vad händer när man kör ett program?

Datorteknik ERIK LARSSON

Operativsystem (ID2200/06) XX XX:00-XX:00

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Olika OS. Unix, Linux och Windows. Unix. Unix. En översikt av ett par OS. Titt på hur de gör. Många varianter. Mycket gemensamt. En del som skiljer

Grundprogrammen. combine

Workplan Food. Spring term 2016 Year 7. Name:

Support Manual HoistLocatel Electronic Locks

Operativsystem. Hierarkin för hårdvara läses nerifrån

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl


Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Exempelsamling Assemblerprogrammering

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Webbregistrering pa kurs och termin

Operativsystem ID2200 Tentamen TEN1 3.8 hp :00-18:00

Operativsystem ID2206 Tentamen TEN1 4.5 hp :00-18:00

Concurrency Saker händer samtidigt. Process En instans av ett program

Webbreg öppen: 26/ /

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Isolda Purchase - EDI

Make a speech. How to make the perfect speech. söndag 6 oktober 13

Beijer Electronics AB 2000, MA00336A,

Programmeringsteknik med C och Matlab

Möte 9: Relationer mellan körande processer - (PI)

Möte 10: Kommunikation mellan processer - (PI)

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Exam Concurrent and Real-Time Programming

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Det finns en handledning till kortet på hemsidan. AVR STK500.

Vässa kraven och förbättra samarbetet med hjälp av Behaviour Driven Development Anna Fallqvist Eriksson

Operativsystem Lektion 1. Lärare. Schema. Kurssajten Finns på adressen. Jan Erik Moström. Set Norman

Module 6: Integrals and applications

Boiler with heatpump / Värmepumpsberedare

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Flera processer. Minneshantering. Trashing kan uppstå ändå. Ersätta globalt

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Mekanismer. (implementation)

Protokoll Föreningsutskottet

Operativsystem ID1200/06 Tentamen :00-18:00

Information technology Open Document Format for Office Applications (OpenDocument) v1.0 (ISO/IEC 26300:2006, IDT) SWEDISH STANDARDS INSTITUTE

Materialplanering och styrning på grundnivå. 7,5 högskolepoäng

4 grundregler. Minneshantering. Problemet. Windows minkrav

Preschool Kindergarten

LARS. Ett e-bokningssystem för skoldatorer.

Del II: Systemprogrammering och Inter-Process Communication.

Problem som kan uppkomma vid registrering av ansökan

Collaborative Product Development:

Provlektion Just Stuff B Textbook Just Stuff B Workbook

Service och bemötande. Torbjörn Johansson, GAF Pär Magnusson, Öjestrand GC

Aktivitetsschemaläggning för flerkärninga processorer

Styrteknik: Binära tal, talsystem och koder D3:1

EVALUATION OF ADVANCED BIOSTATISTICS COURSE, part I

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Authentication Context QC Statement. Stefan Santesson, 3xA Security AB

Operativsystem (IS1350) :00-12:00

Styrteknik : Funktioner och funktionsblock

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

Recitation 4. 2-D arrays. Exceptions

Tentamen PC-teknik 5 p

Isometries of the plane

samhälle Susanna Öhman

Installation av F13 Bråvalla

Writing with context. Att skriva med sammanhang

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Föreläsning 4 IS1300 Inbyggda system

Att stödja starka elever genom kreativ matte.

Schemaläggning Unix. Minneshantering etc. Linux. Schemaläggning av trådar (kernel threads) Detaljer. Operativsystem - Lektion 7

[HUR DU ANVÄNDER PAPP] Papp är det program som vi nyttjar för att lotta turneringar och se resultat.

Att använda pekare i. C-kod

Tillämpad programmering

Att fastställa krav. Annakarin Nyberg

Kvalitetsarbete I Landstinget i Kalmar län. 24 oktober 2007 Eva Arvidsson

Teknikprogrammet Klass TE14A, Norrköping. Jacob Almrot. Självstyrda bilar. Datum:

Rastercell. Digital Rastrering. AM & FM Raster. Rastercell. AM & FM Raster. Sasan Gooran (VT 2007) Rastrering. Rastercell. Konventionellt, AM

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.


Obemannade flygplan. Namn: Hampus Hägg. Datum: Klass: TE14B. Gruppmedlemmar: Gustav, Emilia, Henric och Didrik

OBS!! Detta är DEL 2 av tentan. För att få ut denna måste du ha lämnat in del 1. Om du inte fått ut del 1 bör du meddela skrivningsvakten. OBS!!

LÄNKHJUL S3. Monteringsanvisning för: Länkhjul S3

Kanban är inte din process. (låt mig berätta varför) #DevLin Mars 2012

Quick Start Guide Snabbguide

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

TDDC74 Lab 04 Muterbara strukturer, omgivningar

HF0010. Introduktionskurs i datateknik 1,5 hp

Kurskod: TAMS28 MATEMATISK STATISTIK Provkod: TEN1 05 June 2017, 14:00-18:00. English Version

Transkript:

Tillfälle 14 (F): Fördjupat studium av parallellitet och synkronisering: processer, trådar, schemaläggning och signaler. Mer kring trådar och processer Vi har nu erfarenhet av både trådar och processer. Det är dock lite förrädiskt att i en textmening skilja på "process" och "tråd", det är ju så att varje process som köra har minst en körande tråd och en process som kör kan ha flera körande trådar. Man brukar då säga att en process är flertrådad. Således kan vi inte tala om process i motsats till tråd - de existerar alltid tillsammans. Schemaläggninsaspekter rörande trådar och processer När ett flerprocessoperativsystem kör så lämnas CPUn över från en process till process (Roundrobin). Detta möjliggör/är multitasking och i själva överlämnandet finns mycket information som måste hanteras rätt. Innehållet i Memory Management Unit (MMU) ska bytas ut (för varje process har olika sidor i minnet att köra), filtabellen (User FDT) måste bytas ut och innehållet i CPUs register ska bytas ut. Det hela kallas Context-Switch och är ganska dyrt i tid räknat. Operativsystemet lägger en massa administrativ tid på det. Dock så är situationen en helt annan då det gäller växling mellan enskilda trådar inom en och samma process. Det som behöver bytas ut när CPU lämnas från en tråd till en annan är i princip endast innehållet i registrena + stackpekaren (varje tråd har ju en egen stack). Eftersom parallella trådar inom samma process delar samma adressrymd och maskinkod så behöver inga uppdateringar av sidtabellen eller filtabellen göras. Det betyder att om vi har parallella skeenden förlagda mellan ett antal trådar så sparas mycket tid jämfört med om vi hade haft samma parallella skeenden förlagda mellan parallella processer. Det är till och med så att vissa författare inte ens kallar det en Context-Switch då CPU:n går från en tråd till en annan, men vi kan säga att "Context-Switchen vid överlämning av CPU från en tråd till en annan är väsentligt förkortad på grund av att allt som ska bytas ut är CPU-register + stackpekare. MMU och filtabell lämnas orörd." Viktigt är också att vid en context-switch mellan trådar behövs ingen inblandning av operativsystemet, switchen sker internt i den körande processen. Förtjänster/särdrag med trådar Om vi förlägger parallella aktiviteter i trådar istället för i egna processer så gäller följande: Det blir mindre Context-switch Vid en tentamen i operativsystemteknik för ett par år sedan ställdes frågan: "Ange en fördel med trådar jämfört med processer." En student svarade "Trådar är snabbare." Jag tycker att både frågan och svaret var ganska dåliga. För det första så är trådar och processer inte i motsats till varandra, de finns alltid båda två tillsammans som vi sett ovan. Vidare är svaret är väldigt oprecist: VARFÖR är trådar snabbare? Går datorn snabbare om man använder trådar? Varför det? På vilket sätt? Frågan och svaret pekar ändå på något viktigt: I och med att context-switch mellan trådar är så mycket mindre än om man jämför med context-switch mellan processer så spenderar datorn mindre tid med administration om de parallella aktiviteterna kan förläggas i parallella trådar istället för parallella processer. Det vore ett bättre svar på frågan ovan. En bättre formulering av frågan skulle kanske lyda: "Ett datorsystem ska utföra att antal parallella aktiviteter. Valet står mellan om dessa aktiviteter ska förläggas i varsinn process eller om de ska förläggas i ett antal parallella trådar inom samma process. Vad är skillnaden? Finns det fördelar/nackdelar? Motivera ditt svar." Vi får en gemensam adressrymd Ett annat drag som parallella trådar inom en och samma process har är att de har samma adressrymd. Det har vi nämnt förut, men jag nämner det här igen för fullständighetens skull. Det johnnyp@kth.se 1(6)

betyder att de globala variablerna i ett C-program som innehåller flera trådar alla delas mellan trådarna, detta undersöks även på övningen som också illustrerar hur man ska åstadkomma trådspecifika data som lokala variabler i de så kallade trådfunktionerna. Mer aspekter för programmeraren Att förlägga parallella aktiviteter i olika trådar ger för programmeraren större flexibilitet än om de förläggs i parallella processer eftersom det finns fler programmeringsmässiga styrmedel över parallelliteten. Varje tråd kan ges en egen prioritet, varje tråd kan vara mer eller mindre hårt knuten till programmet (detached/non-detached) och att den exekverar i samma adressrymd förenklar kommunikationen mellan de olika trådarna. Exempelvis kan man kommunicera direkt med read()/write() på en pipe som inte har dubbla läs och skrivändar som uppkommer vid fork(), vi slipper alltså stängningen av de extra läs- och skrivändarna som var nödvändiga vid parallella processer. För att skapa parallella processer måste man göra fork() det resulterar i en helt ny process. För att skapa en ny tråd görs pthread_create() (eller liknande) och det resulterar endast i en ny tråd, väsentligt mindre nytt än vid en helt ny process. Trådar sparar således resurser. Detta blir även en tydlig besparing vid context-switch där ju (som vi nu säger for the zillionth time) det som behöver bytas ut i princip endast är CPUs register + stackpekare. (Kolla dock upp vfork()!) Ett exempel på trådar är att i ordbehandlingsprogram som Microsoft Word eller OpenOffice Writer så kontrolleras det ord som sist matats in mot en rättstavningsdatabas. Linux trådar I Advanced Linux Programming (4.5) står det att trådar i Linux är implementerade som processer. Det står så här: "Whenever you call pthread_create() to create a new thread, Linux creates a process that runs that thread. However, this process is not the same as a process you would create with fork(); in particular, it shares the same address space and resources as the original process rather than receiving copies." Jaha... hur ska man tolka det här då? Att "trådar i Linux är processer" låter ju som en begreppsförvirring, var det någon mening med att införa trådar i Linux över huvud taget då om de ändå blir parallella processer? Nja, om vi granskar texten lite noggrannt så ser vi att det står, om den skapade processen: "it shares the same address space and resources as the original process". Men frågan är ju då hur mycket av en egen process som den skapade processen är? Om den inte har en egen adressrymd! Är det inte bäst att säga att "om två parallella skeenden har en egna åtskilda adressrymder är de olika processer" och "om två parallella skeenden delar på samma adressrymd så är de anses som två trådar inom samma process"...? Jag tolkar det så och kommer att prata som om detta gäller. Det verkar ju även här som att problemet ligger i terminologi och definitioner, det viktiga här är att i Linux finns en möjlighet att skapa parallella skeenden i olika adressrymder (parallella processer) eller låta flera parallella skeenden dela på samma adressrymd (parallella trådar). Att det sedan sägs att "I Linux är trådarna parallella processer" förvirrar saker och ting. Man kan inte se trådar med kommandot "ps" så att tala om trådar som att de vore processer skapar som sagt förvirring. Dåligt språkbruk alltså! Fy på er GNU! (Men tack för att vi får ett gratis operativsystem!) johnnyp@kth.se 2(6)

Synkronisering via signaler Processer i Linux/UNIX kan kommunicera genom att skicka signaler till varandra för att meddela att olika händelser inträffat. Det finns olika signaler med namn och nummer. (Se sigaction(2) som ger en översikt på över vad signaler är och hur de används i UNIX.) När en process tar emot en signal kan det liknas vid ett avbrott som orsakas av mjukvaran, ett mjukvaruavbrott. Då en process tar emot en signal kommer processen att avbrytas och operativsystemet ser till att en speciell avbrottsrutin körs. Man kan till viss del programmera dessa avbrottsrutiner och man kallar dem i så fall signalhanterare. Efter signalhanteraren körts sker ett återhopp till den position som processen hade då signalen mottogs. Kommandot > kill -l ger en lista på tillgängliga signaler. Johnny@Concordia:~/osVT2008/lab4> kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX Johnny@Concordia:~/osVT2008/lab4> I fallet med start av barnprocesser med hjälp av fork() finns speciella signaler som sänds från barnprocessen till föräldraprocessen. Bland annat SIGCHLD som sänds då ett barn avslutas. Det är detta som ligger bakom implementationen av systemanropen wait() och wait4() mm. Det finns också signaler för pipe som vi ser ovan. (Nr 13. Skickas till en process som försökt skriva på en pipe där ingen läser.) Genom "info kill" får ni hela listan. En process kan ignorera en signal och det är ofta det som sker, en signal skickas till en process och om det finns en signalhanterare så körs den. Dock kan inte signalen 9 - SIGKILL ignoreras. Det betyder att processen i fråga dödas. Förberedelse: Läs igenom avsnittet 3.3 Signals i Advanced Linux Programming, skriv in och kör programmet i listning 3.5. Pröva att se om du kan skicka SIGUSR1 till processen med kommandot kill(2). Studera manualsidorna till sigaction()och kill(2). Läs manualsidan till dd och testa exemplet därifrån med att skicka signalen USR1 till dd. Vi tittar tillbaka på övningen på sockets. I början av det programmet stod det så här: void sigchld_handler(int s) while(waitpid(-1, NULL, WNOHANG) > 0); respektive, i programmet stod det sa.sa_handler = sigchld_handler; // reap all dead processes sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(sigchld, &sa, NULL) == -1) perror("sigaction"); exit(1); johnnyp@kth.se 3(6)

Vad som skedde här är att systemanropet sigaction() användes för att installera signalhanteraren void sigchld_handler(int s) som körs varje gång signalen SIGCHLD skickas till processen. "Processen" i det här fallet är våran server och varje gång ett barn till servern avslutats (det vill säga en klientkommunikation är fullbordad) så körs alltså signalhanteraren. Den kod som finns däri innebär att det barn som avslutats (och är en zombie) inväntas med waitpid() som är en variant på wait(). Det här är ett alternativt sätt att programmera så att man inväntar barnprocesser så att de inte blir zombier. Det här liknar ju händelsehantering eller hur? Det är händelsehantering. Ett annat sätt att använda signaler tillsammans med fork() skulle kunna vara så här: 1. En process startar en interaktion med en användare som innebär en inmatning av data från användaren. Beräkningar ska göras på dessa data som tar väldigt lång tid och samtidigt behövs mer data från användaren. 2. För att utföra dessa beräkningar parallellt med interaktionen med användaren startar processen en barnprocess som väntar på data. Föräldraprocessen kommuniverar med barnet genom att sända signalen SIGUSR1 för att signalera till barnet att data finns tillgängligt. 3. Då föräldern inte längre behöver den parallella beräkningskapaciteten kan förlädern signalera till barnet att avsluta sig själv med SIGUSR2. Då avslutar barnet sig själv och föräldern inväntar barnet i god ordning. Övning på signaler: Någon av signalerna sänds till en process då användaren trycker control-c för att avbryta en process. Ta reda på vilken genom att skriva ett program som fångar upp en signal och experiementera dig fram tills du hittar vilken signal det är. Modifiera sedan programmet så att det inte avslutas direkt utan skriver ut en text: "jaha, jag ska avslutas. Vänta jag ska bara ta ett bad först." sedan sover processen med sleep() i 10 sekunder och sedan skrivs det ut "Mmmm, nu slutar jag!" och så avlutas processen. Detta kan symbolisera att man bygger in en säkerhetsspärr då man trycker control-c. En klassisk variant är när man trycker på stängningsrutan i ett Windowsprogram, då får man frågan "Ska du verkligen inte spara" om man inte sparat den fil man arbetar med. Denna övning representerar ett sätt att göra detta för terminalprogram. (Denna övning redovisas inte men kan vara bra att göra inför tentamen.) johnnyp@kth.se 4(6)

Vi ska nu titta lite på skelettet till laboration 4. #include <pthread.h> #include <stdio.h> #include <unistd.h> char table[20] = "_W_W_W_W_W_"; HI1025 Operativsystem, KTH Haninge, VT2011 /*Example of illustration of five philosphers with five chopstick. Chopsticks are lying on the table*/ /* _W_W E W_W W E T_T_W W E T E W_ E W_E_W_W */ This is when the third guy is eating. This is when the second guy is eating. third and fourth are thinking. (Philosophizing.) This is when the second and fourth guys are eating. This is when the first guy is eating. To note: The first " " symbolizes one chopstick to the left of the first philosopher. But the last " " is also symbolizing the same chopstick since they are sitting around a round table. struct phil_parms int pos; int nophils; ; void* philosophize (void* parameters) /*Put philosopher-code here*/ return NULL; int main (int argc, char* argv[]) pthread_t phils[9]; /*Some sort of array of phils are needed*/ struct phil_parms control_phil[9]; int i=0; int nophils, lock; int round = 0; /*Overall design of the program 1. Take in commandline arguments to set up how many phils are going to be simulated and if deadlock is going occur. Commandline arguments need to be checked and the program needs to exit if they are not in the correct format see Advanced Linux Programming for excellent advice on commandline arguments. 2. Start simulation by starting the phil-threads and let the main program print out the contents of the string table declared above. No thread is going to communicate with the user but through the string table, it is the main program that prints out the contents of the string table. This means that we are separating the task of computation/simulation from the task of presentation of the results*/ while(round<48) printf("round %2d: %s\n", round+1, table); sleep(1); round++; johnnyp@kth.se 5(6)

/* The above loop runs in parallel to the threads/phils that affect the common resource table. IMPORTANT: The synchronization must not be through one mutex! We must have one mutex per chopstick, that means an array of mutexes is also needed! IMPORTANT: Remember that the program should also make deadlock possible through commandline arguments, there must be a way to force a deadlock to occur. Remember in this context that all thread-functions are to be based on one function, philosophize(), and that this function is the same for all threads. Of course it can behave differently for different philosopher-id's, but it must be one function which needs to be written to enable a forced deadlock so we can compare and understand why it normally avoids deadlock. 3. When the loop has finished, all the threads are joined to the main program and then the main program exits. */ return 0; Körexempel: Round 1: _W_W_W_W_W_ Round 2: _W_W_W_W_W_ Round 3: _W_W_W_W_W_ Round 4: _W_W_W_W_W_... Round 48: _W_W_W_W_W_ Programmet är tillgängligt på kurswebben. johnnyp@kth.se 6(6)