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

Relevanta dokument
HI1025 Operativsystem, KTH Haninge, VT2012

Del II: Systemprogrammering och Inter-Process Communication.

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

Grundprogrammen. combine

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

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

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

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

printenv sort pager printenv grep args sort pager

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

Introduktion till processer

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

Programmering i C, 7,5 hp

Guido van Robot och olika UNIX-kommandon

*Pekarvärden *Pekarvariabler & *

read Systemanrop i UNIX Exempel med read & write write int antal_tkn, fd, count; char buffer[size]; antal_tkn = read(fd, buffer, count);

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

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

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

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

En kort text om programmering i C.

Övningar för del I av kursen

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

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Användbara systemanrop och biblioteksfunktioner. 2G1520 Operativsystem

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

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

Instruktioner för att kunna programmera på skolans datorer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Programmeringsteknik med C och Matlab

Övning från förra gången: readword

Webbregistrering pa kurs och termin

Dugga Datastrukturer (DAT036)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Exempelsamling Assemblerprogrammering

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

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

Introduktion till programmering, hösten 2011

Föreläsning 10. Pekare (Pointers)

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

Tentamen PC-teknik 5 p

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Loopar och datatyper. Föreläsning 3

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

F4. programmeringsteknik och Matlab

C-programmering, föreläsning 2 Jesper Wilhelmsson

Enkla datatyper minne

Föreläsning 5: Introduktion av pekare

Windows Server containers och Hyper-V containers

Support Manual HoistLocatel Electronic Locks

Raspberry Pi och Tellstick, ett program i C.

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32)

Pekare och arrayer. Indexering och avreferering

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

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Webbreg öppen: 26/ /

Grundkurs i programmering, 6 hp (725G61) Dugga 1 tillfälle 3

Programmeringsteknik med C och Matlab

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Olika shell. Skalprogrammering. Pipor och omdirigering av strömmar

Föreläsning 3. Programmering, C och programmeringsmiljö

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Föreläsning 6 pekare och pekare tillsammans med arrayer

Statistikens grunder 1 och 2, GN, 15 hp, deltid, kvällskurs

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

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

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

Föreläsning 7 Strängar

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Operativsystem (IS1350) :00-12:00

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

Introduktionslaboration

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

C++ Slumptalsfunktioner + switch-satsen

C-programmering, föreläsning 1 Jesper Wilhelmsson

Uppgift 1 (grundläggande konstruktioner)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Strategier för att utnytja parallella system. Peter Kjellström NSC Upplysning

Operativsystem ID1200/06 Tentamen :00-18:00

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Transkript:

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI) Som sagt så kommer den här kursen endast innehålla en enda föreläsning och det var förra gången. Från och med nu så kommer vi förutsätta att ni läser innan kursmötena och att vi kan använda kursmötena till att assimilera och behandla kunskap istället för att hålla föreläsningar. Vi kommer också att presentera nytt material på ett PI-möte, men fokus kommer inte att vara där. 1. Parallella processer i C Vi har ett program i C som vill skapa 10 barnprocesser. Vi vill kunna se alla 10 barnprocesser och föräldraprocessen med kommandot ps -l. Vilken principiell form på programmet är då lämplig? A. main() wait(0); C. main() sleep(10); wait(0); B. main() wait(0); D. main() sleep(10); johnnyp@kth.se 1(7)

2. Om processbilder Då vi kör en process så reserveras ett utrymme i datorns minne. Det finns ganska mycket detaljer kring detta och om ni vill ha mycket detaljer kan ni kolla i Rago & Stevens: Advanced Programming in the UNIX-Environment i 7017, men vi ska nöja oss med att kalla det som reserveras i datorns minne för en processbild. ALP kallar detta för process image och den innehåller data och kod hörande till den process som körs. Så fort en barnprocess skapas så kan vi se det som om en ny processbild skapas och eftersom barnet till en början (direkt efter anropet till fork()) är en kopia av föräldraprocessen (det enda som skiljer är processid) så har barnet samma uppsättning variabler som föräldern. Men alla dessa variabler (precis som allt annat som tillhör barnet) ligger i en barnets separata processbild som alltså är är skild från förälderns processbild. Givet denna information, studera följande kod: main() int a=10,b=20; pid_t pid; a=b; printf("> %d %d.\n\n", a, b); b=a; printf("> %d %d.\n\n", a, b); wait(0); Vad blir utskriften av detta program då det kör? A. > 10 10 > 20 20 C. > 20 10 > 10 20 B. > 10 20 > 20 10 D. Inget av A-C är korrekt. johnnyp@kth.se 2(7)

3. Skapa barn som adopteras av init HI1025 Operativsystem 7.0 hp, KTH Haninge, VT2017 En vanlig konstruktion då man vill skapa en barnprocess är följande: barnkod exit(0) föräldrakod wait(0) mer föräldrakod som utförs när barnet är klart Vi har tidigare illustrerat detta med ett diagram av följande typ: Under barnets körning så upprätthålls alltså släktskapet mellan barn och förälder. Men vad händer om föräldern gör exit innan barnet gjort exit? Olika saker i olika fall. Vi studerar följande program: main() if(fork()==0) printf("child PID: %d.\n", getpid()); sleep(100); printf("parents exits. Do ps -a -o pid,ppid,comm.\n"); johnnyp@kth.se 3(7)

