Grundprogrammen. combine

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

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

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

HI1025 Operativsystem, KTH Haninge, VT2012

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

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

Del II: Systemprogrammering och Inter-Process Communication.

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

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

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

printenv sort pager printenv grep args sort pager

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

Deluppgift 17 Processhantering: exec, sleep, exit, plist

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

Användbara systemanrop och biblioteksfunktioner. 2G1520 Operativsystem

TENTAMEN OOP

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Pekare och arrayer. Indexering och avreferering

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

Programmeringsteknik med C och Matlab

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

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

Tentamen, EDAA10 Programmering i Java

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

Tentamen i Realtidsprogrammering för Au3, D3, E3

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

Linköpings Tekniska Högskola Instutitionen för Datavetenskap (IDA) Torbjörn Jonsson, Erik Nilsson Lab 2: Underprogram

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Tentamen i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

Tentamen. Datorteknik och realtidssystem

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

C++ Slumptalsfunktioner + switch-satsen

Metoder. Inledande programmering med C# (1DV402)

kl Tentaupplägg

Tentamen i Introduktion till programmering

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

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

Introduktion till processer

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

OOP Tentamen

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

kl Tentaupplägg

Systemutvecklare SU13, Malmö

729G74 - IT och programmering, grundkurs. Dugga.

Raspberry Pi och Tellstick, ett program i C.

Föreläsningsmaterial (Syntax och variabler)

HI1024 Programmering, grundkurs TEN

D0010E. Hello world! Nedräkning. Sågtand. Övningsuppgifter i Eclipse. Skapa ett program som skriver ut "Hello world" på skärmen.

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

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

Typkonvertering. Java versus C

Uppgift 1 (grundläggande konstruktioner)

Tentamen i TDIU16 Process- och operativsystemprogrammering

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

Tentamen i Grundläggande Programvaruutveckling, TDA548

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Tentamen Datastrukturer, DAT037 (DAT036)

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

*Pekarvärden *Pekarvariabler & *

Tentamen OOP

Tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Malmö högskola 2007/2008 Teknik och samhälle

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Operativsystem ID1200/06 Tentamen :00-18:00

HI1024 Programmering, grundkurs TEN

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

En kort text om programmering i C.

Övningsuppgifter kapitel 8

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Administrivia Programmering Grunderna i C Kortspel. Programmering. Sommarkurs Verónica Gaspes.

Malmö högskola 2012/2013 Teknik och samhälle

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

Information OPERATIVSYSTEM UNIXPROGRAMMERING

Tentamen TEN1 HI

Malmö högskola 2008/2009 CTS

TDP Regler

Operativsystem ID2200/06 omtentamen :00-18:00

TENTAMEN OOP

Lösningsförslag tentamen FYTA11 Java

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

Datalogi, grundkurs 1

Tentamen i Grundläggande Programvaruutveckling, TDA548

Efternamn förnamn pnr årskurs

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

Tentamen i Programmering

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

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

kl Tentaupplägg

TDDC74 Lab 04 Muterbara strukturer, omgivningar

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

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

KUNGLIGA TEKNISKA HÖGSKOLAN KISTA. Lego Linefollower. Få en robot att följa linjen på golvet!

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

Transkript:

Seminarium II Andra seminariet behandlar speciella övningsuppgifter som gavs ut på kurswebben tidigare. Programmen som presenteras är förlag till lösningar på övningsuppgifterna. Genomgående används systemanropet för att kontrollera att de olika situationer och släktförhållanden mellan processer som verkligen uppstår i programmen som som det krävdes i uppgiftsformuleringarna. Anrop till sleep() har ibland lagts in i de processer som skapats. Programmen in och out (givna nedan) // Programnamn: in main(int argc, char *argv[]) int a; read(0,&a,sizeof(int)); printf("%d\n",a); // Programnamn: out main(int argc, char *argv[]) int a = atoi(argv[1]); write(1,&a,sizeof(int)); Grundprogrammen används i ett program som benämns combine (som skapar barn som omvandlas till över av in och out) är i centrum och det är kring uppgifter kring dessa program som löses nedan. 1. Modifiera programmet så att barnprocesserna inte kör parallellt utan att den ena avslutas innan den andra påbörjas. Kontrollera att processerna inte kör parallellt genom att göra anropet system("ps -o pid,ppid,pgid,sess,comm") vid väl valda tidpunkter. Programmet kan då beskrivas av följande tidsdiagram: bash combine out in Lösningsförslag: Programmet combine innehåller inga kontroller av systemanropen som utförs, det var lättare att genomföra utvecklingen av lösningen när dessa lades till. Här är lösningen: // Programnamn: uppg1 int fds[2], test; pipe(fds); test = dup(fds[1]); assert(test==1); 1

