1 program and os interactions: exceptions and processes andrew case slides adapted from jinyang li,...

37
1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

Upload: letitia-johnston

Post on 26-Dec-2015

236 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

1

Program and OS interactions:Exceptions and Processes

Andrew Case

Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

Page 2: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

2

User-level programs vs. OS

bombhttpdsafari

OS kernelSend/recv packets,Open/close files…

Page 3: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

3

User-level programs vs. OS

Role of an OS: Implements OS-level services: I/O, network Enforce protection: no stomping on each other’s memory/files/packets… Resource sharing: execute multiple programs “simultaneously”, …

bombhttpdsafari

OS kernelSend/recv packets,Open/close files…

Page 4: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

4

Ways user-level programs interact with OS Invoke syscalls

Send/receive data Create/delete files Execute/kill other programs

Generate exceptions (to be handled by OS) Touch illegal memory Divide by zero

Get interrupted by OS OS preempts a program to execute other programs OS does “upcalls” to user-programs via signals

Achieved viah/w’s exceptional control flow

Page 5: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

5

Topics Exceptional Control Flow Processes

Page 6: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

6

Control Flow

<startup>inst1

inst2

inst3

…instn

<shutdown>

A CPU core reads and executes a series of instructions, one at a time This sequence is the CPU’s control flow

Physical control flow

Time

Page 7: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

7

Altering the Control Flow Up to now: two mechanisms for changing control flow:

Jumps and branches Call and returnBoth react to changes in program state

“exceptional control flow” – react to changes in system state data arrives from a disk or a network adapter instruction divides by zero user hits Ctrl-C at the keyboard System timer expires

Page 8: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

8

Types of Exceptions Asynchronous (interrupts): caused by events external to CPU

hitting Ctrl-C at the keyboard arrival of a packet from a network arrival of data from a disk

Synchronous: caused by executing an instruction Intentional (Traps): e.g. INT 0x80 (syscall) Unintentional but recoverable (Faults): e.g. page or protection faults unintentional and unrecoverable (Aborts): e.g. memory error

Page 9: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

9

Exceptions An exception is a transfer of control to the OS in response to

some event (i.e., change in processor state)

User Process OS

exceptionexception processingby exception handler

event I_currentI_next

Page 10: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

10

Exceptions An exception is a transfer of control to the OS in response to

some event (i.e., change in processor state)

User Process OS

exceptionexception processingby exception handler

• fault: return to I_current• trap,interrupt: return to I_next•Abort: machine reboot, process termination

event I_currentI_next

Page 11: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

11

01

2...

n-1

Interrupt Vectors

Each type of exception has a unique exception number k, used to index into exception table (a.k.a. interrupt vector)

Handler k is called each time exception k occurs

Handled by the OS, not user-level programs

ExceptionTable

code for exception handler 0

code for exception handler 1

code forexception handler 2

code for exception handler n-1

...

Exception numbers

Page 12: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

12

Trap Example: Syscall (System call) User-level program calls: open(filename, options) Function open executes system call instruction int

OS must find or create file, get it ready for reading or writing Returns integer file descriptor

0804d070 <__libc_open>: . . . 804d082: cd 80 int $0x80 # interrupt 80 804d084: 5b pop %ebx . . .

User Process OS

exception

open filereturns

intpop

Page 13: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

13

Fault Example: Page Fault User writes to memory location That address is not in memory (on disk)

int a[1000];main (){ a[500] = 13;}

80483b7: c7 05 10 9d 04 08 0d movl $0xd,0x8049d10

User Process OS

exception: page faultCreate page and load into memoryreturns

movl

OS loads page into physical memory Returns to faulting instruction Successful on second try

Page 14: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

14

Fault Example: Invalid Memory Reference

OS detects invalid address Sends SIGSEGV signal to user process User process exits with “segmentation fault”

int a[1000];main (){ a[5000] = 13;}

80483b7: c7 05 60 e3 04 08 0d movl $0xd,0x804e360

User Process OS

exception: page fault

detect invalid addressmovl

signal process

