
예:
$ pwd
→ pwd program이 실행되며 하나의 process가 생성됨
pid_t pid = fork();
실패 → -1 (parent)
성공:
0
task_structLinux kernel에서 process는 task로 관리됨
kernel은 circular doubly linked list (the task list) 로 모든 task를 관리
모든 process는 struct task_struct로 표현
정의 위치: <linux/sched.h>

task_truct 내부에:
parentchildren (list)sibling (형제 task)Linux에서 process 상태는 task->state로 표현됨

TASK_RUNNINGTASK_INTERRUPTIBLETASK_RUNNING으로 변경TASK_UNINTERRUPTIBLETASK_STOPPEDSIGSTOP 수신Kernel에서 process state 변경 함수:
set_current_state(state)set_task_state(task, state)Producer
Consumer

clone()은 어떤 자원을 공유할지 flag로 결정
Linux thread는 사실상 clone() + flags 조합

| CLONE_VM 설정 여부 | Memory Space 동작 |
|---|---|
| CLONE_VM = set | 호출한 process와 child process가 같은 memory space를 공유 |
| CLONE_VM = not set | child process가 clone() 호출 시점의 호출한 process memory space를 복사한 별도의 공간에서 실행 |
_do_fork() 핵심 역할

예:
CLONE_FILES set → files_struct 공유즉,

do_fork()가 호출될 때는 page frame(실제 memory 내용)는 복사하지 않고, page table만 복사

Parent든 Child든 처음으로 write를 시도하는 순간에만 그 page frame을 복사
👉 fork() 직후에는 memory를 안 복사하고,
👉 실제로 수정하려고 할 때 그 page만 복사

_do_fork()를 실행 중인 현재 task이다.copy_process()는 생성된 task의 task_struct 구조체를 반환한다.get_task_pid()의 두 번째 인자로 PIDTYPE_PID가 전달되면, 해당 task의 pid를 나타내는 pid 구조체를 반환한다.
새로 생성된 task를 run-queue에 넣는다.

files_struct
files_struct 구조체를 생성한다.files_struct 내용을 child의 것으로 복사한다.CLONE_FILES flag를 사용하면 복사하지 않고, 구조체를 공유하며 reference count를 증가시킨다.fs_struct
fs_struct 구조체를 생성한다.fs_struct 내용을 child의 것으로 복사한다.CLONE_FS flag를 사용하면 복사하지 않고, 구조체를 공유하며 reference count를 증가시킨다.sighand_struct
sighand_struct 구조체를 생성한다.sighand_struct 내용을 child의 것으로 복사한다.CLONE_SIGHAND flag를 사용하면 복사하지 않고, 구조체를 공유하며 reference count를 증가시킨다.signal_struct
signal_struct 구조체를 생성한다.signal_struct 내용을 child의 것으로 복사한다.CLONE_THREAD flag를 사용하면 복사하지 않고, 구조체를 공유한다.mm_struct
child를 위해 address space를 관리하는 mm_struct 구조체를 생성한다.
parent의 mm_struct 내용을 child의 것으로 복사한다.
CLONE_VM flag를 사용하면 복사하지 않고, 구조체를 공유하며 mm_struct의 mm_users 필드를 증가시킨다.
이건 한마디로 말하면
👉 fork() 할 때 Linux kernel이 각종 자원들을 “어떻게 복사하거나 공유하는지”를 코드 기준으로 설명한 슬라이드 묶음이야.
아래에서 주제별로 정리해서 설명할게.
process에게 보내는 비동기 이벤트
SIGINT (2) : interruptSIGKILL (9) : 강제 종료SIGALRM (14) : alarmSIGCHLD (20) : child 상태 변화 알림
Ctrl + C를 누르면 SIGINT 발생signal(SIGINT, handler)로 custom handler 등록exit()👉 signal은 process 제어 메커니즘임
copy_files() – 열린 파일 복사
parent의 files_struct를 복사
CLONE_FILES flag가 있으면:
👉 thread는 보통 open file을 공유함
files_struct → fdtable → file 구조 
files_struct : process 단위 open filesfdtable : fd 배열file : 실제 open file objectfile object 자체는 공유 (ref count 증가)copy_fs() – 파일 시스템 정보 
CLONE_FS 없으면:
CLONE_FS 있으면:
👉 같은 process의 thread들은 보통 cwd를 공유
copy_fs_struct() 내부
👉 directory path도 reference-counted resource
copy_sighand() – signal handler
기본:
CLONE_SIGHAND 있으면:
👉 thread들은 보통 signal handler 공유
fork()는 단순 복사가 아니다
자원별로:
kernel은: