
1. Linux 커널 관점에서의 Inclusion Heirarchy of Execution Units
session
└─ process group
└─ process
└─ thread (= task (=task_struct), kernel scheduling unit)
Linux 커널에서
- 스케줄링의 최소 단위(scheduling entity)는 thread(
task_structy) 이며 - process는 thread들의 컨테이너 역할을 하며, thread들의 집합이라고 볼 수 있음.
The scheduler schedules
tasks,
not processes.
참고로, thread는 light weight process (LWP) 라고도 불림.
주의할 점은 Multi-tasking 에서 나오는 task(OS관점에서의)와 커널 관점에서의 task는 다른 개념임:
OS 관점에서 말하는 task는 커널의 task(thread)보다는,
shell이 관리하는 job 개념(=process group)에 더 가깝다.
OS관점에서의 task는 다음을 참고:
각 execution unit에 대해 살펴보면 다음과 같음:
- 스케줄링 단위: thread(task)
- 자원 소유 단위: process
- 터미널 제어 단위: process group
- 로그인 단위: session
Session은
하나의 터미널을 중심으로 생성된 프로세스들을
동일한 실행 맥락(context)으로 묶어 관리하기 위한 커널의 실행 컨텍스트
일반적 의미의 session은 다음을 참고:
컴퓨터 과학과 네트워크 분야에서
세션(Session) 은
"사용자와 시스템(또는 서버) 간의 논리적인 연결 상태" 를 의미.
예를 들면, 사용자가 웹사이트에 접속해서 브라우저를 닫을 때까지 유지되는 하나의 '활동 단위'가 session임.
Context란, 커널이 실행 흐름을 구분하고 관리하기 위해 사용하는 논리적 실행 환경을 의미.
context 란?
Process Context, Thread Context, Execution Context, Runtime Context컴퓨터 과학에서 context 란 “코드가 실행되기 위해 필요한 상태 정보의 집합”을 의미함. 다만 context라는 용어는 사용되는 관점에 따라 가리키
ds31x.tistory.com
1-1 thread (커널 관점에서 task)
Linux 커널에서 스케줄링의 단위임.
- Linux 커널 내부 구조체로 구현됨:
task_struct - 커널은 process를 직접 스케줄링하지 않음
- 각 thread가 개별적으로 스케줄링됨
특징:
- thread마다 TID 존재
- 같은 process의 thread들은
- 주소 공간 공유
- 파일 디스크립터 공유
ps -L,/proc/<pid>/task/로 확인 가능
Linux에서 “thread = task”임.
OS관점인 Multi-task system에서의 task는
좀 더 넓은 개념(=job, process group)으로
Linux 커널 관점의 task와 구분됨.
1-2 process
Threads 의 그룹
- 하나 이상의 thread(task)를 포함하는 논리적 실행 단위
- PID = main thread의 TID
- 주소 공간과 자원(Resource)의 소유자
관계:
- single-thread process : task 1개
- multi-thread process : task 여러 개
리눅스 커널이 아닌 일반적인 관점에서의 Process와 Thread는 다음을참고:
1-3 process group
job control을 위한 묶음 (Session에서 job에 해당하며, OS관점에서의 task에 해당)
- 여러 process를 하나의 그룹으로 관리
- 같은 그룹은 하나의 PGID 공유
- 터미널 신호는 process group 단위로 전달됨
- 터미널 신호는 터미널에서 발생하는 Signal임 (커널의 TTY Layer 에서 이루어짐)
SIGINT: User Interrupt (Ctrl+c)SIGTSTP: Terminal SToP (Ctrl+z)
kill명령어로 Signal을 보낼 때는 Process 단위로 전달됨.- 물론 procss group으로도 가능.
- PGID는 음수로 표기함:
-1234는 PGID가1234임 (PID랑 구분하기 위해. kill -TERM -1234orkill -TERM -- -1234: PGID 1234 인 프로세스들에SIGTERM을 보냄(-TERM).--는 옵션이 끝났음을 의미함.
참고: signal과 kill에 대한 보다 자세한 내용은 다음을 참고:
2023.10.22 - [Linux] - [Linux] SIGNAL 에 대한 요약 정리.
[Linux] SIGNAL 에 대한 요약 정리.
SIGNAL이란??OS (LINUX 및 UNIX계열)에서의 SIGNAL은UNIX 또는 UNIX 계열 또는 POSIX 호환 OS에서제한된 형태의 Inter-Process Communication (IPC)와비동기 event처리를 위해 사용되는독립적인 비동기적 이벤트 처리 메
ds31x.tistory.com
2025.07.25 - [shell] - kill: Process에게 Signal을 보내기.
kill: Process에게 Signal을 보내기.
kill은 프로세스 종료와 시그널 전송에 사용되는 명령어임.0. kill 이란?kill은 리눅스/유닉스에서 process에게 시그널(signal) 을 보내는 명령어. 문제는 가장 흔한 사용 사례가 process를 종료시키는 용
ds31x.tistory.com
1-4 session
Session은
터미널 로그인과 그로부터 파생된 모든 실행 흐름을 묶는
커널 수준의 최상위 실행 컨텍스트.
- 터미널 로그인 단위의 최상위 컨테이너:
SID(Session ID)를 가짐. - 하나의 session은 여러 process group을 포함 (최소 한 개이상을 가짐)
- 터미널(TTY, TeleTYpe)은 session 단위로 귀속
- session에는 하나의 session leader가 존재: session leader 프로세스의 PID가 해당 session의 SID임
- foreground / background process group 관리 는 한 session에서 이루어짐:
- fg와 bg의 차이는 터미널 제어권이며 1개의 session이 1개의 터미널(tty)임.
- 즉, 동일 session이어야만 동일 tty를 가지며,
- 이에 대한 제어권 관리가 이루어지려면, process group들이 모두 동일 session에 속해야 함.
2. 현재 shell의 구조 확인 (session / process / thread)
2-1 shell의 session 정보
ps -o pid,ppid,pgid,sid,tty,cmd -p $$
-o: 출력할 columns 를 지정.-p: 출력할 process 를 지정 (PID로)$$: 현재 Shell의 PID 를 값으로 가지는 shell변수.
ps에 대한 보다 자세한 건 다음을 참고:
예:
PID PPID PGID SID TTY CMD
1234 1000 1234 1234 pts/0 bash
해석:
- shell이 session leader: PID과 SID가 같음.
- 자신만의 process group 소유
- 하나의 main thread(task)만 존재
2-2 shell의 thread 확인
ps -L -p $$
-L: 프로세스가 보유한 모든 thread(LWP)를 각각 한줄로 출력하라는 옵션.
PID LWP TTY STAT CMD
1234 1234 pts/0 Ss bash
- LWP(Light Weight Process) = thread(task)
- 즉, bash는 단일 thread process
3. thread가 여러 개인 process 를 확인해보기: top
기본 포함된 프로그램 top를 사용:
top &
&를 붙이면 background로 실행됨.
PID 확인 후:
ps -L -p <top의_PID>
이의 결과는 보통 다음과 같은 형태임.
PID LWP STAT CMD
2345 2345 S top
2345 2346 S top
2345 2347 S top
- 하나의 process
- 여러 thread(task)
- 커널은 이 thread들을 각각 스케줄링
job control 대상은
이 process가 속한 process group임
thread가 아닌 점에 주의!
참고: Job은 Foreground와 background로 나뉨:
- Foreground job은 터미널의 입력과 제어 신호를 직접 받아 실행 중인 process group을 의미.
- Foreground job은 터미널을 직접 점유하며, 표준 입출력이 모두 터미널에 연결
stdin(표준 입력)- 터미널 입력과 직접 연결
- 키보드 입력을 바로 읽을 수 있음
stdout(표준 출력)- 터미널 화면으로 출력
printf,echo결과가 즉시 보임
stderr(표준 오류)- 터미널 화면으로 출력
- 오류 메시지도 즉시 표시됨
- Background job은 터미널의 제어권을 갖지 않은 채, shell의 제어 하에 비동기로 실행되는 process group을 의미.
- Background job은 터미널 제어권을 가지지 않으며, 표준 입력은 제한되고 출력만 터미널로 전달
stdin(표준 입력)- 터미널 입력과 논리적으로 분리
- 읽으려고 하면 보통
SIGTTIN발생 => job 중지 - 사실상 입력 불가
stdout(표준 출력)- 기본적으로 터미널로 출력됨
- 단, 출력은 터미널을 점유하지 않음
stderr(표준 오류)- 기본적으로 터미널로 출력됨
- foreground job과 동일
터미널을 점유한다 = 해당 process group이 터미널의 foreground process group으로 설정.
다음이 가능한 process group임:
터미널 제어신호 수신.
터미널 설정 변경이 가능.
stdin, stdout, stderr 와 같은 표준 스트림에 대해서 좀 더 자세한 건 다음을 참고:
4. job control 실습 (process group 중심) : sleep 명령어
4-1 background job 생성
sleep은 지정한 시간(sec) 동안 현재 프로세스를 일시 정지(suspend)시키는 표준 유닉스 명령어
sleep 100 &
sleep 100을 새로운 process group으로 생성- 현재 shell을 점유하지 않는 background job으로 실행
출력은 다음과 같음: & 를 통해 백그라운드로 실해시킬 경우 job ID와 process ID를 보여줌.
[1] 3456
[1]: shell이 부여한 job 번호(job ID)- 현재 Shell(session) 안에서 job control을 위해 사용
fg %1,bg %1,kill %1처럼 참조 가능
3456: 백그라운드로 생성된 process group의 PID
4-2 job 목록 확인
jobs는 현재 shell이 생성하고 추적 중인 background / stopped job 목록을 출력하는 shell의 built-in command(내장명령어)
- job = process group
jobs
결과는 다음과 같은 형태로 나옴:
[1] Running sleep 100 &
jobs 명령어에 대한 자세한 건 다음을 참고:
4-3 process / group / session 구조 확인
ps -o pid,pgid,sid,tty,cmd | grep sleep
- 각 프로세스의 PID / PGID / SID / TTY / 명령어를 함께 출력
- 그중 sleep 프로세스만 확인
다음의 형태의 출력이 나옴:
3456 3456 1234 pts/0 sleep 100
같은 터미널에서 shell을 보면:
1234 1234 1234 pts/0 bash
sleep은- shell과 같은 session (SID로 3번째 열) :
1234 - 다른 process group (PGID로 2번째 열) :
3456
- shell과 같은 session (SID로 3번째 열) :
- 즉,
sleep은 shell과는 다른 독립적인 job(process group) 으로 실행
Interactive shell은 각 job을 실행할 때, foreground / background 여부와 무관하게 새로운 process group을 생성
참고로 shell을 ps로 살펴보면 여러 개가 보일 수 있는데 이는 subshell 이 만들어지기 때문임:
zsh 등은 subshell을 다음의 경우 subshell을 만드는데 각 subshell은 독립된 process group을 가짐.
1. pipe 사용시 : cmd1 | cmd2
2. commnad substition 사용시 : echo $(some_command)
3. 그룹 실행 : ( cd /tmp; ls )
5. Ctrl+z: process group 단위 중지
5-1 foreground 실행
sleep 100
sleep은 외부 명령어이므로 새로운 process로 실행됨- interactive shell은 이 명령을 위해 새로운 process group을 생성
- 해당 process group을 foreground process group으로 설정
- 그 결과, 터미널 입력과 Signal(
Ctrl+c,Ctrl+z)은 이 process group으로 전달됨
shell은 실행이 끝날 때까지 대기(block) 상태가 됨
5-2 중지
Ctrl + z
Ctrl+z는 터미널에서 발생한 입력 이벤트 임.- 터미널(TTY) 드라이버가
- 현재 foreground process group 전체를 대상으로
SIGTSTP신호(Terminal SToP)를 전송
- 커널은 해당 process group에 속한
- 모든 process들에
- 각 process의 모든 thread(task) 를 일괄 중지
다음의 결과가 출력된 경우:
[1] Stopped sleep 100
- Shell은 중지된 process group을
- 하나의 job으로 등록하고
[1]이라는 job 번호를 부여
- 이후 이 job은
jobs,fg,bg로 제어 가능
6. bg / fg로 상태 전환
6-1 background로 재개(Resume, SIGCONT)
bg # or bg %JOD_ID
Ctrl+z로 중지(stopped) 상태에 있는 job(process group) 을 선택하여 백그라운드 실행 상태로 전환- 해당 process group에
SIGCONT신호를 전송 - 해당 job은 background 상태로 계속 실행됨
- 터미널의 foreground process group은 여전히 shell
- background job에서 표준 입력(stdin)은 차단됨
- 단, 표준 출력(stdout)과 오류(stderr)는 터미널로 출력 가능
6-2 foreground 복귀
fg # or fg %JOD_ID
- 중지되었거나 background에 있던 job(process group) 을 선택
- 해당 process group에
SIGCONT신호를 전송 - 동시에, 해당 process group을 foreground process group으로 설정
- 터미널의 제어권이 shell => 해당 job으로 이동
- job이 종료되거나 다시 중지될 때까지
- shell은 대기(block) 상태가 됨
- stdin / stdout / stderr가 모두 터미널과 직접 연결됨
7. 파이프라인 + thread + job control
이 예제를 통해 파이프라인이
- process는 여러 개지만
- job control 대상은 하나의 process group임을
같은 TTY에서 실제로 확인할 수 있음
7-1 실행
sleep 100 | cat
A | B는 Shell이 두 개의 프로세스를 생성해 연결하는 Pipeline 실행.- 왼쪽 프로세스(
sleep)의 stdout(쓰기) => 파이프 - 오른쪽 프로세스(
cat)의 stdin(읽기) <= 파이프
- 왼쪽 프로세스(
- shell 은 이 파이프라인 전체를 하나의
job으로 취급해야 하므로,- 두 프로세스를 같은 process group(
PGID) 에 넣습니다.
- 두 프로세스를 같은 process group(
- 이는 foreground 실행이므로, shell은 이 process group을 foreground process group으로 설정
- 파이프라인이 끝날 때까지 shell은 대기.
즉, 파이프라인 은 여러 process 로 구성되지만 job control 대상은 하나의 PG(process group) 임.
pipe에 대해 보다 자세한 건 다음을 참고:
Ctrl+z 를 수행하고 다음의 명령어로 이를 확인할 수 있음:
ps -o pid,pgid,sid,tty,cmd | grep -E 'sleep|cat'
PID:sleep와cat은 서로 다른 PID 를 가짐 = 프로세스 2개PGID: 둘이 같은 PGID => process group 1개 (하나의 job )SID: 둘이 같은 SID => 같은 session(같은 터미널 로그인 흐름)TTY: 같은 pts/X => 같은 터미널에 속함.
7-2 Ctrl + z 가 파이프 라인 전체를 중지시킴
Ctrl+z를 누르면:
- 터미널(TTY)은 “현재 foreground로 지정된 process group”을 알고 있는 상태임.
Ctrl+z입력은 터미널 드라이버에 의해 foreground process group 전체에SIGTSTP로 전달.- 그 foreground process group에는
sleep와cat이 함께 들어있기 때문에 두 프로세스가 동시에 중지됨. - 각 프로세스는 중지되면서, 그 프로세스 내부의 모든 thread(task) 도 실행이 멈춘 상태가 됨.
Ctrl+z는 “프로세스 하나”가 아니라 “foreground process group”을 타겟으로 하므로 파이프라인 전체가 멈춤.
7-3 Job Control
중지된 뒤 jobs를 통해 job id 등을 확인:
jobs
출력은 다음과 같은 형태임:
[1] Stopped sleep 100 | cat
즉, shell 은 파이프라인 전체를 하나의 job([1]) 으로 관리
이때 fg, bg는 프로세스가 아니라 process group을 대상으로 동작.
멈춘 job을 재개하려면:
bg %1
이를 foreground로 가져오려면:
fg %1
같이보면 좋은 자료
2024.05.14 - [CE] - [CE] Process State (or Process Life Cycle)
[CE] Process State (or Process Life Cycle)
Process States (or Process Life Cycle)이는 프로세스가 가질 수 있는 상태를 가르키며, 프로세스의 life cycle을 보여준다. 프로세스는 프로그램이 실행되기 위해 메인메모리에 적재된 프로그램의 instance라
ds31x.tistory.com
'Linux' 카테고리의 다른 글
| openssh-server 설치하기 - Ubuntu (1) | 2026.01.10 |
|---|---|
| nvim에서 다른 app과 clipboard 같이 쓰기 (Linux의 xclip이용). (0) | 2026.01.09 |
| [zsh] zsh-vi-mode 설치 및 사용법 (0) | 2026.01.06 |
| WSL 배포판(distro) 백업 및 복원하기: export, import (1) | 2026.01.05 |
| WSL (WSL2 포함) 정리 (0) | 2026.01.05 |