�� ���� (3� ��)

  1. ��: ���� �� (Process Creation)� ������ ��� �� ��� ��� �� ������, ��� (Unix) ����� fork() ��� � (System Call)� �� �� ���� (Parent Process)� �� �� (Address Space)� ����, exec() ��� �� �� ���� (Child Process)� ���� ��� ������ ���� � ��� �����.
  2. ��: fork-exec ��� ��� �� ��� ������� ��� ���� ����� ��� � �� ��, � (Shell), � ��, ����� � �� ����� �� �� �� ����� ��� ��.
  3. ��: Copy-on-Write (COW) ���� ���� ��� ����� fork() �� ��� ��� ��� ���� ���, ��� (Linux) ��� �� (clone) ��� �� ���� ���� (Container) ��� ���� �� ��� ����.

. �� � ��� (Context & Necessity)

  • ��: ���� ��� ����� ��� ����� ��� �� ��� ��� ���� ����. ��� �� ������� fork() ��� � (System Call)� �� ����� ��� ���� �� ���� (Child Process)� ����, exec() ��� �� ��� ��� ��� ��� ��� ������ ���� ���� ����. �� ����� ��� �� ��� ��(�� ����� ���, �� ��, �� ���� �)� �����, ��� PID (Process ID)� ���� �� ��� ���.

  • ���: �� �������� �� ��� ��� ��� � ��. ���� ��� ���� ��� ��� � ���� ��� � ������ ���� ��� ��� �� � �� ��� � ��. ��� �� ��� ���(��)� ��� ���� ���� ��, ��� ��� ��� ����(wait) ��� �����. � fork-exec-wait ��� ��� ���� ��� ����, �� ���, �� �� �� ��, ����� �� � ���� ��� ��� ��� ���� ��.

  • ��: fork()� �� ����� ��� ��(��)� ��� ��(��)� ����� ����, exec()� � �� �� ��� ��� ��(� ����)� ���� ����. ��(��)� ��� �� �� �� �� ��� ��� � ��.

  • �� �� � �� ��:

    1. �� ���� �� ���� ��: ��� ��� ������ � �� ��� ����� ��� � ���, � ����� ����� �� ����� ���� ��. �� ��� �� ���� ��� ��� ����.
    2. fork() ��� �� �� (1970��): � �� (Ken Thompson)� ��� �� (Dennis Ritchie)� �� ����� ��� ���� ���� fork()� ����, ��-�� ���� �� �� (Process Hierarchy)� ���� ��. �� fork()� ��� �� ��� ��� ����� ���� ��� ��� ������� ��� ��� ����.
    3. Copy-on-Write (COW) ���� ��: BSD (Berkeley Software Distribution)�� fork() �� � ��� ��� �����, �� ��� ��� �� ��� ��� ���� COW ��� ���� fork()� ��� ����� ����.
    4. ���� clone() ��� �: ������ fork()� ��� � ���� ���� �� clone() ��� �� �����, ��� ��(���, ��, ��� ��� �)� ��� ��� ��� � �� �� ��� ��� ���� ��� ��� ������ ����.

fork()� exec()� ���� ��� ����� ���� �� ��� �����, ��-�� �� �� �� ��� ��� �� ��� ����� ��� � ��.

  
                fork() + exec() ���� �� ��                      
  
                                                                        
    [1] �� ��                                                       
                                                
        �� ����                                                 
      PID: 1000                                                       
      ���: � ����                                             
      FD: stdin,stdout,...                                            
                                                
                                                                        
    [2] fork() �� �                                                  
                        
        �� ����               �� ����                   
      PID: 1000                  PID: 1001 (��)                   
      fork() ��� = 1001       fork() ��� = 0                  
      ���: � (��)          ���: � (���)                
      PPID: 500                  PPID: 1000                         
                        
                                                                      
                  �� �� ��                                      
              �� ��                                 
                                                                        
    [3] exec("ls") �� � (���)                                     
                        
        �� ����               �� ����                   
      PID: 1000                  PID: 1001                          
      wait() �� �             ���: ls ����                
      ���: � (����)      (� ��� �� ��)              
                        
                                                                        
    [4] �� �� �                                                    
                                                
        �� ����                                                 
      PID: 1000                                                       
      wait() ��                                                     
      ���: � (���)                                             
      �� �� �� ��                                             
                                                
  

