Computer Systems II

Creang and Execung Processes

1

Unix System Calls

( ) ( ) ( )

2

1 How To Create New Processes?

 Underlying mechanism - A runs fork to create a - Parent and children execute concurrently - Child process is a duplicate of the

parent

fork()

child

3

Process Creaon

 Aer a fork, both parent and child keep running, and each can fork off other processes.

 A process tree results. The root of the tree is a special process created by the OS during startup.

 A process can choose to wait for children to terminate. For example, if issued a wait() , it would block unl G finished.

4

2 Bootstrapping

 When a computer is switched on or reset, there must be an inial program that gets the system running

 This is the bootstrap program - Inialize CPU registers, device controllers, memory - Load the OS into memory - Start the OS running

 OS starts the first process (such as “”)

 OS waits for some event to occur - Hardware interrupts or soware interrupts (traps)

5

Fork System Call

 Current process split into two: parent, child

fork()  Returns -1 if unsuccessful

 Returns 0 in the child Stack Stack  Returns the child’s idenfier in the parent ret = 0 Data Data

Text ret = xxx Text

6

3 Fork System Call

 The child process inherits from parent - idencal copy of memory - CPU registers - all files that have been opened by the parent

 Execuon proceeds concurrently with the instrucon following the fork system call

 The execuon context (PCB) for the child process is a copy of the parent’s context at the me of the call

7

How fork Works (1)

pid = 25

Data Resources Text Stack PCB File

ret = fork(); switch(ret) { case -1: perror(“fork”); exit(1); case 0: // I am the child exit(0); default: // I am parent ... wait(0); } 8

4 How fork Works (2)

pid = 25 pid = 26

Data Resources Data Text Text Stack Stack PCB File PCB

ret = 0 ret = fork(); ret = 26 ret = fork(); switch(ret) switch(ret) { { case -1: case -1: perror(“fork”); perror(“fork”); exit(1); exit(1); case 0: // I am the child case 0: // I am the child exit(0); exit(0); default: // I am parent ... default: // I am parent ... UNIX wait(0); wait(0); } }

9

How fork Works (3)

pid = 25 pid = 26

Data Resources Data Text Text Stack Stack PCB File PCB

ret = 0 ret = fork(); ret = 26 ret = fork(); switch(ret) switch(ret) { { case -1: case -1: perror(“fork”); perror(“fork”); exit(1); exit(1); case 0: // I am the child case 0: // I am the child exit(0); exit(0); default: // I am parent ... default: // I am parent ... UNIX wait(0); wait(0); } }

10

5 How fork Works (4)

pid = 25 pid = 26

Data Resources Data Text Text Stack Stack PCB File PCB

ret = 0 ret = fork(); ret = 26 ret = fork(); switch(ret) switch(ret) { { case -1: case -1: perror(“fork”); perror(“fork”); exit(1); exit(1); case 0: // I am the child case 0: // I am the child exit(0); exit(0); default: // I am parent ... default: // I am parent ... UNIX wait(0); wait(0); } }

11

How fork Works (5)

pid = 25 pid = 26

Data Resources Data Text Text Stack Stack PCB File PCB

ret = 0 ret = fork(); ret = 26 ret = fork(); switch(ret) switch(ret) { { case -1: case -1: perror(“fork”); perror(“fork”); exit(1); exit(1); case 0: // I am the child case 0: // I am the child exit(0); exit(0); default: // I am parent ... default: // I am parent ... UNIX wait(0); wait(0); } }

12

6 How fork Works (6)

pid = 25

Data Resources Text Stack Process Status File

ret = fork(); ret = 26 switch(ret) { case -1: perror(“fork”); exit(1); case 0: // I am the child exit(0); default: // I am parent ... UNIX wait(0); < … >

13

Orderly Terminaon: exit()

 To finish execuon, a child may call exit(number)

 This system call: - Saves result = argument of exit - Closes all open files, connecons - Deallocates memory - Checks if parent is alive - If parent is alive, holds the result value unl the parent requests it (with wait); in this case, the child process does not really die, but it enters a zombie/defunct state - If parent is not alive, the child terminates (dies)

14

7 Waing for the Child to Finish

 Parent may want to wait for children to finish - Example: a shell waing for operaons to complete

 Waing for any some child to terminate: wait() - Blocks unl some child terminates - Returns the process ID of the child process - Or returns -1 if no children exist (i.e., already exited)

 Waing for a specific child to terminate: waitpid() - Blocks ll a child with parcular process ID terminates

#include #include

pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);

15

State Transion on wait and exit Calls

16

8 Other useful system calls: getpid, getppid

 getpid returns the idenfier of the calling process. Example call (pid is an integer): pid = getpid();

 getppid returns the idenfier of the parent.

 Note: - Zombies can be noced by running the 'ps' command (shows the process list); you will see the string "" as their command name:

ps -ef ps –ef | grep mdamian

17

Fork Example 1: What Output?

int main() { pid_t pid; int x = 1;

pid = fork(); if (pid != 0) { printf(“parent: x = %d\n”, --x); exit(0); } else { printf(“child: x = %d\n”, ++x); exit(0); } }

18

9 Fork Example 2

 Key Points - Both parent and child can connue forking

void fork2() { printf("L0\n"); Bye fork(); L1 Bye printf("L1\n"); fork(); Bye printf("Bye\n"); L0 L1 Bye }

19

Fork Example 3

void fork3() Bye { L2 Bye printf("L0\n"); fork(); Bye printf("L1\n"); L1 L2 Bye fork(); Bye printf("L2\n"); L2 Bye fork(); printf("Bye\n"); Bye } L0 L1 L2 Bye

20

10 Fork Example 4

void fork4() { printf("L0\n"); if (fork() != 0) { printf("L1\n"); if (fork() != 0) { printf("L2\n"); fork(); } } printf("Bye\n"); }

21

Fork Example 5

void fork5() { printf("L0\n"); if (fork() == 0) { printf("L1\n"); if (fork() == 0) { printf("L2\n"); fork(); } } printf("Bye\n"); }

22

11 Summary

 Fork - Creates a duplicate of the calling process - The result is two processes: parent and child - Both connue execung from the same point on

 Exit - Orderly program terminaon - Unblocks waing parent

 Wait - Used by parent - Waits for child to finish execuon

23

12