Processes
(Chapters 3-6)
CS 4410 Operating Systems
[R. Agarwal, L. Alvisi, A. Bracy, M. George Fred B. Schneider, E. Sirer, R. Van Renesse]
Processes (Chapters 3-6) CS 4410 Operating Systems [R. Agarwal, - - PowerPoint PPT Presentation
Processes (Chapters 3-6) CS 4410 Operating Systems [R. Agarwal, L. Alvisi, A. Bracy, M. George Fred B. Schneider, E. Sirer, R. Van Renesse] Process vs Program A program consists of code and data specified in some programming language
[R. Agarwal, L. Alvisi, A. Bracy, M. George Fred B. Schneider, E. Sirer, R. Van Renesse]
2
3
4
5
6
... 0C40023C 21035000 1b80050c 8C048004 21047002 0C400020 ... 10201000 21040330 22500102 ...
.data
max
#include <stdio.h> int max = 10; int main () { int i; int sum = 0; add(m, &sum); printf(“%d”,i); ... }
“It’s alive!”
0x00000000
0x00400000 0x10000000
0xffffffff
max addi jal
7
8
int main(argc, argv){ … f(3.14) … } int f(x){ … g(); … } int g(y){ … }
9
10
11
System Call Interface Portable Operating System Kernel Portable OS Library Web Servers Compilers Source Code Control Web Browsers Email Databases Word Processing x86 ARM PowerPC 10Mbps/100Mbps/1Gbps Ethernet 802.11 a/b/g/n SCSI IDE Graphics Accelerators LCD Screens
12
13
14 int main(argc, argv){ … read(f) … }
15 int main(argc, argv){ … read(f) … }
_read: mov READ, %R0 syscall return
return address
16 int main(argc, argv){ … read(f) … }
HandleIntrSyscall: push %Rn … push %R1 call __handleSyscall pop %R1 … pop %Rn return_from_interrupt _read: mov READ, %R0 syscall return
return address
17 int main(argc, argv){ … read(f) … }
HandleIntrSyscall: push %Rn … push %R1 call __handleSyscall pop %R1 … pop %Rn return_from_interrupt _read: mov READ, %R0 syscall return
return address
18 int main(argc, argv){ … read(f) … }
int handleSyscall(int type){ switch (type) { case READ: … } } HandleIntrSyscall: push %Rn … push %R1 call __handleSyscall pop %R1 … pop %Rn return_from_interrupt _read: mov READ, %R0 syscall return
return address return address
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ctx_switch: // ip already pushed! pushq %rbp pushq %rbx pushq %r15 pushq %r14 pushq %r13 pushq %r12 pushq %r11 pushq %r10 pushq %r9 pushq %r8 movq %rsp, (%rdi) movq %rsi, %rsp popq %r8 popq %r9 popq %r10 popq %r11 popq %r12 popq %r13 popq %r14 popq %r15 popq %rbx popq %rbp retq
36
struct pcb *current, *next; void yield(){ assert(current->state == RUNNING); current->state = RUNNABLE; runQueue.add(current); next = scheduler(); next->state = RUNNING; ctx_switch(¤t->sp, next->sp) current = next; }
37
ctx_start: pushq %rbp pushq %rbx pushq %r15 pushq %r14 pushq %r13 pushq %r12 pushq %r11 pushq %r10 pushq %r9 pushq %r8 movq %rsp, (%rdi) movq %rsi, %rsp callq ctx_entry
void createProcess( func ){ current->state = RUNNABLE; runQueue.add(current); struct pcb *next = malloc(…); next->func = func; next->state = RUNNING; ctx_start(¤t->sp, next->top_of_stack) current = next; } void ctx_entry(){ current = next; (*current->func)(); current->state = FINISHED; finishedQueue.add(current); next = scheduler(); next->state = RUNNING; ctx_switch(¤t->sp, next->sp) // this location cannot be reached }
38
1. Px user stack à Px interrupt stack 2. Px interrupt stack à Py interrupt stack 3. Py interrupt stack à Py user stack
39
40
41
argv[1],// Command line
42
argv[1],// Command line
43
44
45
Create a child process as a clone of the current
child pid to parent process, 0 to child process.
(prog, args)
Run the application prog in the current process with the specified arguments (replacing any code and data that was in the process already)
(&status)
Pause until a child process has exited
(status)
Tell the kernel the current process is complete and should be garbage collected.
(pid, type)
Send an interrupt of a specified type to a process. (a bit of a misnomer, no?)
46
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status);
PC
?
Program A Process 1
47
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status);
PC
42
Program A Process 1
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status);
PC
Program A Process 42
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status); child_pid = fork(); if (child_pid==0) exec(B); else wait(&status);
48
PC
Program A Process 1
PC
Program A Process 42
42
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status); child_pid = fork(); if (child_pid==0) exec(B); else wait(&status); 42
49
PC
Program A Process 1
PC
Program A Process 42
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status); 42
50
PC
Program A Process 1
main() { ... exit(3); }
PC
Program B Process 42
child_pid = fork(); if (child_pid==0) exec(B); else wait(&status); 42
51
PC
Program A Process 1
3
#include <stdio.h> #include <unistd.h> int main() { int child_pid = fork(); if (child_pid == 0) { // child process printf("I am process %d\n", getpid()); } else { // parent process. printf("I am the parent of process %d\n", child_pid); } return 0; }
52
Allow applications to behave like operating systems.
53
[UNIX] ID Name Default Action Corresponding Event 2 SIGINT Terminate Interrupt (e.g., ctrl-c from keyboard) 9 SIGKILL Terminate Kill program (cannot override or ignore) 14 SIGALRM Terminate Timer signal 17 SIGCHLD Ignore Child stopped or terminated 20 SIGTSTP Stop until next SIGCONT Stop signal from terminal (e.g. ctrl-z from keyboard)
54
55
int main() { pid_t pid[N]; int i, child_status; for (i = 0; i < N; i++) // N forks if ((pid[i] = fork()) == 0) { while(1); //child infinite loop } /* Parent terminates the child processes */ for (i = 0; i < N; i++) { // parent continues executing printf("Killing proc. %d\n", pid[i]); kill(pid[i], SIGINT); } /* Parent reaps terminated children */ for (i = 0; i < N; i++) { pid_t wpid = wait(&child_status); if (WIFEXITED(child_status)) // parent checks for each child’s exit printf("Child %d terminated w/exit status %d\n", wpid, WEXITSTATUS(child_status)); else printf("Child %d terminated abnormally\n", wpid); } exit(0); }
56
void int_handler(int sig) { printf("Process %d received signal %d\n", getpid(), sig); exit(0); } int main() { pid_t pid[N]; int i, child_status; signal(SIGINT, int_handler); //register handler for SIGINT for (i = 0; i < N; i++) // N forks if ((pid[i] = fork()) == 0) { while(1); //child infinite loop } for (i = 0; i < N; i++) { // parent continues executing printf("Killing proc. %d\n", pid[i]); kill(pid[i], SIGINT); } for (i = 0; i < N; i++) { pid_t wpid = wait(&child_status); if (WIFEXITED(child_status)) // parent checks for each child’s exit printf("Child %d terminated w/exit status %d\n", wpid, WEXITSTATUS(child_status)); else printf("Child %d terminated abnormally\n", wpid); } exit(0); }
57
58
59
PCBs
0x00000000 0xFFFFFFFF
Physical address space Each process’ address space by color (shown contiguous to look nicer)
60
0x00000000 0xFFFFFFFF
PCBs
61
62
63
64
65
(func,arg) Creates a new thread that will execute function func with the arguments arg
Calling thread gives up processor. Scheduler can resume running this thread at any point.
Finish caller
66
67
68
0x00000000 0xFFFFFFFF
PCBs
69
0x00000000 0xFFFFFFFF
PCBs
Heap + Stacks
70
71
73
74
75
76
77
78
79
80
81