Deluppgift 17 Processhantering: exec, sleep, exit, plist

Relevanta dokument
Deluppgift 10 Starta den första processen (3.5h förarbete, 30min kodning)

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

Processer och trådar. Rasmus Cronstrand Per Jonsson Ante Wall Fabian Åberg

Linköpings Tekniska Högskola Institutionen för Datavetanskap (IDA), Software and Systems (SaS) (c) Klas Arvidsson

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

HI1025 Operativsystem, KTH Haninge, VT2012

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

Synkronisering - Semaforen. Om att vänta men inte i onödan

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

Deluppgift 9 Installera PintOS

Tentamen i TDIU16 Process- och operativsystemprogrammering

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

Grundprogrammen. combine

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

Deluppgift 9 Installera Pintos

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Att använda pekare i. C-kod

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

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

Försättsblad till skriftlig tentamen vid Linköpings Universitet Cover page for written exam at Linköping University

Tentamen i Introduktion till programmering

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Datorteknik ERIK LARSSON

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

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

Föreläsning 5-6 Innehåll

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

TDIU01 - Programmering i C++, grundkurs

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

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

Det finns många flaggor till g++,

Lab5 för prgmedcl04 Grafik

*Pekarvärden *Pekarvariabler & *

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

Föreläsning 6: Introduktion av listor

DIG IN TO Dator och nätverksteknik

Trådar. Aktiva objekt

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Maskinorienterad programmering, IT2

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

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

Summering av fält 1.1. Synkronisering - Semaforen. Summering av fält 1.3. Summering av fält 1.2. Summering av fält 2.3 (INTE GK)

Objektorienterad Programkonstruktion. Föreläsning jan 2017

FLEXILAGER Ett hjälpmedel för anpassad lagerhantering. Original -version

Hur delas CPU? Processormodell. Vårt produk9onsbolag igen. Produkt 2. Produkt Vinster med aa göra saker sam9digt.

International Olympiad in Informatics July 2011, Pattaya City, Thailand Tävlingsuppgifter Dag 2 Svenska 1.3. Papegojor

Objektorienterad programmering

Operativsystem - Processkommunikation

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

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

TDDD78, TDDE30, 729A Typhierarkier del 3 När och hur vill vi använda dem? Några Best Practices

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Tentamen Datastrukturer (DAT036)

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

Övningar Dag 2 En första klass

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TENTAMEN I DATAVETENSKAP

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

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

Föreläsning 3-4 Innehåll

Laboration 1: Figurer i hierarki

Operativsystem ID2200/06 omtentamen :00-18:00

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

1 Funktioner och procedurell abstraktion

Introduktion till arv

1.1 Runnable och Thread

Tips & Trix - Teknik Jeeves World Copyright 2011 Jeeves Information Systems AB

Klasshierarkier - repetition

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

5 Grundläggande in- och utmatning

Del II: Systemprogrammering och Inter-Process Communication.

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Datorteknik 2 (AVR 2)

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

grundläggande C++, funktioner m.m.

2D1339 Programkonstruktion för F1, ht 2003

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips

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

Operativsystem ID hp, ID2200 6hp


DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Datorteknik ERIK LARSSON

Föreläsning 10. Pekare (Pointers)

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TDDC77 Objektorienterad Programmering

Tentamen TEN1 HI

Transkript:

Linköpings Tekniska Högskola Institutionen för Datavetanskap (IDA), Software and Systems (SaS) (c) Klas Arvidsson Deluppgift 17 Processhantering: exec, sleep, exit, plist Inledning För att få ett praktiskt användbart operativsystem behövs stöd för att starta flera program. Då behövs minst två systemanrop för att hantera processer. En process måste kunna avsluta, något du redan implementerat, och en process måste kunna starta nya processer. Dessutom behöver operativsystemet ett sätt att hålla reda på aktiva processer och visa dem för användaren (jämför aktivitetshanteraren i Windows eller skalkommandot top i Solaris/Linux). Lägga till ett systemanrop För att lägga till ett systemanrop i Pintos behöver fyra filer modifieras. 1) Öppna lib/syscall-nr.h och lägg till ett symboliskt namn för anropet sist i enum-listan. Det tilldelas nu automatiskt ett nummer vid kompilering. 2) Öppna lib/user/syscall.h och lägg till en funktions-deklaration av systemanropet så som användarprogram skall kunna anropa det. 3) Öppna lib/user/syscall.c och lägg till en implementation av ovan deklaration genom att använda ett av de fördefinerade makron som finns beroende på antalet parametrar (se hur de andra anropen är gjorda). 4) Öppna userprog/syscall.c och lägg till kernel-sidans implementation av systemanropet (precis som förut). Beskrivning av uppgiftens systemanrop Systemanropen exec och exit är deklarerade i lib/user/syscall.h och används av användarprogrammen därefter: pid_t exec (const char *command_line); Anropar endast process_execute. Men nu skall den nya processen läggas till i en lista över aktiva processer. Ett lämpligt process-id är nu processens index i listan, men det går att lösa på många sätt (valfritt). För att kunna hålla reda på relationen mellan processer behöver varje process hålla reda på sitt namn, sitt eget process-id, sin förälders process-id, samt eventuell extra data som en process behöver skicka tillbaka till sin förälderprocess eller tvärtom (jämför med vad du gjorde i uppgift 10). void sleep(int millis); Anrop av denna funktion pausar processen i ett antal millisekunder. Funktioner för att låta en tråd sova i PintOS finns i devices/timer.c. Den befintliga implementationen av timer_sleep använder en implementation som hela tiden byter till en annan tråd. Detta klassas som busy wait. En bra implementation placerar processen i en väntekö under hela denna tid så processen inte förbrukar onödig datorkraft på att hela tiden kontrollera om det är dags att fortsätta. Det räcker att du implementerar systemanropet utan att rätta till busy-wait. void plist (void); Skriver ut hela listan med processinformation (id, namn, förälder-id, exit-status) på ett snyggt och städat format. Denna funktion kan vara bra att ha i debug-syfte, så gör utskriften tydlig och komplett. 71