[����� ��] fork()� ���� ���� �� (Kernel)� �� ����� PCB (Process Control Block)� ���� ��� PCB� ����, ��� PID� ���� �� ����� ����. �� ��� �� ��(��, ���, �, ��), �� �� ����� (File Descriptor), �� ��, �� �� ���� �� ���� ����. �� ���� fork()� �����, ����� ��� PID� ���� ����� 0� �����, ��� �� ���� if-else ��� �� �� ��� ��� � ��. �� ��� exec()� ���� ��� �� �� ��� ��� ����� ��� ���� ��� ����, ��� wait()� �� ��� ��� ����.

  • � �� �� ��: �� ���(fork)� � ��� ��� ��� �, � �� �� ��� ��(exec)� ��� �� ��� ��� ����(wait) ��� �� ���� ���� ��� ���� ���� ����.

. ���� � �� �� (Deep Dive)

�� ��

������� ���� ����
fork() ��� ��� ����� �� ��PCB ��, PID ��, �� �� �� (COW �� � �� ��)�� �� (Kernel Mode) ��, ��� ��� (Page Table) ���� ���
exec() ��� ��� ����� ���� ���� �� �� ��, ELF (Executable and Linkable Format) �� ��, � �� ����� �� (Memory Mapping), �� �� (Dynamic Linker) ���� �� � �� ��
wait()/waitpid()�� �� �� � �� ����� �� ��(Zombie)� ��� ��� ��, �� ��, ��� �� ���� ���� (Zombie Process) ��, PCB ���� �� ��
PID (Process ID)����� �� ����� PID ��� (PID Allocator)� ����� ��, ��� (PID_MAX)� ���� ��/proc �� ���, kill ���������
PPID (Parent Process ID)��-�� �� ��fork() � ��� PPID� ��� PID� ��, �� �� � init ����� ������� �� (Process Tree) ��, pstree ����������

fork()� �� �� ��

fork() ��� �� ���� ���� ��� �� ��� ��� ����. �� ��� PCB� ���� ��� PCB ��� ��� �, ��� PID� ����. ��� ��� ��� ��� (Page Table)� ���� � �� ���� �� ��� (Reference Count)� �����. COW (Copy-on-Write)� ���� ��, �� �� ��� ��� ���� �� ��� ��� ��� (Page Table Entry)� �� �� (Read-Only) ���� ����. ����� �� ����� ���, ��� ��� (Signal Handler) ��, umask � �� ����, ���� ��� (Context Switching)� �� �� ������ ���� ���.

fork()� ���� ���� ��� ��� ��� ��� ��� ������ �� �� ��� �����, �� ��� ��� COW ��� ��� ��� ��� ��� � ��.


  
             fork() ��� ��/�� �� �� ��                      
  
                                                                         
    �� ���� (PID 1000)          �� ���� (PID 1001)           
                               
      �� �� ��                 �� �� ��                  
      0x400000  Code              0x400000  Code                   
      0x600000  Data              0x600000  Data                   
      0x...     Heap              0x...     Heap                   
      0x7fff..  Stack             0x7fff..  Stack                  
                               
               ��� ���                  ��� ���            
                                                                       
                      
                  �� ��� (Physical Memory / 물리 메모리)                        
                                                                       
                                   
       Code Pg    Data Pg    Heap Pg   ...                       
       (RO) R/O   (R/O)R/O   (R/O)R/O                            
       ref=2      ref=2      ref=2                               
                                   
                                                                    
                                            
               ��� ��� �� �� ��� ��                     
               COW ��� = �� �� (R/O)                            
                                                                       
      �� �� � -> ��� ��(Page Fault)                          
                 -> �� ��� �� -> �� ��                      
                      
                                                                         
    ��� ��:                                                         
      ��: fork() == 1001 (��� PID)                                  
      ��: fork() == 0    (��� ���� ��)                        
  