2 execlp("./out", "./out", "10", NULL); test = dup(fds[0]); assert(test==0); execlp("./in", "./in", NULL); test=close(fds[0]); assert(test==0); test=close(fds[1]); assert(test==0); //close(fds[0]); close(fds[1]); // En testkörning har följande utseende: $./uppg1 4316 3577 4316 4316 bash 4362 4316 4362 4316 uppg1 4363 4362 4362 4316 uppg1 4364 4362 4362 4316 sh 4365 4364 4362 4316 ps 4316 3577 4316 4316 bash 4362 4316 4362 4316 uppg1 4366 4362 4362 4316 uppg1 4367 4362 4362 4316 sh 4368 4367 4362 4316 ps 10 $ 2. Låt nu processerna in och out köras som barnbarn (i form av kusiner) till combine istället, ni ska alltså körningen beskrivas av följande tidsdiagram: bash combine out Lösningsförslag: // Programnamn: uppg2 int fds[2], test; pipe(fds); in

3 test = dup(fds[1]); assert(test==1); execlp("./out", "./out", "10", NULL); test = dup(fds[0]); assert(test==0); execlp("./in", "./in", NULL); test=close(fds[0]); assert(test==0); test=close(fds[1]); assert(test==0); Och en testkörning: $./uppg2 5956 3674 5956 3674 uppg2 5957 5956 5956 3674 uppg2 5958 5956 5956 3674 sh 5959 5957 5956 3674 uppg2 5960 5958 5956 3674 ps 5956 3674 5956 3674 uppg2 5961 5956 5956 3674 uppg2 5962 5956 5956 3674 sh 5963 5961 5956 3674 uppg2 5964 5962 5956 3674 ps 10 $

4 3. Låt nu combine skapa ytterligare ett barn som går in mitt emellan barnbarnen och som dubblerar det som skickas, tag koden från processen som heter double och som gavs på kursmötet om relationer mellan processer. Ledning: för att anropa den krävs användning av execlp och anropet blir execlp("./double","./double",null); och då måste programkoden hörande till double ligga i arbetskatalogen för P1. Vi får då följande tidsdiagram bash combine double out Lösningsförslag: //Programnamn: uppg3 int fds1[2], fds2[2], test; pipe(fds1); pipe(fds2); test=close(fds2[0]); assert(test==0); test = dup(fds1[1]); assert(test==1); execlp("./out", "./out", "10", NULL); test=close(fds2[0]), assert(test==0); test=close(0); assert(test==0); test=dup(fds1[0]); assert(test==0); test=close(1); assert(test==0); test=dup(fds2[1]); assert(test=1); execlp("./double","./double", NULL); in

5 fprintf(stderr,"execlp did not work.\n"); test = dup(fds2[0]); assert(test==0); execlp("./in", "./in", NULL); test=close(fds2[0]); assert(test==0); Och en testkörning: $./uppg3 5799 3674 5799 3674 uppg3 5800 5799 5799 3674 uppg3 5801 5799 5799 3674 sh 5802 5800 5799 3674 uppg3 5803 5801 5799 3674 ps 5799 3674 5799 3674 uppg3 5804 5799 5799 3674 double <defunct> 5805 5799 5799 3674 sh 5806 5805 5799 3674 ps 5799 3674 5799 3674 uppg3 5807 5799 5799 3674 uppg3 5808 5799 5799 3674 sh 5809 5807 5799 3674 uppg3 5810 5808 5799 3674 ps 20 $