72 void exit (int status) NO_RETURN; Ser till att processer som inte längre behövs i processlistan rensas bort så att nya processer får plats. Eventuellt allokerat minne måste frigöras. Detta implementeras i process_cleanup så att det utförs vid alla anrop som leder till att en tråd avslutas. Avslut kan ske av kernel när något allvarligt fel uppstår i en process, och inte bara av systemanrop. För att förbereda för enkel delning av data mellan en process och dess förälder skall en process tas bort ur listan exakt när både processen och dess förälder har avslutat. En process kan alltså finnas kvar i listan ända tills även dess förälder avslutat (OBS! även om barn till processen fortfarande exekverar kan processen tas bort ur listan. Processen delar endast sina data med sin förälder, ej med sina barn!). Detta tillvägagångssätt garanterar att processens plats i listan alltid är giltigt oavsett om processen eller föräldern försöker använda den. Tänk noga igenom vilka processer som kan tas bort och när det skall göras. Parametern status kan du som förut bara skriva ut, alternativt spara värdet med övrig information på processens plats i listan. Förberedelse Vid implementering av exec (modifiering av process_execute och start_process) finns ett antal möjligheter att placera koden som lägger till en process i listan. Tänk igenom följande 4 alternativ. De är listade ungeför efter i vilken ordning de olika alternativen exekvera i koden: 1) Lägg till nya processen i listan före anropet av thread_create i process_execute 2) Lägg till nya processen i listan inuti thread_create 3) Lägg till nya processen i listan inuti start_process 4) Lägg till nya processen i listan efter anropet av thread_create i process_execute För att utvärdera varje alternativ skall du tänka igenom följande fem frågor (det ger alltså 5 svar per alternativ, dvs 20 svar totalt). För optimal placering bör svaret på varje fråga vara positivt. Om du planerar använda tråd-id som process-id (vilket inte behövs, det finns andra lösningar), tänk då på att thread_tid alltid ger tråd-id för den tråd som anropar. Tänk även på att du redan har ett sätt att kommunicera värden till och från den nya tråden sedan uppgift 10. Nu till de fem frågorna att utvärdera för varje alternativ (möjliga svar inom parentes): Kommer den nya tråden att lägga till sin egen process i processlistan? (Ja / Nej, det gör förälder-tråden) Är förälderns process-id tillgängligt när informationen om den nya processen skall läggas till i processlistan? (Ja, direkt / Ja, det kan lätt ordnas / Nej, det går absolut inte att få tag på) Är den nya processens process-id tillgängligt vid den placeringen? (Ja, direkt / Ja, det kan lätt ordnas / Nej, det går absolut inte att få tag på) Processens id kommer att användas senare, när barnprocessen når process_cleanup, för att kunna ta bort processen ur processlistan. Är det garanterat att koden som lägger till den nya processen i processlistan alltid kommer exekveras innan den nya tråden exekverar process_cleanup? Detta är en viktig punkt. (Ja / Nej, den nya processen kan hinna avsluta innan den läggs till i listan) Överensstämmer uppgiften att lägga till en ny process i processlistan med intentionen av den funktionen du utför det? (Se uppgift 10 för intentionen och ansvarsfördelningen mellan de olika

tråd- och processfunktionerna, kort sammanfattat nedan.) (Ja, absolut / Ja, ganska bra / Nej, inte alls) Observera att det är mycket viktigt att följa PintOS intentioner eftersom funktionerna för processhantering i userprog/process.h används internt i threads/init.c. Om de funktioner som anropas där inte sätter upp en komlett process uppstår fel senare. Intentionen med funktionerna process_execute och start_process är just att starta en process, d.v.s. göra allt som behövs för att starta och registrera en ny en process korrekt. Intentionen med thread_create är att starta en funktion i en egen kernel-tråd och inget utöver det. På nästa sida visas en figur över tre tänkbara exekveringsordningar (det finns fler) med alternative 1-4 indikerade. Uppgift Redovisa för din handledare var du planerar att placera koden enligt förberedelsen. Att välja rätt plats här underlättar arbetet senare (du slipper göra om göra rätt). Lägg till systemanropen plist och sleep i PintOS och implementera sedan systemanropen exec, exit och plist. Tänk på att placera din kod i filerna userprog/process.c och userprog/plist.c. Koden i userprog/syscall.c skall endast innehålla ett anrop till dessa. Att du måste göra så beror på att den första processen inte startas via ett systemanrop, se informationen från uppgift 10. I grafen på kommande sida ser du under vilken tidsperiod processinformationen skall finnas tillgänglig relativt både processen (CHILD) och dess förälder (P). Som du ser kan dessa data inte lagras i någon tråd då de kan behövas efter det att tråden ej längre finns. Du behöver naturligtvis synkronisera data som kan komma att användas samtidigt av en process och dess förälder. Testa din implementation Filen examples/longrun_nowait.c innehåller ett lämpligt testprogram för att testa systemanropen för processhantering. Se information i filen för att se hur det kan startas. 73

process executing in user mode kernel mode function executing child s process information lifetime kernel thread and data lifetime running kernel thread put on wait queue kernel thread put on ready queue start and end of process information needs start_process CHILD load setup_main_stack 3 process_cleanup thread_exit process_exit thread_create P 1 2 4 process_execute 3 1 2 4 3 1 2 4 74

kernel free proc_id parent_id exit_status alive parent_alive 75

76