Best2-1 Les 2: Processen en draden The speedup of a parallel program is limited by the time needed for the sequential fraction of the program -- Amdahl's.

Slides:



Advertisements
Verwante presentaties

Advertisements

CIMSOLUTIONS B.V. CIMSOLUTIONS Automation for Industry & Business SIG Embedded “Proces Ellende” André Vink CDP real-time embedded 28 september 2005.
KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Een programma opbouwen.
Real-Time Systems (RTSYST) Week 1. 2 Real-Time Systems (RTSYST) Onderwerpen: Concurrent programming (threads). Real-Time OS (VxWorks, QNX, FreeRTOS).
JAVA1 H 1. KENNISMAKING MET JAVA EN DE ONTWIKKELOMGEVINGEN 1. ONTSTAANSGESCHIEDENIS VAN JAVA Java: ontworpen in 1990 door Sun Microsystems voor de programmering.
Het ontwerpen van een klasse
Klassen en objecten.
Greenfoot Workshop Bobby - Snake.
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Hoofdstuk 5: Bestanden.
Hoofdstuk 6: Controle structuren
Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 10: Omgaan met problemen.
1/1/ / faculty of Computer Science eindhoven university of technology 5B040:Computerarchitectuur 2M200:Inleiding Computersystemen Sessie 7(1): Flow of.
Consoleprogramma’s Hoofdstuk 19. Visual Basic.NET voor studenten2 In dit hoofdstuk … Hoe consoletoepassingen maken In- en uitvoer bij consoleprogramma’s.
Real-Time Systems (RTSYST) Week 2. Process/Thread states Scheduler = deel van OS dat de toestanden van processen/threads bepaald. OS gebruikt timerinterrupt.
Real-Time Systems (RTSYST) Week Priority inheritance voorbeeld taakprioexecutionrelease time d4EEQVE4 c3EVVE2 b2EE2 a1EQQQQE0.
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
Oefeningen Hoofdstuk 3.
Algoritmiek Object-georiënteerd Programmeren
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
P. 1 Vakgroep Informatietechnologie Scanf voorbeeld #include int main(void) { int i=-1,j=-1,k=-1,l=-1; int b; b=scanf("%d %d %d %d",&i,&j,&k,&l); printf("res=%d.
Mail: Jan Zuurbier  Mail:
Event Handling in Embedded Systems.  Wat is een event?  Welke events zijn het meest “time-critical”?  Welke toestand wordt door de CPU opgeslagen?
Operating Systems Informatica.
Herhaling Java-programmatie en geautomatiseerd testen (vervolg)
Deel XIV Eerste echte e-commerce applicatie Implementatie (vervolg) 1 Internetapplicaties Deel 15: Herhaling Java-programmatie en geautomatiseerd testen.
Tircms02-p les 7 systemcalls linux vervolg. Inleiding Onder /usr/include/linux staan bestanden die de linuxkernel o.a. gebruikt om drivers aan te spreken.
Tircms02-p les 4 Preprocessor In- en uitvoer Diversen.
Inleiding tot programmeren
Mail: (of Sheets en verdere info: Onderwerp: vervolg C
BIOS en Opstarten.
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
Datacommunicatie en netwerken
Basisfuncties Operating System.
Computertechniek 2 – ARM assembler Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1  programma draaien vanuit ROM.
Slide 1Programmatuur voor real-time controleYolande Berbers RTPReal-Time Programmatuur hoofdstuk 7: concurrent programming.
tircms02-p les 1 Operating Systems practicum
1 Introductie next MCT - Programmeren 2 © S. Walcarius Waarom java? programma machinetaal (.exe) compilen platformspecifiek Een exe programma.
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 3 redirection,
JAVA: een platformonafhankelijke taal
Hoofdstuk 14.1 Algoritmen: Zoeken in een netwerk.
Hoofdstuk 10.3 Tekst-editor: MDI-interface Dialogen Files lezen Abstracte klassen.
Inlezen en uitlezen van txt bestanden
Java C++ nVeilig nMachine- onafhankelijk nVeel libraries, ook voor Internet-I/O Snel Native executables Libraries optimaal voor specifiek OS.
Programma zonder window commandline interface. Commandline programma public static void main (String [ ] params) { System. out. println (“Hoi allemaal!”);
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen.
INFITT01 - Internettechnologie WEEK 3. Programma Sessies JSP.
Java & het Web Programma: Sessies JSP. Stateless vs. Stateful(1) HTTP is stateless WAT IS STATELESS?
Studie en implementatie van input replay Cornelis Frank.
Loops en errors Array's Random try catch for loop while loop do while loop.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
Bestanden Lezen Schrijven Afbeeldingen. Bestandstypen.txt.png eigen.
GUI & classes Een Gui in een class steken en het object gebruiken.
IF() ELSE() LES 4: VOORWAARDEN. BOOL Een variabele die slechts 2 mogelijke waarden kan hebben: true(waar) of false(niet waar) duid je aan met bool bool.
LPI 1.05 Marcel Nijenhof. Agenda ● Customize and use the shell environment ● Customize or write simple scripts ● SQL data management.
Operating Systems Informatica.
ISensorEventListener
Gameprogrammeren: Methoden
Tinpro015b-les 1 C++ voor C-kenners Voor Technische Informatica.
OOS Object geOrienteerd Software-ontwerp - 5
Tinpro015b-les4 Klassen.
Voorbeeld: Simulatie van bewegende deeltjes
Game: omgaan met tijd (Jewel-Jam)
Digitale beeldverwerking
Les 2: Processen en draden
Besturingssystemen Ga verder met een muisklik..
Implementatie Zoekboom
Transcript van de presentatie:

best2-1 Les 2: Processen en draden The speedup of a parallel program is limited by the time needed for the sequential fraction of the program -- Amdahl's law (Gene Amdahl) Any sufficiently large problem can be efficiently parallelized -- Gustafson's Law (John Gustafson)

best2-2 Overzicht Processen Draden Voorbeelden

best2-3 Proces Proces = een programma in uitvoering, inclusief alle toestand: geheugen, registers, code, programmateller, … Processen delen geen systeemmiddelen! Eén core voert op elk moment ten hoogste 1 proces uit. Naast gebruikersprocessen ook systeemprocessen

best2-4 Procestoestanden klaar geblokkeerd in uitvoering getermineerd exit wacht signaleer onderbreking/yield dispatch toegelaten nieuw

best2-5 Procescontroleblok ( PCB ) Registers Programmateller Adresvertaling… Open bestanden Geheugen… Procestoestand Procesnummer Rekentijd … Contextrecord Systeemmiddelen Beheersinformatie

best2-6 Klaarlijst en de apparaatlijsten

best2-7 Contextwisseling

best2-8 5-toestandenplanner klaar geblokkeerd in uitvoering getermineerd exit wacht signaleer onderbreking/yield dispatch toegelaten nieuw Langetermijnplanner Kortetermijnplanner

best2-9 7-toestandenplanner klaar geblokkeerd in uitvoering getermineerd exit wacht signaleer onderbreking/yield dispatch toegelaten nieuw langetermijnplanner kortetermijnplanner geblokkeerd uitgeswapt klaar uitgeswapt signaleer swap uit swap in middellangetermijnplanner

best2-10 Programma-argumenten int main(int argc, char *argv [ ]) { int i; printf(”Aantal argumenten: %d\n”, argc); for (i=0; i<argc; i++) printf(”argument %d: %s\n”, i, argv[i]); } % cc arg.c -o arg % arg a b c Aantal argumenten: 4 argument 0: arg argument 1: a argument 2: b argument 3: c

best2-11 Procescreatie in Unix (1) #include int main(int argc, char *argv [ ]) { pid_t pid; /* fork another process */ pid = fork(); if (pid < 0) { /* error occurred */ fprintf(stderr, "Fork Failed"); exit(-1); } else if (pid == 0) { /* child process */ execlp("./arg","arg", "a", "b", "c", NULL); } else { /* parent process */ /* parent will wait for the child to complete */ wait(NULL); printf("Child Complete"); exit(0); }

best2-12 Procescreatie in Unix (2) proces data code proces data code proces’ data’ code Kloon overladen: execlp(“prog",arg0, arg1,..)

best2-13 Procestoestanden in Unix F S UID PID PPID PRI NI ADDR SZ WCHAN TTY TIME COMD 1 S f aa0 ttypb 0:00 hpterm 1 S d ffe6000 ttypb 0:00 csh 1 R fac80 22 ttypb 0:00 ps 1 S c aa0 ttypb 0:00 xterm 0 S f aa0 ? 0:00 console

best2-14 Procesboom op Solaris

best2-15 Procesterminatie Vrijwillig, via systeemoproep –werk gedaan [exit(0)] –fout (bvb. bestand niet gevonden) [exit(3)] Onvrijwillig –ongeldige handeling (bvb. ongeldige instructie) –een verzoek van ander proces (kill) –Cascading termination

best2-16 Oproep C-programma return 3 e=main(..) exit(e) planner dispatcher initialisatie int main()

best2-17 Zombieproces boot init p1p2 p3p4

best2-18 Adoptie van wezen boot init p1p2 p3p4 boot init p2p3p4

best2-19 Procescreatie : Win32 BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );

best2-20 #include int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ STARTUPINFO si; PROCESS_INFORMATION pi; // allocate memory ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); //create child process if (!CreateProcess(NULL, // use command line "C:\\WINDOWS\\system32\\mspaint.exe", // command line NULL, // don't inherit process handle NULL, // don't inherit thread handle FALSE, // disable handle inheritance 0, // no creation flags NULL, // use parent's environment block NULL, // use parent's directory &si, &pi)) { MessageBox(NULL, "Create Process Failed", "BS - Process creation", MB_OK); return -1; } // parent will wait for the child to complete WaitForSingleObject(pi.hProcess, INFINITE); MessageBox(NULL, "Child Complete", "BS - Process creation", MB_OK); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } Procescreatie in Win32

best2-21 import java.io.*; public class OSProcess { public static void main(String[] args) throws IOException { if (args.length != 1) { System.err.println("Usage: java OSProcess "); System.exit(0); } // args[0] is the command ProcessBuilder pb = new ProcessBuilder(args[0]); Process proc = pb.start(); // obtain the input and output streams InputStream is = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while ( (line = br.readLine()) != null) System.out.println(line); br.close(); } Procescreatie in Java

best2-22 Commandoshell (1) #include main() { char commando[256]; while "), gets(commando))) { char *argv[16]; int argc = 0; int pid;

best2-23 /* parsen van een commando */ argv[0] = strtok(commando," "); while (argv[++argc] = strtok(NULL," ")) ; /* uitvoeren van een commando */ if (argv[0] == NULL) { /* doe niets */ } else if (strcmp(argv[0],"stop") == 0) { printf("\n"); exit(0); } else Commandoshell (2)

best2-24 { int synchroon; if (strcmp(argv[argc-1],"&") == 0) { synchroon = 0; argc--; argv[argc] = NULL; } else synchroon = 1; if (pid = fork()) { if (synchroon) { int toestand; waitpid(pid, &toestand, 0); } } else Commandoshell (3)

best2-25 { char prog[256]; strcpy(prog,"./"); strcat(prog,argv[0]); execv(prog,argv); strcpy(prog,"/bin/"); strcat(prog,argv[0]); execv(prog,argv); strcpy(prog,"/usr/bin/"); strcat(prog,argv[0]); execv(prog,argv); strcpy(prog, "/usr/local/bin/"); strcat(prog, argv[0]); execv(prog,argv); printf("%s: commando niet gevonden\n",argv[0]); exit(-1); }}}} Commandoshell (4)

best2-26 Overzicht Processen Draden Voorbeelden

best2-27 Processen P1P2 code data grabbel geheugen grabbel geheugen stapel proces

best2-28 Draden P1P2 code data grabbel geheugen grabbel geheugen stapel 1 stapel 2 stapel 3 stapel 2 draad1 draad2 Draad

Voordelen van draden Responsiviteit: programma’s kunnen verder rekenen, ook indien 1 draad blokkeert Delen van systeemmiddelen binnenin een proces gaat automatisch Economischer gebruik van systeemmiddelen (door gemeenschappelijk gebruik) Schaalbaarheid op multicores (parallellisme) best2-29

best2-30 Voorbeeld: rekenblad Invoer muis Berekeningsmotor Verwerking invoer Aanpassen scherm Invoer toetsenbord

best2-31 Gebruikersdraden vs. kerndraden kerndraden worden beheerd door de kern, vergelijkbaar in gedrag met een proces –Win32 threads –POSIX Pthreads –Mac OS X Gebruikersdraden worden beheerd door een gebruikersbibliotheek, kern is niet op de hoogte –POSIX Pthreads –Win32 fibers –Java threads – afhankelijk van de implementatie

best2-32 Draadmodellen Veel op één Eén of één Veel op veel Beelden gebruikersdraden af op kerndraden

best2-33 Veel-op-één model Solaris Green Threads GNU Portable Threads

best2-34 Eén-op-één model Windows Linux Solaris 9 and later

best2-35 Veel-op-veel model Windows met de ThreadFiber package Veel-op-veelTweeniveaumodel IRIX HP-UX Tru64 UNIX Solaris < v9

best2-36 Pthreads De POSIX standaard (IEEE c) API voor draadcreatie en synchronisatie Specificeert enkel de API, niet de implementatie Zeer courant gebruikt in Unix besturingssystemen (Solaris, Linux, Mac OS X) Voornaamste primitieven: –pthread_create() –pthread_exit() –pthread_join()

best2-37 Pthreads voorbeeld #include #define NUM_THREADS 4 void *f(void *arg) { int i; for (i=0; i<3; i++) printf("Uitvoering draad %d\n", *(int*)arg); pthread_exit(arg); }

best2-38 Pthreads voorbeeld int main() { int i; pthread_t threads[NUM_THREADS]; int arg[NUM_THREADS]; void *status; for (i = 0; i < NUM_THREADS; i++) { arg[i] = i; if (pthread_create(&threads[i], NULL, f, (void *)&(arg[i]))) printf("Kan draad niet aanmaken\n"); } for (i = 0; i < NUM_THREADS; i++) { if (!pthread_join(threads[i], &status)) printf("Draad %d gestopt met toestand %d\n", i, *(int *)status); }

best2-39 Linuxdraden Worden taken genoemd Geen echt onderscheid tussen processen en draden Worden gecreëerd door middel van clone() clone() deelt sommige systeemmiddelen met de kindtaken, aan de hand van een verzameling van vlaggen

#include DWORD Som = 0; DWORD WINAPI Sommatie(LPVOID Param) { DWORD i; for (i = 0; i<*(DWORD*)Param; i++) Som += i; return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DWORD ThreadId; HANDLE ThreadHandle; int Param = 10; char txt[20]; ThreadHandle = CreateThread(NULL,0,Sommatie,&Param,0,&ThreadId); if (ThreadHandle != 0) { WaitForSingleObject(ThreadHandle,INFINITE); CloseHandle(ThreadHandle); sprintf(txt, "Sum = %d\n", Som); MessageBox(NULL, txt, "BS - Threads", MB_OK); } Win32 draden best2-40

best2-41 Volledig Win32 Procesmodel P1 P2 P3 P4 P5 J1 T1 T2 T1T2 T1 T3 f1 f2 Fiber (windows)

best2-42 Javadraden Javadraden worden beheerd door de JVM Javadraden worden geïmplementeerd bovenop de primitieven die door het BS aangeboden worden (kunnen gebruikersdraden of kerndraden zijn). Javadraden kunnen gecreëerd worden door –De Thread klasse uit te breiden –Door de Runnable interface te implementeren

best2-43 De Thread klasse uitbreiden class Worker1 extends Thread { public void run() { System.out.println("I Am a Worker Thread"); } public class First { public static void main(String args[]) { Worker1 runner = new Worker1(); runner.start(); System.out.println("I Am The Main Thread"); }

best2-44 Implementatie van Runnable class Worker2 implements Runnable { public void run() { System.out.println("I Am a Worker Thread "); } public class Second { public static void main(String args[]) { Runnable runner = new Worker2(); Thread thrd = new Thread(runner); thrd.start(); System.out.println("I Am The Main Thread"); } public interface Runnable { public abstract void run(); }

best2-45 Joining Threads class JoinableWorker implements Runnable { public void run() { System.out.println("Worker working"); } public class JoinExample { public static void main(String[] args) { Thread task = new Thread(new JoinableWorker()); task.start(); try { task.join(); } catch (InterruptedException ie) { } System.out.println("Worker done"); }

Java draadtoestanden best2-46 getermineerd end of run() new lock() join(tijd) start() nieuw join() geblokkeerd wachtend + timeout runnable wachtend

best2-47 proces vs draad ProcesDraad Eigen adresruimteEigen stapel Duur in aanmaakGoedkoop in aanmaak Goede beschermingGeen bescherming ~ computer~ processor Beheert systeemmiddelen Beheert context (registers, PC, stapel)

best2-48 Problemen met draden Semantiek van fork () en exec() systeemoproepen Annuleren van draden Afhandeling van signalen Thread pools Draadspecifieke gegevens Planneractivaties

best2-49 Semantiek van fork() en exec() Worden alle draden gedupliceerd door fork()? Twee varianten aanbieden: –Indien meteen exec volgt, volstaat 1 draad –Anders alle draden Oproep van exec? Wat met verschillende actieve draden? Alle draden moeten termineren want de code verdwijnt.

best2-50 Annuleren van draden Vóór de normale terminatie Twee aanpakken: –Asynchroon annuleren: ogenblikkelijk –Uitgesteld annuleren: draad beslist zelf wanneer te stoppen en kan alle gestarte activiteiten eerst afronden en alle resources terug vrijgeven.

best2-51 Uitgestelde terminatie in Java Thread thrd = new Thread (new InterruptibleThread()); Thrd.start();... // now interrupt it Thrd.interrupt();

best2-52 Uitgestelde terminatie in Java public class InterruptibleThread implements Runnable { public void run() { while (true) { /** * do some work for a while */ if (Thread.currentThread().isInterrupted()) { System.out.println("I'm interrupted!"); break; } // clean up and terminate }

best2-53 Afhandeling van signalen Signalen worden aan processen gestuurd Twee soorten: –Synchrone signalen: door proces zelf gegenereerd –Asynchrone signalen: door een ander proces gegenereerd Opties: –Bezorg het signaal aan de draad voor wie het signaal bestemd is (b.v. met pthread_kill()). –Bezorg het signaal aan elke draad in het proces –Bezorg het signaal aan sommige draden in het proces –Declareer een bepaalde draad als ontvanger van alle signalen.

best2-54 Thread pools Maak een vast aantal draden aan die staan te wachten op werk, zonder te termineren op het einde. Voordelen: –Hergebruik van een draad gaat sneller dan het aanmaken van een nieuwe draad –Het maximaal aantal draden kan gemakkelijk beperkt worden. Thread pools worden standaard aangeboden in Java (Executer interface) en in Win32.

best2-55 Draadspecifieke gegevens class Service { private static ThreadLocal errorCode = new ThreadLocal(); public static void transaction() { try { -- werk -- } catch (Exception e) { errorCode.set(e); } public static Object getErrorCode() { return errorCode.get(); }

best2-56 Planneractivaties Gebruikersdraden die blokkeren, verhinderen het hergebruik van een kerndraad door andere gebruikersprocessen Dit probleem kan omzeild worden door de kern upcalls te laten genereren (net vóór het blokkeren en na het ontvangen van een signaal). De planner van de gebruikersdraden kan via deze upcalls verhinderen dat de kerndraden blokkeren.

best2-57 Overzicht Processen Draden Voorbeelden

best2-58 Fortran DOALL I=1,100,1 A[I] = 0 ENDDO

OpenMP best2-59 for (i=0; i<m; i++) { sum = 0.0; for (j=0; j<n; j++) sum += b[i][j]*c[j]; a[i] = sum; } #pragma omp parallel for \ private(i,j,sum) shared(m,n,a,b,c)

best2-60