[����� ��] fork() �� ��� ��� �� �� �� �� ��� ����, COW ���� ���� ��� ���� ���� ��� �� ���� ����� ����. � �� ���� �� ��� (Reference Count)� 2� ���� � ����� ���� ��� ����, �� ���� �� ��� �� �� (Read-Only)�� ����. �� �� ����� �� ��� ���� ���� ��� �� (Page Fault)� ����, ��� ��� �� ��� (Page Fault Handler)� �� ���� �� ���� ����� ��� � ���� �� ��� ����. �� �� ���� 1� ���� �� ���� �� ����� ��� ��. � ���� ��� fork() ��� exec()� �� ���� ���� � ����� ���� ���� ��� ���� �� ���� ��� �� ����.


exec() �� ��� �� ��

exec()� �� ��� �� ��� execl(), execv(), execle(), execve(), execlp(), execvp() � �� �� ��� ���� �����. �� ��� �� execve() ��� �� ���� ����, ��� �� �� ����� �� ��� ��� �� ��� �� (��, ���, �, ��)� ����. � �� ELF (Executable and Linkable Format) ��� ���� � ����� �� ���� (Text Segment)� ��� ���� (Data Segment)� �� ���� ����, �� �� (Dynamic Linker, ld-linux.so)� �� �� ����� (Shared Library) ���� ����. ����� ��� �� (Stack)� ���� �� (Argument)� �� �� (Environment Variable)� ����, ���� ��� (Entry Point, �� _start)�� ���� ��� ����. ��� �� exec() �� � PID� ���� ���� ���. ����� ��� PID� ��� � ��� ��� ����.

  • � �� �� ��: fork()� "�� ��� ��� ����� ��"���, exec()� "��� �� ���� ��� ���� ��"��, � ��� ���� �� ����� �� �� ��� ������.

. �� �� � ��� ��

�� 1: fork() vs spawn() (���� �� �� ��)

�� ��fork() (��� ��)spawn() / CreateProcess() (��� ��)
�� ����� �� �� � exec()� ��� ����� ���� �� ��
API ��fork() + exec() � ��CreateProcess() �� ��
��� ��COW ���� ��� (�� �� ��� ��)�� � ��� ��
�� ���� �����, ��� ���, umask � �� ������� ��� ��� ��
IPC ��fork() �� ��� (Pipe)� ���� �� ������ �� �� �� ��
�� OSLinux, macOS, BSD � POSIX (Portable Operating System Interface) ��Windows

fork()� ������ ����� (Redirection)� ����� �����. �� ls | grep foo� ��� �, fork()� � �� ��� ��� ���� � �� � ��� �� ���� ��� � exec()� �� ls� grep� ����, ��� ��� �� ������ �� ����� ���� IPC (Inter-Process Communication) �� �� ������ ����. �� ���� spawn/CreateProcess ��� ����� ��� ����� ���� ��� ��� � �����, ���� ��� ��� � ��� ��� ��.