Här skapar vi en barnprocess och avslutar föräldern omedelbart. En testkörning ser ut så här: $./a.out Child PID: 4567. Parents exits. Do ps -a -o pid,ppid,comm. $ ps -a -o pid,ppid,comm PID PPID COMMAND 4233 4224 emacs 4497 4429 man 4500 4497 sh 4501 4500 sh 4505 4501 less 4567 1 a.out 4568 4524 ps Vi ser att vår a.out, som alltså kör sleep(100), har fått en ny förälder: den med processid = 1. Processen med processid = 1 är en speciell process, det är den första processen som kör, den heter init och är urförälder till alla körande processer. Då en förälder avslutar sig själv utan att ha låtit sitt barn köra klart adopteras under vissa förhållanden barnet av init. Men inte alltid: gör så här, öppna en konsol och ge kommandot sleep 100. Öppna ytterligare en konsol och ge kommandot ps -a -o pid,ppid,comm. Då ser vi processer som gör sleep. Avsluta nu den konsol där kommandot sleep 100 gavs. Är barnet adopterat av init? Troligen inte! Hur kan vi försäkra oss om att init adopterar barn som inte kört klart då deras föräldrar avslutar? johnnyp@kth.se 4(7)

4. Vi tittar på en gammal tentamensfråga. Betrakta nedanstående program. Vi antar i det här fallet att programmets processid blir runt 5000. int main(void) pid_t pid1, pid2, twothousand = 2000; pid1 = fork(); //Barn 1: if(pid1==0) childpid1 = getpid(); printf("child 1: %d.\n", getpid()); pid2 = fork(); //Barn 2: if(pid2==0) printf("child 2: %d.\n", getpid()); wait(0); //Föräldern: printf("ett tal: %d.\n", pid1 - twothousand); printf("fork: %d.\n", pid1); wait(0); return 0; Följande alternativ finns till möjliga tidsdiagram och utskrifter. Endast ett är rimligt. A. Ett tal: 0. B. Ett tal: 3002. C. Ett tal: 0. D. Ett tal: 3002. johnnyp@kth.se 5(7)

5. Vi studerar igen koden till fork7.c, vi ska diskutera en del kring de processer som uppkommer då det programmet kör. (Handout!) int main(void) /* fork7.c */ pid_t pid; switch(pid) case -1: fprintf(stderr,"fork failed"); exit (1); Körning: Child with pid = 6410 I'm running ls: FL4fork7.c a.out Parent, my child's pid = 6410 My pid = 6409. case 0: printf("child with pid = %d\n", getpid()); printf("i'm running ls:\n"); execl("/bin/ls", "ls", NULL); sleep (1); //Fråga: kommer sleep att utföras? default: wait (0); printf("parent, my child's pid = %d\n", pid); printf("my pid = %d.\n\n", getpid()); return 0; //Endast föräldern gör detta anrop Vi ser på ett tidsdiagram som beskriver detta program: Frågan ligger i koden: Kommer sleep att utföras? Varför, varför inte? Hur är det med Finns det några förhållanden liknande de ovan där sleep respektive exit kommer att utföras? Hur är det med kommandoföljden johnnyp@kth.se 6(7)

6. Zombier Vi ska undersöka ett lite annorlunda zombieprogram än det vi arbetade med på övningen, vi tar in kommandoradsargument som ett tal och lägger det i variabeln nz. int main(int argc, char *argv[]) int i, nz = atoi(argv[1]); //Vi tar in kommandoradsarg 1 och lägger den i nz for(i=0;i<nz;i++)if(fork()==0) printf("run 1:\n===================\n"); system("ps -o stat,pid,ppid,comm"); for(i=0;i<nz/2;i++)wait(0); printf("run 2:\n===================\n"); system("ps -o stat,pid,ppid,comm"); for(i=0;i<nz/2;i++)wait(0); printf("run 3:\n===================\n"); system("ps -o stat,pid,ppid,comm"); return 0; Vad gäller angående detta program? A. Ett fixt antal processer skapar alltid, hälften av dem blir zombier. B. Olika antal processer kan skapas i olika programkörningar och alla blir zombier direkt. C. Olika antal processer kan skapas i olika programkörningar och hälften blir zombier direkt. D. Inget av ovanstående gäller. Ur manualsidan till wait: A child that terminates, but has not been waited for becomes a "zombie". The kernel maintains a minimal set of information about the zombie process (PID, termination status, resource usage information) in order to allow the parent to later perform a wait to obtain information about the child. As long as a zombie is not removed from the system via a wait, it will consume a slot in the kernel process table, and if this table fills, it will not be possible to create further processes. If a parent process terminates, then its "zombie" children (if any) are adopted by init(8), which automatically performs a wait to remove the zombies. johnnyp@kth.se 7(7)