PROCESSPROGRAMMERING Föreläsning 1 (31.8.2010) Innehåll: Introduktion till paralellprogrammering (“concurrent programming”) Introduktion till parallellprogrammering i Java: med trådar (threads) Lågnivåprogrammering av trådobjekt Introduktion till Java Applets Introduktion till paralellprogrammering Traditionellt har man skrivit programkod för seriell processering (serial computing) Planerade för att köras på en dator med en CPU Ett problem spjälks upp i en diskret serie av instruktioner Instruktioner exekveras en efter en Endast en instruktion kan exekveras åt gången Introduktion till paralellprogrammering I sin enklaste form är parallell processering (parallell computing) samtidig användning av multipel “hårdvara” för att lösa ett problem. Parallellprogrammering lämpar på datorer med multipla CPUn Ett problem spjälks upp i diskreta delar som kan lösas samtidigt Varje del spjälks upp vidare i en serie av instruktioner (som i seriell progr.) Instruktioner från varje del exekveras samtidigt på olika CPUn Introduktion till paralellprogrammering Paralellprogrammering lämpar sej väl inte endast på en dator med flere CPUn utan också över ett nätverk dit flere datorer är kopplade eller en kombination av båda Varför paralellisering av program? Viktigaste orsakerna: Spara tid Lösa större problem Möjliggöra “samtidighet” i program Andra orsaker kan vara Utnyttja datorressurser i ett nätverk Kostnadsbesparing - använda multipla billiga datorresurser i stället för att satsa på en superdator Framtiden för parallellisering Trenden för framtiden tyder på Ännu snabbare nätverk Distribuerade system Datorarkitekturer med multipla processorer (gäller även vanliga bordsdatorer) ---> PARALLELLISERING ÄR FRAMTIDEN INOM DATATEKNIK!!!! Olika typer av parallella program Parallellisering kan klassificeras i fyra olika typer (enligt Flynn's klassiska taxonomi): SISD (Single Instruction, Single Data) SIMD (Single Instruction, Multiple Data) MISD (Multiple Instruction, Single Data) MIMD (Multiple Instruction, Multiple Data) För mera info se http://www.ddj.com/212903586?cid=RSSfeed_DDJ_All Paralellprogrammering i Java m.h.a. trådar Det enklaste sättet att åstadkomma parallell exekvering och “samtidighet” (concurrency) i ett Java-program är att använda trådar (threads) Trådar möjliggör att multipla strömmar av ett programs flöde kan existera inom en process Alla trådar inom en och samma process delar resurser som minne, (file handlers) osv. men en tråd kan däremot ha egna lokala variabler, stackar osv. Flere trådar inom samma program kan exekveras samtidigt på multipla processorer (CPUn) Fördelar med trådar Förbättrar prestandan hos enskilda program om trådar används på rätt sätt I multiprocessor datorer Även i datorer med en processor (p.g.a. alternering, se tavlan!) Förenklad hantering av asynkrona händelser Tänk dej t.ex. en Web server som skall klara av att sätta upp HTTP-förbindelser med flere Web klienter samtidigt! Varje klientförbindelse kan startas upp i en egen tråd på Web servern “Mottagligare” användargränssnitt Trådprogrammering i Java Trådar existerar i alla processer av Java program som exekveras. Alla processer har åtminstone en huvudtråd. Program med flera samtidigt exekverande trådar är viktig eganskap i Java platformen. Huvudtråden (main thread) kan vid behov starta upp flera paralella trådar. Trådprogrammering i Java Varje tråd i Java är associerad med en instans av klassen Thread. Det finns i Java två strategier för att använda Thread objekt för att göra program med flera samtidigt exekverande trådar: Lågnivå programmering av trådobjekt Hantering av trådobjekt på hög nivå m.h.a ”executors” Den förstnämnda strategin är baserad på en lågnivå ”API” som har varit en del av Java sedan första början. Denna API lämpar sej bra för programmering av enkla ”multiprocessing” program. För större program med massor av samtidgt exekverande trådar lämpar sej ”executors”modellen bättre. Denna metod har funnits fr.o.m. JDK Version 5.0. Vi börjar med llågnivå modellen eftersom den är lättare att förstå! Att definiera och starta en tråd En applikation skapar en instans av klassen Thread och definierar den kod som skall köras i en egen tråd. Det finns två sätt att göra detta på. Metod1: public class TradTest implements Runnable { public void run() { System.out.println("Hej! Jag är en trad som kors parallelt med huvudtraden!"); } public static void main(String args[]) { Thread th = new Thread(new TradTest()); th.start(); System.out.println("Hej! Jag är huvudtraden!"); } } Att definiera och starta en tråd I koden på föregående sida implementerar huvudklassen ett objekt av gränssnittet Runnable. Gränssnittet Runnable definierar en metod run() dit det är meningen att man skall placera den kod som skall exekveras i en egen tråd. I huvudmetoden startar man upp en ny tråd genom att skapa ett nytt objekt av klassen Thread via vilket man anropar metoden start(). Runnable- objektet ges som parameter till konstruktorn för klassen Thread(). Att definiera och starta en tråd Metod2: public class TradTest extends Thread { public void run() { System.out.println("Detta ar en paralell trad!"); } public static void main(String args[]) { (new TradTest()).start(); System.out.println("Detta är huvudtraden!"); } } Att definiera och starta en tråd I koden på föregående sida nedärvs klassen Thread i huvudklassen. Klassen Thread implementerar gränsnittet Runnable och behöver därför inte implementeras i det egna Java-programmet. Från huvudmetoden startar man upp en ny tråd genoma att skapa ett nytt Thread objekt via vilket man anropar metoden start(). Att definiera och starta en tråd VILKEN METOD ÄR BÄTTRE??? Metod 2 är enklare men mer begränsande eftersom en klass som hanterar flera samtidiga trådar måste vara en underklass av klassen Thread. I den här kursen kommer vi att koncentrera oss på metod1. Klassen Thread Exempel på metoder som kan användas via klassen Thread är: start() – Startar en ny tråd stop()- Stänge en tråd sleep()- Pausar en tråd för en viss tid Detaljerad information om klassen Thread med alla dess egenskaper hittas i Java API dokumentationen: http://java.sun.com/javase/6/docs/api/