fork()� spawn() ��� ��� ����� ��� ��� ������ �����, � ��� �� ����� �� ����� ��� ��� ��� � ��.

  
       fork() �� vs spawn() �� -- ����� �� ��                 
  
                                                                           
    [fork() �� -- "ls | grep foo" ��]                                  
                                                                           
    �(PID:1000)                                                           
                                                
     pipe(fds) -> fds[0], fds[1] ��                                     
                                                                         
      fork() -- ��1(PID:1001)                                           
        close(fds[0]), dup2(fds[1], STDOUT)                               
        exec("ls")  -> ls ��� fds[1]�                                 
                                                                         
      fork() -- ��2(PID:1002)                                           
        close(fds[1]), dup2(fds[0], STDIN)                                
        exec("grep foo")  -> grep� fds[0]�� ��                       
                                                                         
      close(fds[0]), close(fds[1])  -> ��� ��� ��                 
      wait() x 2  -> � �� �� ��                                    
                                                
       fds ��� fork()� �� �� ���                                
                                                                           
    --------------------------------------------------------               
                                                                           
    [spawn/CreateProcess ��]                                             
                                                                           
    �� ����                                                          
                                                
     1. ��� ��                                                      
     2. CreateProcess("ls",                                              
          hStdOutput=�����) <- ��� ��                        
     3. CreateProcess("grep",                                            
          hStdInput=�����)  <- ��� ��                        
     4. � ���� �� ��                                            
                                                
       �� ��� ����� ���� �                                  
                                                                           
    �� ��:                                                             
                   
         ��           fork() ��           spawn() ��             
                   
     �� ��         �� FD �� ��       ��� ��             
     ���            ���� FD �� ��   �� �� ��          
     ��� �� ��   fork � ��� ��     �� �� ��         
     ��� ����    COW� ���            �� � ��           
                   
  

[����� ��] fork() ����� ��� pipe()� ���� ��� � fork()� ����, �� ����� ��� �� ����� ���� ��� �����. ��� ��� dup2()� �� ���� ���� � �� ���� exec()� � ����� ����, � ����� ��� ���� ���� ��� ��� ���� �� � ���� stdin/stdout� ���� ��. �� spawn/CreateProcess ����� STARTUPINFO ���� �� �� ���� �� ����� �� ��� ���� ���� ���� ��. fork() ��� ��� ����� ����� ��� ���, ��� ���� � �� �� ������ ���� ��� ��� ��. spawn() ��� � ��� �� ��� � ��� �� ��� � �����.

�� 2: exec() �� �� ��

����� �� ���� ���� ���� �����
execl()�� �� ��� (List)���� � ���
execv()�� �� (Vector)���� � ���
execve()�� ����� ���� � ���
execlp()�� �� �����PATH ����
execvp()�� ����PATH ����
fexecve()�� �������� ���� � ���

���� ��� ��� ���� �� ��� �� ��� � ��. 'l'� ���(List) ��� �� ��� ����, 'v'� ��(Vector, ��) ��� ����. 'p'� ��� PATH �� ���� �� ��� ����, 'e'� ��� �� ��� �� ��� � ��. �� ��� �� execve() �����, ���� glibc (GNU C Library) �� (Wrapper) ���.

�� �� ��

  • ��� �� (Computer Architecture): fork() � ��� ��� ��� TLB (Translation Lookaside Buffer) ��� (Flush)� �� ���� ����, COW� �� ��� �� ��� MMU (Memory Management Unit)� ���� ��� �����. � ��� ��� ����� TLB �� �� ��� �� �� ��� �� ����.

  • ��� ���� (Computer Network): � ��� ����� ���� fork()� �� ����� ���� prefork ��(Apache MPM Prefork)� �� ��� ���� ����, �� �� �� ���� ����� ��� ����� ��� ��. �� ��� �� ��(Nginx� epoll)� ��� � (Thread Pool) ��� ���� ��� ���.

  • � �� �� ��: fork()� ��� �� �� ���� ���� exec()� ��� ��� �� ���� ��� ���, � �� �� �� ����� ��� �� �� ���� �����.


. �� �� � ���� ��

�� ����

  1. ���� -- ��� � ��� ���� �� ��: �� �� �� ��� ���� � ���� � ���� fork()+exec()� ����, ��� � (System Call) ����� ��� ��� �� ��� ���� �� ��� ��� ����. ����� prefork ��(�� �� ��� ����� ��� ��)�� �����, ��� � (Thread Pool) ��� ��� ��� (Event-Driven) ����� �������� ��.

  2. ���� -- fork() � �� ����� �� �� ���: fork()� ��� �� �� �� ������ ���� ���� ��� ����, �� ����� ��� ��� ��(������ ���, �� ��, �� �)� ��� � ��. �� Set-UID (Set User ID) ������ fork()+exec()� ��� �, ��� ���� �� ������ �� �� ��� �����, fork() �� ���� �� ������ close()�� FD_CLOEXEC ���� ���� �� ��� �����.

  3. ���� -- ���� ����� clone() ��: �� (Docker)� �� ���� ���� ���� clone() ��� �� ���� ��� ������ (Namespace, CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWNET �)� cgroup (Control Group)� ��� ����� ����. �� fork()� ��� ���� ���� �� ��� ���� ���, �� �� (Virtual Machine)�� ��� ��� ����.

���� �� ��� ��� ��� ��� ��� ��� ��� ���� ���� ����, ��� �� ��� ���� �� ��� ����� ��� � ��.

  
             ���� �� �� ���� ���                           
  
                                                                          
     [� ���� ��� ����?]                                       
                  |                                                       
                  V                                                       
     POSIX ��(���/���)��?                                       
       +-- � -- fork()+exec() ��                                       
       |           |                                                      
       |           V                                                      
       |     ��� �� ��� �����?                               
       |       +-- � -- prefork / ��� � / ��� ��� ��         
       |       |                     |                                    
       |       |                     +-> ��� ��� ��               
       |       +-- ��� -- fork()+exec() �� ��                      
       |                          |                                       
       |                          +-> CLOEXEC ��� �� ��            
       |                                                                  
       +-- ��� (��� ��)                                           
                  |                                                       
                  V                                                       
            CreateProcess() ��                                          
                  |                                                       
                  +-> �� �� ��� ��� ��                        
                                                                          
     [���� ��� ����?]                                          
       +-- � -- clone() + Namespace + cgroup (����)                  
       +-- ��� -- fork() �� ��� ��                              
                                                                          
     �� ��:                                                           
     "���� ��� �����, �� ��� ����"                   
  

[����� ��] ���� �� ��� ��� "�� ��� ����"� "��� �� �����"�� � �� �� ����. ���� ��� ����� fork()+exec()� ������, ��� �� ����� � ���� fork()�� �� �� ��� ��. � �� �� ����� ����� prefork ����, � ��� ��� �� ��� �� ��� I/O� ���� �� �����. �� ����� fork()� �� ��� ����� �� ����� �� ��� �����, O_CLOEXEC ���� ���� exec() � ���� ���� ���� �� �����. ���� ����� clone()� ��� ��� ��� �� �� ��� ���� �� ���� �����.

�� �����

  • ���: fork() � ���� �� ������ �� close()���? ��� ���� prefork/��� �� fork() ��� ���� ���?
  • �� ���: FD_CLOEXEC ���� ��� �� ������ ���� ���? Set-UID ������ fork()+exec() � �� �� ��� ������?

����

  • fork �� (Fork Bomb): �� ����� fork()� ���� ���� �� ���� ���� ����� ��. ulimit (User Limit)�� ���� � ��� ���� ���� ��.

  • exec() � ��� �� �� ��: exec()� �� ��� �����, �� ��� ��(�� ��, ��� ���, �� �� �)� ��� ����. exec() �� ���� ���� ����� ���� ��� � ����� ��� �� ��� ����.

  • � �� �� ��: fork ��� �� ��� �� �� ��� � ��� ���� ���� �� ����, ulimit��� �� ���� ���� ���� ��� ���� ��� ���� ���.


. ���� � ��

��/�� ����

����� ���� ��� ��
����� fork()+exec() (prefork ��)prefork + worker pool��� �� �� 100~1000� ��
��fork() � �� ��� �� ��COW (Copy-on-Write) ��fork() �� �� 90% �� ��, ��� ��� ��
���� ����� �� ���O_CLOEXEC ��� ���� ��� �� ��, �� ��

�� ��

  • clone3()� rclone (Remote Clone): ��� �� ����� clone3() ��� �� �� � ��� ���� �� ��� ����, �� �� ����� ���� ��� ����� �� �� ���� ��� ���� ��.
  • �� ��� �� fork() �� ��: fork()� �� �� ��� �� ���� �����, posix_spawn()� �� �� ��� ����� ���� API� �� �� ���� ��.

�� ��

  • POSIX.1 (IEEE 1003.1): fork(), exec(), wait()� �� ����� ��
  • SUSv4 (Single UNIX Specification v4): exec �� ��� �� �� ��
  • ELF (Executable and Linkable Format): exec()� ���� �� �� �� �� (TIS Committee)

���� �� ��� �� ��� ����� ����, �� ���� ����� ���� ���� ���� ��� ��� � ��.


  
                ���� �� �� �� ���                            
  
                                                                          
    1970          1980              2000             2020+                
     |              |                |                 |                  
     V              V                V                 V                  
    [fork+exec / fork+exec] -> [fork+COW / fork+COW]  -> [posix_spawn / posix_spawn] -> [clone3+NS / clone3+NS]            
     |              |                |                 |                  
     |              |                +-> �� �� ���  |              
     |              +-> ��� �� ���                   |            
     +-> �� ���� �� �� ��                                     
                                                                          
    �� ��:                                                            
    "�� ��" -> "��� ��" -> "�� ��" -> "�� ��"            
  

[����� ��] 1970�� ��� ��� fork()+exec()� ���� �� ��� ���� ��� ������, �� ��� ��� ���� ���� ����. 1980�� BSD�� ��� COW ���� � ��� ���� ���� ��� ���� ��� �����. 2000���� �� �� ��� �� posix_spawn()� �� �� ��� ����� ���� API� ������, 2020���� ���� clone3()� ������ (Namespace) ��� ���� ���� ��� ��� ���� ��� ���� ��. � ��� �� ��� "� �� ���� � ���� ��"�� ���, �� ��� ��� ��� ���� ���� �� ��� ��� ����.

  • � �� �� ��: ���� �� ��� �� �� ��� ��� ���, ���� �� ��� ��� �� �� ��� ��� ����� ����, ��� ��� �� ��� ��� ���� ������.

� �� �� � (Knowledge Graph)

�� ���� � ��� ��
Copy-on-Write (COW)fork()� ��� �� ����� ����� �� ��� ����, �� ��� ��� �� �� ���� ����.
PID (Process ID)fork() � ����� ���� ���� �� ����, ���� ��� � ��� ���� �� � ��� ��.
PPID (Parent Process ID)���� � ��-�� ��� ���� ����, �� �� � ��� ���(adopt) ��� ����.
���� �� (Process Tree)fork()� �� ��� ���� ��� ���� ���, init (PID 1)� ��� �� �� ��� ���.
clone() ��� ������ fork()� ��� ��� ��� ��, ��� ��� ��� ��� ���� ���� ���� ��� ��� ��.
exec() ��� �fork()� ��� �� ����� �� ��� � ������ �� ����, �� ��� ���� �� �� ��� ���.
��� (Pipe)fork()� �� ����� �� �� ��� ���� ���� � ��� ��� ���� IPC ����.

� ���� �� 3� �� ��

  1. fork()� ��� ����, � ��� ��� ��(�� ����)� ����� �����. ��� �� ���� �� ��� ���(PID)� ���.
  2. exec()� ��� �� ���� ��� �� ���� ���� �����. ��� ��(��)� ��� ��, ��� ��� ����� ���� ��.
  3. �� ���� ��� ��� � ��+�� ��� �� ���, ��� �� ����� ��� ���� ��� � ����!