�� ���� (3� ��)
- ��: ���� �� (Process Creation)� ������ ��� �� ��� ��� �� ������, ��� (Unix) ����� fork() ��� � (System Call)� �� �� ���� (Parent Process)� �� �� (Address Space)� ����, exec() ��� �� �� ���� (Child Process)� ���� ��� ������ ���� � ��� �����.
- ��: fork-exec ��� ��� �� ��� ������� ��� ���� ����� ��� � �� ��, � (Shell), � ��, ����� � �� ����� �� �� �� ����� ��� ��.
- ��: 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()� � �� �� ��� ��� ��(� ����)� ���� ����. ��(��)� ��� �� �� �� �� ��� ��� � ��.
-
�� �� � �� ��:
- �� ���� �� ���� ��: ��� ��� ������ � �� ��� ����� ��� � ���, � ����� ����� �� ����� ���� ��. �� ��� �� ���� ��� ��� ����.
- fork() ��� �� �� (1970��): � �� (Ken Thompson)� ��� �� (Dennis Ritchie)� �� ����� ��� ���� ���� fork()� ����, ��-�� ���� �� �� (Process Hierarchy)� ���� ��. �� fork()� ��� �� ��� ��� ����� ���� ��� ��� ������� ��� ��� ����.
- Copy-on-Write (COW) ���� ��: BSD (Berkeley Software Distribution)�� fork() �� � ��� ��� �����, �� ��� ��� �� ��� ��� ���� COW ��� ���� fork()� ��� ����� ����.
- ���� 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)� ���� �� �� | ���� �� �� �� �� |
| �� OS | Linux, 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()� ��� ��� �� ���� ��� ���, � �� �� �� ����� ��� �� �� ���� �����.
. �� �� � ���� ��
�� ����
-
���� -- ��� � ��� ���� �� ��: �� �� �� ��� ���� � ���� � ���� fork()+exec()� ����, ��� � (System Call) ����� ��� ��� �� ��� ���� �� ��� ��� ����. ����� prefork ��(�� �� ��� ����� ��� ��)�� �����, ��� � (Thread Pool) ��� ��� ��� (Event-Driven) ����� �������� ��.
-
���� -- fork() � �� ����� �� �� ���: fork()� ��� �� �� �� ������ ���� ���� ��� ����, �� ����� ��� ��� ��(������ ���, �� ��, �� �)� ��� � ��. �� Set-UID (Set User ID) ������ fork()+exec()� ��� �, ��� ���� �� ������ �� �� ��� �����, fork() �� ���� �� ������ close()�� FD_CLOEXEC ���� ���� �� ��� �����.
-
���� -- ���� ����� 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� �� ��
- fork()� ��� ����, � ��� ��� ��(�� ����)� ����� �����. ��� �� ���� �� ��� ���(PID)� ���.
- exec()� ��� �� ���� ��� �� ���� ���� �����. ��� ��(��)� ��� ��, ��� ��� ����� ���� ��.
- �� ���� ��� ��� � ��+�� ��� �� ���, ��� �� ����� ��� ���� ��� � ����!