04 process management i - illinois institute of technology

48
Process Management I CS 351: Systems Programming Michael Saelee <[email protected]> 1

Upload: others

Post on 05-Dec-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Process Management ICS 351: Systems ProgrammingMichael Saelee <[email protected]>

1

Computer ScienceScience

§Creating Processes

2

Computer ScienceScience

#include <unistd.h>

pid_t fork();

3

Computer ScienceScience

fork traps to OS to create a new process

… which is (mostly) a duplicate of the calling process!

4

Computer ScienceScience

e.g., the new (child) process runs the same program as the creating (parent) process

- and starts with the same PC,

- the same SP, FP, regs,

- the same open files, etc., etc.

5

Computer ScienceScience

Pparent

int main () { fork(); foo();}

OS

6

Computer ScienceScience

Pparent

int main () { fork(); foo();}

OS

7

Computer ScienceScience

Pparent

int main () { fork(); foo();}

OS

Pchild

int main () { fork(); foo();}

creates

8

Computer ScienceScience

Pparent

int main () { fork(); foo();}

OS

Pchild

int main () { fork(); foo();}

9

Computer ScienceScience

fork, when called, returns twice

(to each process @ the next instruction)

10

Computer ScienceScience

int main () { fork(); printf("Hello world!\n");}

Hello world!Hello world!

11

Computer ScienceScience

int main () { fork(); fork(); printf("Hello world!\n");}

Hello world!Hello world!Hello world!Hello world!

12

Computer ScienceScience

int main () { fork(); fork(); fork(); printf("Hello world!\n");}

Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!

13

Computer ScienceScience

the “fork bomb”

(I didn’t show you this)

int main() { while(1) fork();}

14

Computer ScienceScience

# processes waiting to be scheduled

15

Computer ScienceScience

- system-wide unique process identifier

- child’s pid (> 0) is returned in the parent

- sentinel value 0 is returned in the child

pid_t fork();

typedef int pid_t;

16

Computer ScienceScience

void fork0() { int pid = fork(); if (pid == 0) printf("Hello from Child!\n"); else printf("Hello from Parent!\n");}

main() { fork0(); }

Hello from Child!Hello from Parent!

Hello from Parent!Hello from Child!

(or)

17

Computer ScienceScience

i.e., order of execution is nondeterministic

- parent & child run concurrently!

18

Computer ScienceScience

void fork1 () { int x = 1; if (fork() == 0) { printf("Child has x = %d\n", ++x); } else { printf("Parent has x = %d\n", --x); }}

Parent has x = 0Child has x = 2

19

Computer ScienceScience

important: post-fork, parent & child are identical, but separate!

- OS allocates and maintains separate data/state

- control flow can diverge

20

Computer ScienceScience

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

L0L1L1ByeByeByeBye

21

Computer ScienceScience

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

process tree:

22

Computer ScienceScience

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

L1L0L1ByeByeByeBye

Which are possible?

L0L1ByeByeL1ByeBye

L0L1ByeByeByeL1Bye

L1ByeByeL0L1ByeBye

L0ByeByeL1L1ByeBye

A. B. C. D. E.

23

Computer ScienceScience

main() { fork(); fork(); while(1) ;}

$ ./a.out &[1] 8198

$ pstree -p 8198 a.out(8198)!"!a.out(8199)!!!a.out(8201) #!a.out(8200)

24

Computer ScienceScience

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

25

Computer ScienceSciencevoid fork4() {

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

L0L1L2ByeByeByeBye

L0L1ByeByeL2ByeBye

ByeL0ByeL1ByeL2Bye

L0ByeL1ByeL2ByeBye

L0L1ByeByeByeL2Bye

A. B. C. D. E.

26

Computer ScienceSciencevoid fork4() {

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

27

Computer ScienceSciencevoid fork5() {

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

28

Computer ScienceScience

a good question: what if fork fails?

29

Computer ScienceScience

most syscalls return -1 on failure

global var errno populated with “cause”

30

Computer ScienceScience

#include <errno.h>

extern int errno;

/* get error string */char *strerror(int errnum);

/* print error string w/ message */void perror(const char *s);

31

Computer ScienceScience

int fd = open("/etc/shadow", O_RDONLY);if (fd == -1) { perror("Uh-oh"); exit(1);}

$ ./errtest Uh-oh: Permission denied

32

Computer ScienceScience

$ man errno

NAME errno - number of last error

SYNOPSIS #include <errno.h>

DESCRIPTION ...

E2BIG Argument list too long (POSIX.1) EACCES Permission denied (POSIX.1) EADDRINUSE Address already in use (POSIX.1) EADDRNOTAVAIL Address not available (POSIX.1) EAFNOSUPPORT Address family not supported (POSIX.1) EAGAIN Resource temporarily unavailable (may be the same value as EWOULDBLOCK) (POSIX.1) EALREADY Connection already in progress (POSIX.1) EBADE Invalid exchange ...

33

Computer ScienceScience

§Terminating Processes

34

Computer ScienceScience

int main () { return 0;}

35

Computer ScienceScience

void exit(int status);

36

Computer ScienceScience

void foo() { exit(1); /* no return */}

int main () { foo(); /* no return */ return 0;}

37

Computer ScienceScience

Unix convention:

- normal termination → exit status 0

- other exit status values = error

38

Computer ScienceScience

void foo() { exit(1);}

int main () { ... foo();

release(resource); /* cleanup */ return 0;}

/* $^@#%!! */

39

Computer ScienceScience

int atexit(void (*fn)());

40

Computer ScienceScience

int atexit(void (*fn)());

- registers function to call before exiting

- can call multiple times; functions are invoked in reverse order

41

Computer ScienceScience

void cleanup() { printf("Cleaning up\n");}

void foo() { printf("Self-destructing\n"); exit(1);}

int main() { atexit(cleanup); foo(); /* no return */ return 0;}

Self-destructingCleaning up

42

Computer ScienceScience

void cleanup() { printf("Cleaning up\n");}

void foo() { fork(); exit(1);}

int main() { atexit(cleanup); foo(); /* no return */ return 0;}

Cleaning upCleaning up

43

Computer ScienceScience

i.e., atexit handlers are “inherited” by child processes on fork

44

Computer ScienceScience

void fork7() { if (fork() == 0) { printf("Terminating Child, PID = %d\n", getpid()); exit(0); } else { printf("Running Parent, PID = %d\n", getpid()); while (1) ; /* Infinite loop */ }}

(demo)

45

Computer ScienceScience

All terminating processes turn into zombies

46

Computer ScienceScience

“dead” but still tracked by OS

- pid remains in use

- exit status can be queried

47

Computer ScienceScience

§Reaping Processes(& Synchronization)

48