SE350: Operating Systems
Lecture 3: Process Management
SE350: Operating Systems Lecture 3: Process Management Outline - - PowerPoint PPT Presentation
SE350: Operating Systems Lecture 3: Process Management Outline Safe control transfer How do we switch from one mode to the other? What should hardware provide? Native control of process Can processes create other processes?
Lecture 3: Process Management
Syscall ll
Inte terrupt
Trap or exception
violation (segmentation fault), divide by zero, …
kernel’s return address?
memory (in addition to user stack in user memory)
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3 ret = B2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3 ret = B2 tmp = 2 ret = C2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3 ret = B2 tmp = 2 ret = C2
> 2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3 ret = B2 tmp = 2 ret = C2
> 2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3 ret = B2
> 2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer
ret = A3
> 2
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer > 21
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
tmp = 1 ret = ext
Stack Pointer > 21
A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } A(1); ext:
> 21
User stack Kernel stack
main Proc1 Proc2 syscall
Running
main Proc1 Proc2 syscall
Handling syscall
user CPU state syscall handler I/O driver main Proc1 Proc2
Ready to run
user CPU state
Kernel stack
User stack foo() { while (…) { x = x + 1; y = y – 2; } } User-level process Other Regs EAX, EXB, … Processor Registers PC SP EFLAGS … foo handler() { pushad; … } Kernel
Kernel stack
, PC)
User stack foo() { while (…) { x = x + 1; y = y – 2; } } User-level process Other Regs EAX, EXB, … Processor Registers PC SP EFLAGS … foo handler() { pushad; … } SP EFLAGS PC Error Kernel
User stack foo() { while (…) { x = x + 1; y = y – 2; } } User-level process Other Regs EAX, EXB, … Processor Registers PC SP EFLAGS … foo handler() { pushad; … } SP EFLAGS PC Error … EXB EXA SP Kernel Kernel stack All Regs
ever saw a “syscall” !!!
OS Proc 1 Proc n Proc 2
…
OS Proc 1 Proc n Proc 2
…
OS Library OS Library OS Library
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
Request Reply
(retrieved by web server)
Client Web Server
Server Kernel Hardware
request buffer reply buffer
from user buffer to network buffer Network interface Disk interface
packet and DMA
request
socket write
socket read
packet (DMA) syscall wait interrupt
copy RTU
read syscall
copy RTU
(DMA) interrupt
Request Reply
process ID (PID)
p i d = f o r k ( ) ; i f ( p i d = = 0 ) e x e c ( . . . ) ; e l s e w a i t ( p i d ) ; p i d = f o r k ( ) ; i f ( p i d = = 0 ) e x e c ( . . . ) ; e l s e w a i t ( p i d ) ; m a i n ( ) { . . . } p i d = f o r k ( ) ; i f ( p i d = = 0 ) e x e c ( . . . ) ; e l s e w a i t ( p i d ) ; e x e c f o r k w a i t
(e.g., SIGKILL, SIGINT)
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char *argv[]) { pid_t cpid, mypid; pid_t pid = getpid(); /* get current processes PID */ printf("Parent pid: %d\n", pid); cpid = fork(); if (cpid > 0) { /* Parent Process */ mypid = getpid(); printf("[%d] parent of [%d]\n", mypid, cpid); } else if (cpid == 0) { /* Child Process */ mypid = getpid(); printf("[%d] child\n", mypid); } else { perror("Fork failed"); exit(1); } exit(0); }
5. child_pid = fork(); // create a child process 6. if (child_pid == 0) { 7. exec(prog, args); // I'm the child process. Run program 8. // NOT REACHED 9. } else { 10. wait(child_pid); // I'm the parent, wait for child 11. return 0; 12. }
https://forms.gle/L6oS18zZApNF3ERb8
globaldigitalcitizen.org