Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
3 views

lecture_slides_08_083-processes-exec

The document discusses the fork-exec model in process management, explaining how the fork() function creates a copy of the current process and execve() replaces the process's code with that of a new program. It covers key concepts such as process termination, zombie processes, and synchronization between parent and child processes using wait(). Additionally, it highlights the importance of context switching and the overall management of multiple active processes in an operating system.

Uploaded by

yihuangece
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views

lecture_slides_08_083-processes-exec

The document discusses the fork-exec model in process management, explaining how the fork() function creates a copy of the current process and execve() replaces the process's code with that of a new program. It covers key concepts such as process termination, zombie processes, and synchronization between parent and child processes using wait(). Additionally, it highlights the importance of context switching and the overall management of multiple active processes in an operating system.

Uploaded by

yihuangece
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 10

University

 of  Washington  

Sec3on  8:  Processes  


¢ What  is  a  process  
¢ Crea3ng  processes  
¢ Fork-­‐Exec  

Fork-­‐Exec  
University  of  Washington  

Fork-­‐Exec  
¢ fork-­‐exec  model:  
§ fork()  creates  a  copy  of  the  current  process  
§ execve()  replaces  the  current  process’  code  &  address  space  with  
the  code  for  a  different  program  
§ There  is  a  whole  family  of  exec  calls  –  see  exec(3)  and  execve(2)

// Example arguments: path="/usr/bin/ls”,


// argv[0]="/usr/bin/ls”, argv[1]="-ahl", argv[2]=NULL
void fork_exec(char *path, char *argv[])
{
pid_t pid = fork();
if (pid != 0) {
printf("Parent: created a child %d\n”, pid);
} else {
printf("Child: exec-ing new program now\n");
execv(path, argv);
}
printf("This line printed by parent only!\n");
}
Fork-­‐Exec  
University  of  Washington  

Exec-­‐ing  a  new  program  


Stack  

Very  high-­‐level  diagram  of  what  


happens  when  you  run  the  
Heap   command  ”ls”  in  a  Linux  shell:  
Data  
Code:  /usr/bin/bash
fork():  
parent   child   child  
Stack  
Stack   Stack  

exec():  

Heap   Heap  
Data   Data   Data  
Code:  /usr/bin/bash Code:  /usr/bin/bash Code:  /usr/bin/ls
Fork-­‐Exec  
University  of  Washington  

execve:  Loading  and  Running  Programs  


Stack  bo/om  
Null-­‐terminated  
¢ int execve( env  var  strings  
char *filename, Null-­‐terminated  
char *argv[], cmd  line  arg  strings  
char *envp[] unused
)   envp[n]  ==  NULL
¢ Loads  and  runs  in  current  process:   envp[n-­‐1]
§ Executable  filename …
envp[0]
§ With  argument  list  argv
argv[argc]  ==  NULL
§ And  environment  variable  list  envp argv[argc-­‐1]
§ Env.  vars:  “name=value”  strings   …
(e.g.  “PWD=/homes/iws/pjh”)   argv[0]
¢ execve  does  not  return  (unless  error)   Linker  vars
envp
¢ Overwrites  code,  data,  and  stack   argv
§ Keeps  pid,  open  files,  a  few  other  items   argc
Stack  frame  for    
Fork-­‐Exec  
main Stack  top  
University  of  Washington  

exit:  Ending  a  process  


¢ void exit(int status)  
§ Exits  a  process  
Status  code:  0  is  used  for  a  normal  exit,  nonzero  for  abnormal  exit  
§
§ atexit()  registers  funcXons  to  be  executed  upon  exit  

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

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

Fork-­‐Exec  
University  of  Washington  

Zombies  
¢ Idea  
§ When  process  terminates,  it  sXll  consumes  system  resources  
Various  tables  maintained  by  OS  
§
§ Called  a  “zombie”  
§ A  living  corpse,  half  alive  and  half  dead  

¢ Reaping  
§ Performed  by  parent  on  terminated  child  
§ Parent  is  given  exit  status  informaXon  
§ 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  (pid  ==  1)  
§ But  in  long-­‐running  processes  we  need  explicit  reaping  
§ e.g.,  shells  and  servers  
Fork-­‐Exec  
University  of  Washington  

wait:  Synchronizing  with  Children  


¢ int wait(int *child_status)  
§ Suspends  current  process  (i.e.  the  parent)  unXl  one  of  its  children  
terminates  
§ Return  value  is  the  pid  of  the  child  process  that  terminated  
§ On  successful  return,  the  child  process  is  reaped  
§ If  child_status  != NULL,  then  the  int  that  it  points  to  will  be  set  
to  a  status  indicaXng  why  the  child  process  terminated  
§ There  are  special  macros  for  interpreXng  this  status  –  see  wait(2)  

¢ If  parent  process  has  mulXple  children,  wait()  will  return  


when  any  of  the  children  terminates  
§ waitpid()  can  be  used  to  wait  on  a  specific  child  process  

Fork-­‐Exec  
University  of  Washington  

wait  Example  
void fork_wait() {
int child_status;
pid_t child_pid;

if (fork() == 0) {
HC Bye
printf("HC: hello from child\n");
} else {
child_pid = wait(&child_status); CT Bye
printf("CT: child %d has terminated\n”,
child_pid);
}
printf("Bye\n");
exit(0);
}

Fork-­‐Exec  
University  of  Washington  

Process  management  summary  


¢ fork  gets  us  two  copies  of  the  same  process  (but  fork()  
returns  different  values  to  the  two  processes)  
¢ execve  has  a  new  process  subs3tute  itself  for  the  one  that  
called  it  
§ Two-­‐process  program:  
First  fork()
§
§ if  (pid  ==  0)  {  //child  code  }  else  {  //parent  code  }
§ Two  different  programs:  
§ First  fork()
§ if  (pid  ==  0)  {  execve()  }  else  {  //parent  code  }
§ Now  running  two  completely  different  programs  

¢ wait  /  waitpid  used  to  synchronize  parent/child  execu3on  


and  to  reap  child  process  
Fork-­‐Exec  
University  of  Washington  

Summary  
¢ Processes  
§ At  any  given  Xme,  system  has  mulXple  acXve  processes  
§ Only  one  can  execute  at  a  Xme,  but  each  process  appears  to  have  total  
control  of  the  processor  
§ OS  periodically  “context  switches”  between  acXve  processes  
§ Implemented  using  excep,onal  control  flow  

¢ Process  management  
§ fork-­‐exec  model  

Fork-­‐Exec  

You might also like