콘텐츠로 바로가기

Process & Concurrency Mechanics

프로그램의 실행 단위인 프로세스와 스레드의 생명주기, 그리고 멀티코어 환경에서의 효율적인 동시성 제어 기술을 다루는 학습 노드입니다.

Article
M

Me

hyunyoun's Blog

operating-systems-system-mechanicsoperating-systemssystem-mechanicsprocessconcurrency-mechanicsos-processconcurrencylearning9 min read

1. Overview

프로세스 및 동시성 메카니즘(Process & Concurrency Mechanics, PCM)은 디스크에 저장된 정적인 프로그램 코드가 운영체제에 의해 메모리에 올라와 CPU를 할당받고 자원을 사용하는 실행 객체(프로세스/스레드)가 되는 과정과 그 제어 원리를 다룹니다.

과거의 싱글 코어 시스템부터 현대의 매니코어(Many-core) 서버 환경에 이르기까지, 운영체제는 시분할(Time-sharing)과 문맥 교환(Context Switch)을 통해 수십에서 수천 개의 프로세스가 동시에 실행되는 것처럼 보이게 합니다. 학습자는 프로세스 제어 블록(PCB)과 스레드 제어 블록(TCB)에 저장되는 메타데이터 구조를 이해하고, 다수의 실행 흐름이 메모리를 공유할 때 발생하는 경쟁 상태(Race Condition)와 교착 상태(Deadlock)를 막기 위한 동기화(Synchronization) 기법을 익힙니다. 이를 통해 병렬 코드를 작성하는 수준을 넘어, 하드웨어 아키텍처 위에서 안전하고 확장 가능한 멀티스레딩 시스템을 설계하는 관점을 기릅니다.

2. Scope & Boundaries