6 4. Skriv nu om programmet så att alla barn och barnbarn till combine kör parallellt. Verfiera med ett välplacerat anrop till system(ps... ) att barnen och barnbarnen verkligen kör parallellt. Det kan även behövas välplacerade anrop till sleep() för att säkert se att det fungerar. Lösningsförslag: // Programnamn: uppg4 int fds1[2], fds2[2], test; pipe(fds1); pipe(fds2); test=close(fds2[0]); assert(test==0); test = dup(fds1[1]); assert(test==1); execlp("./out", "./out", "10", NULL); // // test=close(fds2[0]), assert(test==0); test=close(0); assert(test==0); test=dup(fds1[0]); assert(test==0); test=close(1); assert(test==0); test=dup(fds2[1]); assert(test=1); execlp("./double","./double", NULL); fprintf(stderr,"execlp did not work.\n"); // //

7 test = dup(fds2[0]); assert(test==0); execlp("./in", "./in", NULL); test=close(fds2[0]); assert(test==0); 5. Skapa en egen variant av barn och barnbarn som kommunicerar med varandra på detta sätt. Istället för att skicka talet 10, låt processerna istället skicka ett processid av det första barnet som skickar någonting. (Ledning: För att göra om ett processid, som är ett heltal, kan ni använda anropet sprintf(str,"%d",pid); för att få in heltalet som är processid:t i en sträng. Detta behövs eftersom execlp kräver strängar som parametrar.) Vi ger en liten lösning till detta som också utgör ett förslag på vad som kan komma att tas med i tillåtna hj lpmedel. Vi skriver ett program som illustreras av följande tidsdiagram: bash combine double Ett program/process som vi kallar combine som skapar ett barn som skickar sitt processid via en pipe till double som dubblerar och skickar det tillbaka till combine som l ser in det det få och skriver ut resultatet. Koden ser ut så här: // Programnamn: uppg5 int fds1[2], fds2[2], test, a; pipe(fds1); pipe(fds2); char pidstr[20]; test = dup(fds1[0]); assert(test==0);

8 test = dup(fds2[1]); assert(test==1); execlp("./double", "./double", NULL); test = dup(fds1[1]); assert(test==1); sprintf(pidstr,"%d",getpid()); execlp("./out","./out",pidstr,null); read(fds2[0],&a,sizeof(int)); printf("pid * 2: %d.\n", a); och en testkörning ser ut så här: $./uppg5 6260 3674 6260 3674 uppg5 6261 6260 6260 3674 uppg5 6262 6260 6260 3674 sh 6263 6261 6260 3674 uppg5 6264 6262 6260 3674 ps pid * 2: 12522. $ Exempelprogram som kommer att finnas med på tentan På förra seminariet lades upp en lista på exempelkod som jag föreslår ska vara tillåtna hjälpmedel på tentamen, vi utökar ni listan på tillåtna hjälpmedel/exempelkoder med ovanstående och då får vi följande lista (som ska utökas ännu mer): Användbara systemanrop. fork() exit() wait() getpid() getppid() execl() execlp() pipe() open() close() Hitta en includefil (och mer information) för ett systemanrop. $ man <systemanropet> Skapa en parallell process. pid t pid; pid = fork(); switch(pid) case -1: fprintf(stderr,"fork failed.\n"); case 0: childcode(); //Körs i en parallell barnprocess.

default: parentcode1(); //Körs parallellt med barnprocessen. parentcode2(); //Körs efter barnprocessen avslutat. Skapa ett barn och ett barnbarn där barnet skickar sitt processid till barnbarnet som i sin tur skickar det multiplicerat med 2 till föräldern. // Programnamn: uppg5 int fds1[2], fds2[2], test, a; pipe(fds1); pipe(fds2); char pidstr[20]; test = dup(fds1[0]); assert(test==0); test = dup(fds2[1]); assert(test==1); execlp("./double", "./double", NULL); test = dup(fds1[1]); assert(test==1); sprintf(pidstr,"%d",getpid()); execlp("./out","./out",pidstr,null); read(fds2[0],&a,sizeof(int)); printf("pid * 2: %d.\n", a); 9