sequenceDiagram
autonumber
%% ============== 레이어 구분 ==============
box rgb(232, 246, 254) 애플리케이션 영역(사용자 공간)
actor User as 사용자
participant Tm as 터미널 에뮬레이터(gnome-terminal 등)
participant Sh as 부모 쉘(PID=S)
participant Ch as 자식/프로그램(PID=C)
end
box rgb(241, 240, 255) 커널 영역(커널 공간)
participant SC as 시스템 콜 인터페이스(경계)
participant PT as 프로세스 테이블/PCB
participant DI as 디바이스 인터페이스(저장장치/콘솔/네트워크 추상)
end
box rgb(241, 255, 241) 하드웨어 영역(Hardware)
participant RAM as 메모리(RAM)
end
Note over Sh: 부모 쉘은 세션에 하나(세션 범위 싱글톤)
%% ============== 1) (입력 수신) 명령 입력 ==============
rect rgb(248,248,248)
Note over User,Sh: 쉘이 사용자 입력을 'read()'로 받는 경로
User ->> Tm: 키 입력
Tm ->> SC: (pty write) 사용자 키 입력 전달
Sh ->> SC: read(fd=0) %% 쉘이 표준입력 읽기
SC ->> DI: pty에서 데이터 읽기
DI -->> Sh: 입력 데이터(명령행) 전달
Sh -->> User: 프롬프트/에코(필요 시)
end
%% ============== 2) fork: 자식 생성 ==============
rect rgb(248,248,248)
Note over Sh,Ch: fork 단계(사용자→커널→사용자)
Sh ->> SC: fork()
SC ->> PT: 새 PID=C 생성, PCB 복제/등록
Note over SC,RAM: COW는 페이지 테이블 기반 공유(쓰기 전까지 같은 RAM 프레임 사용)
SC -->> Sh: 반환=자식 PID(C)
SC -->> Ch: 반환=0 (자식 컨텍스트 시작)
end
%% ============== 3) exec: 주소공간 교체 ==============
rect rgb(248,248,248)
Note over Ch,DI: exec 단계(자식이 새 프로그램으로 변신)
Ch ->> SC: execve("/bin/ls", argv, envp)
SC ->> DI: 실행파일/리소스 로드 요청
SC ->> RAM: 코드/데이터/스택 매핑(프레임 할당/연결)
SC -->> Ch: 사용자 모드 복귀(코드=/bin/ls)
end
%% ============== 4) 실행/입출력 (입력·메모리 수신 포함) ==============
rect rgb(248,248,248)
Note over Ch,Tm: 프로그램 실행 중 출력/입력/메모리 접근
%% 출력(표준출력)
Ch ->> Tm: 결과 출력(일반 경로)
opt 표준출력의 커널 경유(요약)
Ch ->> SC: write(fd=1, buf)
SC ->> DI: 콘솔/pty로 전달
end
%% 입력(표준입력) ― 프로그램이 정보를 '받는' 경로
User ->> Tm: 키 입력(프로그램 상호작용)
Tm ->> SC: (pty write) 입력 전송
Ch ->> SC: read(fd=0) %% 프로그램이 표준입력 읽기
SC ->> DI: pty에서 데이터 읽기
DI -->> Ch: 입력 데이터 전달
%% 메모리에서 정보 '받기' (직접 읽기)
Ch -->> RAM: 매핑된 메모리에서 직접 로드(힙/스택/전역/mmap) %% 시스템콜 없음
%% (옵션) 페이지 폴트가 발생한 경우
opt 아직 매핑되지 않은 페이지 접근(페이지 폴트)
Ch ->> SC: page fault trap(자동)
SC ->> DI: 백스토어에서 페이지 로드(파일/스왑 등)
SC ->> RAM: 프레임 할당·페이지 매핑
SC -->> Ch: 사용자 모드로 재개(다시 같은 명령 재시도)
end
end
%% ============== 5) 종료→좀비 ==============
rect rgb(248,248,248)
Note over Ch,PT: 실행 종료 후 좀비로 전환
Ch ->> SC: exit(status)
SC ->> RAM: 프로세스 메모리 해제(프레임 반환)
SC ->> PT: 상태=Zombie, 종료 코드 기록
SC ->> Sh: SIGCHLD 신호(자식 종료 알림)
end
%% ============== 6) wait로 회수 ==============
rect rgb(248,248,248)
Note over Sh,PT: 부모가 종료 상태를 수거
Sh ->> SC: wait()/waitpid(C)
SC ->> PT: 종료 자식 조회
SC -->> Sh: 종료 상태(리턴코드) 전달
SC ->> PT: PCB 제거(좀비 회수, 완전 소멸)
end
%% ============== 7) 프롬프트 복귀 ==============
Sh -->> User: 프롬프트 재표시(다음 명령 대기)