In-Scope

  • 실행 주체 객체 (Unit of Execution): 프로세스(자원 소유의 단위)와 스레드(실행 스케줄링의 단위)의 구조적 차이, LWP(Light Weight Process), 파이버(Fiber) 및 코루틴(Coroutine).
  • 프로세스 생명주기와 스케줄링: 생성, 대기, 실행, 종료로 이어지는 상태 전이 다이어그램, PCB 구조, 라운드 로빈(RR) 및 완전 공평 스케줄러(CFS).
  • 동시성 통제와 동기화 (Concurrency Control): 임계 구역(Critical Section), 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor), 스핀락(Spinlock) 구현 원리와 조건 변수(Condition Variable).
  • 교착 상태와 성능 분석 (Deadlock & Scalability): 데드락의 4요소 및 회피(Banker's) 알고리즘, 락 경합(Lock Contention), 락-프리(Lock-free) 자료구조 원리.
  • 프로세스 간 통신 (IPC): 파이프(Pipe), 메시지 큐, 공유 메모리(Shared Memory), 시그널(Signal)의 물리적 전달 계층.

Out-of-Scope

  • 특정 언어의 고수준 비동기 라이브러리 문법: Java의 CompletableFuture, JavaScript의 async/await, Go의 Channel 문법 자체에 대한 코딩 학습 → 05. Programming Languages 영역으로 위임.
  • 분산 서버 간의 네트워크 통신: 소켓 프로그래밍을 응용한 원격 프로시저 호출(RPC), 분산 락(Distributed Lock, e.g., Redis/Zookeeper) → 07. System Architecture 영역으로 위임.
  • 하드웨어 수준의 캐시 코히런시 회로 설계: MESI 프로토콜의 논리 게이트 구현이나 칩 내부 버스 스누핑 회로 설계 → 02-03. Parallel Mechanics (PMM) 영역으로 위임.

Boundaries

  • PCM vs. Scheduling Strategy: PCM은 '프로세스와 스레드라는 객체가 메모리와 레지스터에서 물리적으로 어떻게 구성되고 교체(Context Switch)되며 서로 자원을 놓고 충돌하는지'라는 하단 메커니즘을 주로 다룹니다. 어떤 스레드를 다음에 실행할 것인가 하는 정책적 알고리즘(CFS 등)은 이 메커니즘 위에서 작동하는 상위 의사결정입니다.

3. Counterexample

  • 동기화 비용을 무시한 무작정 스레드 생성 (Thread Explosion): 빠른 연산을 위해 루프를 돌 때마다 pthread_create를 천 개씩 호출하는 코드를 짜면서 "이게 병렬 컴퓨팅"이라고 착각하면 안 됩니다. 스레드가 하나 생성될 때마다 커널 스택(Kernel Stack)과 유저 스택이 각각 할당되며 메모리를 사용합니다. 코어 수보다 스레드가 지나치게 많으면 문맥 교환(Context Switch) 오버헤드가 커져 전체 시스템 처리량(Throughput)이 떨어지는 쓰레싱(Thrashing)을 정량적으로 확인해야 합니다.
  • Data Race의 눈가림 해결: 멀티스레드 코드에서 가끔 결과가 틀리게 나올 때, 단순히 sleep(1) 같은 함수를 끼워 넣어 "대충 해결했다"고 넘어가면 원인이 사라지지 않습니다. 하드웨어 메모리 배리어(Memory Barrier) 부재와 캐시 불일치로 인해 발생하는 **경쟁 상태(Race Condition)**를 뮤텍스/세마포어 혹은 Atomic 변수로 명확히 제어할 수 있어야 합니다.

4. Prerequisites

  • 커널 및 시스템 인터페이스 물리 (Basic): fork()pthread_create()가 사용자 공간에서 불렸을 때 커널 공간에서 시스템 콜을 통해 객체가 생성되는 원리를 파악해야 합니다. (03-01. KSIP)
  • 컴퓨터 아키텍처 및 PMM (Recommended): 동기화를 이해하기 위해 원자적 하드웨어 명령어(Compare-And-Swap, TAS) 동작의 기본 개념이 요구됩니다. (02-03. PMM)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Entities of Execution 프로세스와 스레드의 본질적 차이를 분해하고, PCB/TCB 및 상태 전이 라이프사이클을 매핑합니다. P1/Processes
2 Concurrency & Mutual Exclusion 다중 스레드가 메모리를 공유할 때 데이터 손상을 막는 임계 구역(Critical Section) 보호 로직을 익힙니다. P1/Concurrency
3 Deadlocks & Advanced Sync 데드락 상태를 방어/회피하고, 락 경합을 줄이기 위한 세밀한 락(Fine-grained)과 락프리 구조를 연구합니다. P1/Concurrency
4 Inter-Process Communication 보안상 분리된 프로세스 주소 공간 사이에서 데이터를 주고받는 IPC 메커니즘을 이해합니다. P2 Eng

6. Learning Topics

Basic

Core Topic 01: 프로세스와 스레드의 해부학 (Entities of Execution)

  • Why to Learn: 프로그램 실행의 최소 단위를 물리 메모리와 레지스터 관점에서 이해하고, 태스크의 성격(I/O 바운드 vs CPU 바운드)에 맞춰 적절한 추상화 단위(프로세스/스레드)를 선택하기 위함입니다.
  • What to Learn:
    • Concepts: 프로세스(자원의 소유자) vs 스레드(실행 단위), 상태 전이 다이어그램(New, Ready, Running, Waiting, Terminated).
    • Skills: PCB(Process Control Block) 및 TCB 구조 분석, 좀비(Zombie) 및 고아(Orphan) 프로세스의 생성 원리와 수거(Reap) 기법.
    • Tools: 리눅스 프로세스 트리 명령(pstree, top, /proc 파일 시스템).
    • Trade-offs: 메모리 격리 덕분에 한 프로세스가 종료되어도 다른 프로세스가 영향을 덜 받는 멀티 프로세스 아키텍처(Chrome 브라우저 탭) vs 메모리를 공유하여 통신이 빠르지만 한 스레드의 오류가 전체 프로세스에 영향을 줄 수 있는 멀티 스레드 구조 간의 아키텍처 선택.
  • How to Learn:
    • 1단계: C 언어로 fork() 시스템 콜을 호출했을 때, 부모와 자식 프로세스가 각각 동일한 코드 위치에서 어떻게 다른 반환 값(Return Value)을 가지고 실행의 갈래를 나누는지 시각적 트리를 그립니다.
    • 2단계: 문맥 교환(Context Switch)이 일어날 때, CPU의 모든 범용 레지스터, PC, SP 상태가 현재의 PCB에 백업되고 새로운 프로세스의 PCB가 CPU에 로드되는 오버헤드를 CPU 클록 사이클 관점에서 파악합니다.
  • Implement: 부모가 여러 개의 자식 워커(Worker) 프로세스를 fork()로 생성하고, 각자의 연산이 끝날 때까지 wait()로 대기하며 좀비 프로세스를 방지하는 기초적인 맵리듀스(MapReduce) 형태의 골격 작성.

Core Topic 02: 동시성 통제와 상호 배제 물리 (Concurrency & Mutual Exclusion)

  • Why to Learn: 현대 멀티코어 환경에서 다중 스레드가 동일한 메모리(전역 변수, 힙)에 동시에 접근할 때 발생하는 데이터 오염(Race Condition)을 막기 위해서입니다.
  • What to Learn:
    • Concepts: 경쟁 상태(Race Condition), 임계 구역(Critical Section), 상호 배제(Mutual Exclusion), 뮤텍스(Mutex)와 세마포어(Semaphore).
    • Skills: 피터슨의 알고리즘(Peterson's Algorithm) 논리 한계 이해, TSL(Test-and-Set Lock) 및 CAS(Compare-and-Swap) 하드웨어 원자 명령어 작동 원리 분석.
    • Tools: 스레드 살균기(ThreadSanitizer, TSan), 다중 스레드 디버거.
    • Trade-offs: 하나의 글로벌 락으로 전체를 잠그는 거친 락(Coarse-grained Lock)은 구현이 단순하지만 성능 병목이 생기기 쉽습니다. 자료구조의 요소마다 락을 거는 세밀한 락(Fine-grained Lock)은 동시성을 높일 수 있지만 구현과 검증이 어렵습니다.
  • How to Learn:
    • 1단계: 10개의 스레드가 하나의 전역 카운터(count++)를 10만 번씩 올리는 코드를 락 없이 작성하고, 실행 결과가 왜 100만이 아니라 60만~80만 사이에서 랜덤하게 깨지는지 어셈블리(Load-Add-Store) 단위의 인터리빙(Interleaving) 과정으로 설명합니다.
    • 2단계: 생산자-소비자(Producer-Consumer) 문제에서 버퍼 오버플로우와 언더플로우를 막기 위해 Counting 세마포어를 어떻게 설계하는지 조건 변수(Condition Variable)와 함께 블록 다이어그램을 완성합니다.
  • Implement: 하드웨어 CAS 연산(__sync_val_compare_and_swap 등)만을 이용하여 스레드 대기 상태로 들어가지 않고 무한 루프를 도는 사용자 수준의 스핀락(Spinlock) 구조체 직접 개발 및 검증.

Practical

Core Topic 03: 프로세스 간 통신 아키텍처 (Inter-Process Communication, IPC)

  • Why to Learn: 보안과 안정성을 위해 메모리 주소가 격리(Sandboxed)된 별개의 프로세스들이 데이터를 안정적으로 주고받으며 협업할 수 있도록 시스템 내부 통신 경로를 이해하기 위해서입니다.
  • What to Learn:
    • Concepts: 익명 파이프(Anonymous Pipe), 지명 파이프(Named Pipe, FIFO), 메시지 큐(Message Queue), 공유 메모리(Shared Memory), 시그널(Signal).
    • Skills: 대용량 데이터를 처리하기 위한 mmap 메모리 맵핑 최적화, 비동기 이벤트를 소프트웨어적으로 처리하는 시그널 핸들러 셋업.
    • Tools: 리눅스 IPC 추적 명령어(ipcs, lsof), 벤치마크 툴.
    • Trade-offs: 공유 메모리는 커널 복사 비용을 줄여 전송 속도에 유리하지만 수동 동기화 락 제어가 필요합니다. 파이프나 메시지 큐는 커널 공간을 경유하는 오버헤드가 있지만 동기화와 흐름 제어를 커널이 맡아주는 장점이 있습니다.
  • How to Learn:
    • 1단계: 셸에서 ls -l | grep txt 명령어가 실행될 때 파이프(|)가 파일 디스크립터(STDOUT -> 파이프 버퍼 -> STDIN)를 통해 어떻게 프로세스들을 엮어주는지 도식화합니다.
    • 2단계: 1GB 크기의 데이터를 프로세스 간에 복사 방식으로 넘길 때(Pipe)와 가상 메모리 매핑 방식(Shared Memory)으로 넘길 때 소요되는 시간과 CPU 점유율을 벤치마크 비교합니다.
  • Implement: 공유 메모리(shmget, shmat) 영역에 다수 프로세스가 접근할 수 있는 환형 버퍼(Ring Buffer)를 생성하고, 프로세스 간 세마포어 배열을 배치하여 Lock-free에 가까운 고속 1 메시지 라우터 모듈 설계.

Advanced

Core Topic 04: 교착 상태 회피와 고급 락프리 설계 (Deadlocks & Scalable Concurrency)

  • Why to Learn: 수십 개의 코어를 지닌 데이터베이스 엔진이나 고성능 분산 백엔드 서버에서 데드락을 예방하고 스레드 경합(Contention) 병목을 줄여 병렬 처리량(Scalability)을 높이기 위해서입니다.
  • What to Learn:
    • Concepts: 교착 상태(Deadlock)의 4가지 필요 조건, 회피(Banker's Algorithm), 리드-카피-업데이트(RCU), 락-프리(Lock-free)/웨이트-프리(Wait-free) 구조.
    • Skills: 자원 할당 그래프(Resource Allocation Graph) 사이클 탐지 로직 구축, 메모리 재사용 문제인 ABA 결함 인지.
    • Tools: TLA+와 같은 형식 검증(Formal Verification) 도구, 프로파일러 병목 탐색.
    • Trade-offs: 데드락 가능성을 줄이기 위해 코딩 규약(항상 일정한 순서로만 락 획득)을 강제하면 안정성은 높아지지만 멀티스레드 비즈니스 로직의 유연성이 줄어듭니다. Lock-free 자료구조는 확장성에 유리하지만 구현 복잡도와 디버깅 비용이 큽니다.
  • How to Learn:
    • 1단계: 스레드 1이 A 락을 쥔 채 B 락을 기다리고, 스레드 2가 B 락을 쥔 채 A 락을 기다리는 상호 대기 시나리오를 만들고, 시스템 전체가 Deadlock에 빠져 멈추는 것을 gdb로 스레드 스택 트레이스를 분석해 확인합니다.
    • 2단계: 락 없이 오직 CAS 연산만으로 연결 리스트에 노드를 밀어넣는 락프리 큐(Lock-free Queue) 푸시 오퍼레이션에서 발생할 수 있는 ABA 문제의 물리적 한계를 증명합니다.
  • Implement: 데이터베이스의 트랜잭션 관리자를 모사하여 여러 프로세스가 다수의 자원을 임의 순서로 요청할 때, 자원 할당 전(Banker's Algorithm)에 안전 상태(Safe State)인지 판별하여 데드락을 회피(거부)하는 중앙 통제 시뮬레이터 로직.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core/misused/legacy)
Context Switch CPU 제어권을 한 프로세스에서 다른 프로세스로 넘길 때 레지스터 등 상태 정보를 교체하는 과정입니다. 기본 오버헤드 PCB / TCB Scheduling 자동 실행으로만 오해 P1:CS2023/Concurrency core
Race Condition 두 개 이상의 실행 단위가 공유 데이터에 동시 접근하여 최종 결과가 실행 순서에 의존하게 되는 불안정한 상태입니다. 기본 결함 분석 Mutual Exclusion Deadlock 단순히 '느림'으로 오해 P1:CS2023/Concurrency core
Deadlock 둘 이상의 프로세스가 서로 상대방이 가진 자원을 기다리며 무한히 대기하는 결착 상태입니다. 추천 결함 분석 Resource Graph Starvation 무한 루프와 혼동함 P1:CS2023/Concurrency core
Lock-free 특정 스레드가 일시 중지되더라도 시스템 전체의 작업은 중단 없이 진전됨을 보장하는 알고리즘 속성입니다. 심화 확장성 CAS / Atomics Wait-free 단순히 '락을 안 씀'으로 오해 Industry Sutter's guide core

8. References

Primary References

Secondary References

  • [Operating Systems: Internals and Design Principles] William Stallings — In-depth concurrency logic.
  • [The Art of Multiprocessor Programming] Maurice Herlihy — Advanced synchronization foundations.

Industry References

  • [POSIX Threads (Pthreads) Standard] — Industrial threading interface reference.
  • [Intel 64 and IA-32 Architectures Optimizer's Reference] — Hardware-level atomics guide.

9. Final Checklist

Primary Checklist

  • 프로세스 상태 전이 다이어그램을 그리고 각 상태가 커널 자원(Ready Queue, Wait Queue)과 어떻게 매핑되는지 설명할 수 있는가? (P1)
  • 데드락의 4가지 필요 조건을 식별하고 이를 예방하거나 회피하기 위한 전략을 제시할 수 있는가? (P1)

Secondary Checklist

  • 스레드 안전(Thread-safe)한 라이브러리를 설계하기 위해 고려해야 할 동시성 원자적 단위를 식별 가능한가?
  • 유저 스레드와 커널 스레드의 매핑 모델(M<1>, 1<1>, M)의 장단점을 물리적 비용 관점에서 이해하는가?

Industry Checklist

  • strace 또는 pstack을 사용하여 실행 중인 프로세스의 시스템 콜 지연이나 락 교착 지점을 추적할 수 있는가? (SFIA)
  • 대규모 동시 요청 환경에서 select, poll, epoll의 물리적 확장성 차이를 PCM 관점에서 설명 가능한가?

OS Process & Concurrency

2 / 6