Page 15: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

15

Topics Exceptional Control Flow Processes

Page 16: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

16

Processes A process is an instance of a running program.

Not the same as “program” or “processor”

OS and Process provides each program with two key abstractions: Logical control flow

Each program seems to have exclusive use of the CPU Private virtual address space

Each program seems to have exclusive use of main memory

How are these Illusions maintained? Process executions interleaved (multitasking) or run on separate cores Virtual Memory managed by OS

Page 17: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

17

Concurrent Processes Two processes run concurrently (are concurrent) if their

flows overlap in time Otherwise, they are sequential Examples (running on single core):

Concurrent: A & B, A & C Sequential: B & C

Process A Process B Process C

Time

Page 18: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

18

User View of Concurrent Processes Control flows for concurrent processes are physically

disjoint in time

However, we can think of concurrent processes are running in parallel with each other

Time

Process A Process B Process C

Page 19: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

19

Context Switching Processes are managed by a shared chunk of OS code

called the kernel Control flow passes from one process to another via a

context switch

Process A Process B

user code

kernel code

user code

kernel code

user code

context switch

context switch

Time

Page 20: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

20

Basic UNIX syscalls for managing processes

fork Create a new process

exit wait

Synchronize among processes execve

Load a new process image

Syscalls are documented in man pages section 2: man -2 fork

Standard C library provides wrapper functions for many syscalls

Page 21: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

21

fork: Creating New Processes int fork(void)

creates a new process (child process) that is identical to the calling process (parent process)

Fork is called once but returns twice

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent: child pid is %d\n”, pid);}

Return 0 to the child process

Return child’s pid to the parent

Page 22: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

22

Understanding fork

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

Process npid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

Child Process m

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

pid = m

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

pid = 0

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

pid_t pid = fork();if (pid == 0) { printf("hello from child\n");} else { printf("hello from parent\n");}

hello from parent hello from childWhich one is first?

Page 23: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

23

Fork Example #1

void fork1(){ int x = 1; pid_t pid = fork(); if (pid == 0) {

printf("Child has x = %d\n", ++x); } else {

printf("Parent has x = %d\n", --x); } printf("Bye from process %d with x = %d\n", getpid(), x);}

Parent and child both run same code Distinguish parent from child by return value from fork

Start with same state, but each has private copy Including shared output file descriptor Relative ordering of their print statements undefined

Page 24: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

24

Fork Example #2

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

Both parent and child can continue forking

L0 L1

L1

Bye

Bye

Bye

Bye

Page 25: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

25

Fork Example #3 Both parent and child can continue forking

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

L2

Bye

Bye

Bye

Bye

L1 L2

L2

Bye

Bye

Bye

Bye

L0

Page 26: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

26

Fork Example #4 Just parent can continue forking

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

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

} printf("Bye\n");}

L0 L1

Bye

L2

Bye

Bye

Bye

Page 27: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

27

Fork Example #5 Just child can continue forking

void fork5(){ printf("L0\n"); if (fork() == 0) {

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

} printf("Bye\n");}

L0 Bye

L1

Bye

Bye

Bye

L2

Page 28: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

28

Beware: the fork bomb Both parent and child can continue forking… indefinitely

void fork_bomb(){ int cnt = 0; while(1) { printf(”L%d\n”, cnt++); fork(); }}

L1 L2

L2

L1 L2

L2

L0

CAUTION: DO NOT RUN ON A SYSTEM YOU DO NOT OWN!THIS WILL PROBABLY HOSE YOUR SYSTEM!!!

Page 29: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

29

exit: Ending a process void exit(int status)

exits a process Normally return with status 0

atexit() registers functions to be executed upon exit

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

void fork6() { atexit(cleanup); fork(); exit(0);}

Page 30: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

30

Zombies Idea

When process terminates, still consumes system resources Why? So that parents can learn of children’s exit status

Called a “zombie” - dead, but still taking up resources Reaping

Performed by parent on terminated child Parent is given exit status information Kernel discards process

What if parent doesn’t reap? If any parent terminates without reaping a child, then child will be

reaped by init process Ancestor of all

Page 31: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

31

linux> ./forks 7 &[1] 6639Running Parent, PID = 6639Terminating Child, PID = 6640linux> ps PID TTY TIME CMD 6585 ttyp9 00:00:00 tcsh 6639 ttyp9 00:00:03 forks 6640 ttyp9 00:00:00 forks <defunct> 6641 ttyp9 00:00:00 pslinux> kill 6639[1] Terminatedlinux> ps PID TTY TIME CMD 6585 ttyp9 00:00:00 tcsh 6642 ttyp9 00:00:00 ps

ZombieExample

ps shows child process as “defunct”

Killing parent allows child to be reaped by init

How do you handle them without killing parent process?

void fork7(){ if (fork() == 0) {

/* Child */printf("Terminating Child, PID = %d\n", getpid());exit(0);

} else {printf("Running Parent, PID = %d\n", getpid());while (1) ; /* Infinite loop */

}}

Page 32: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

32

wait: Synchronizing with Children int wait(int *child_status)

Blocks until some child exits return value is the pid of terminated child If multiple children completed, will take in arbitrary order (use waitpid

to wait for a specific child)void fork9() { if (fork() == 0) { printf("HC: hello from child\n"); } else { printf("HP: hello from parent\n"); wait(NULL); printf("CT: child has terminated\n"); } printf("Bye\n"); exit();}

HP

HC Bye

CT Bye

Page 33: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

33

wait() Example If multiple children completed, will take in arbitrary order Can use macros WIFEXITED (Wait If Exited) and WEXITSTATUS to get

information about exit status

void fork10(){ pid_t pid[N]; int i; int child_status; for (i = 0; i < N; i++)

if ((pid[i] = fork()) == 0) exit(100+i); /* Child */

for (i = 0; i < N; i++) {pid_t wpid = wait(&child_status);if (WIFEXITED(child_status)) printf("Child %d terminated with exit status %d\n",

wpid, WEXITSTATUS(child_status));else printf("Child %d terminate abnormally\n", wpid);

}}

Page 34: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

34

waitpid(): Waiting for a Specific Process waitpid(pid, &status, options)

suspends current process until specific process terminates various options (see textbook)

void fork11(){ pid_t pid[N]; int i; int child_status; for (i = 0; i < N; i++)

if ((pid[i] = fork()) == 0) exit(100+i); /* Child */

for (i = N-1; i >= 0; i--) {pid_t wpid = waitpid(pid[i], &child_status, 0);if (WIFEXITED(child_status)) printf("Child %d terminated with exit status %d\n",

wpid, WEXITSTATUS(child_status));else printf("Child %d terminated abnormally\n", wpid);

}}

Page 35: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

35

execve: Execute a new program int execve(

char *filename, //executable char *argv[], //arguments char *envp[] //environment)

Does not return (unless error)

overwrites currentprocess code, data,and stack with new executable keeps pid, open files and signal context

Kernel virtual memory

shared libraries

Heap

Stack

Unused0

Read/write segment(.data, .bss)

Read-only segment(.init, .text, .rodata)

Page 36: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

36

execve Exampleif ((pid = Fork()) == 0) { /* Child runs user job */ if (execve(argv[0], argv, environ) < 0) { printf("%s: Command not found.\n", argv[0]); exit(0); } }

envp[n] = NULLenvp[n-1]

envp[0]…

argv[argc] = NULLargv[argc-1]

argv[0]…

“ls”“-lt”“/usr/include”

“USER=cso”“PATH=/usr/bin:/bin:…”“PWD=/home/cso”

environ

argv

Page 37: 1 Program and OS interactions: Exceptions and Processes Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

38

Summary Exceptions

Used for events that require non-standard control flow Hardware mechanism: exception control flow Generated externally (interrupts) or internally (traps and faults)

OS abstraction of Processes At any given time, system has multiple active processes Each process appears to have total control of

CPU + private memory space Programs interface with OS using syscalls/interrupts:

fork, exit, wait, exec