Multi Thread: 베타제어

조승빈·2025년 2월 21일

Process와 Thread의 차이점

Thread끼리는 메모리 공유가 되고 process끼리는 메모리 공유가 안된다

베타제어

Multi Thread 환경에서 하나의 Queue를 여러 Thread가 공유하는 것은 위험하며, 이를 방지하는 제어를 베타제어라고 한다.

왜 위험한가?

  1. 여러 Thread가 같은 Queue를 동시에 수정하면 데이터가 꼬일 수 있음.
  2. A와 B가 동시에 Queue의 맨 앞 데이터를 가져가려고 하면 둘 다 같은 데이터를 가져가게 됨.
    결국 하나의 데이터가 두 번 처리될 수 있음.
    이런 문제를 Race condition이라고 한다.

베타제어 방법

Concurrent (동시성 제어)

처음부터 수정이 불가능한 객체(Immutable Object) 를 만들어 동시성 문제를 방지.

동시에 실행되는 여러 개의 트랜잭션이 정상적으로 작동하도록 트랜잭션 실행 순서를 제어한다.

일반 클래스도 읽기(Read)Thread-safe한 경우가 있음.
쓰기(Write) 는 한 Thread에서만 하고, 읽기를 여러 Thread가 수행하면 유용함.

  1. Lock (잠금 기법)
    특정 코드 구간을 하나의 Thread만 실행하도록 제한.
    이를 Critical Section(임계 영역) 이라고도 함.
    하나의 Thread가 특정 코드를 실행하기 때문에, 코드의 실행 시간이 길어지면 성능 저하 발생.
    이를 개선하기 위해 One Process, One Thread Architecture가 등장함.

One Process, One Thread Architecture
하나의 프로세스가 하나의 스레드만 실행하는 아키텍처이다.
동시성 제어가 필요 없고, 각 프로세스가 독립적이라는 장점이 있다.
하지만 프로세스가 증가하여 메모리 사용량이 증가하고 프로세스간 통신(IPC) 이 필요하다는 단점이 있다.
따라서 MSA환경에서 사용하면 좋다.

  1. Lock-Free (잠금 없는 동기화)
    Lock을 사용하지 않고도 베타제어를 수행하는 방식.
    대표적인 기술:
  • Interlocked.increment()
  • Atomic Operation
  • Lock-free 알고리즘
  • Non-blocking 알고리즘
  • CAS (Compare-And-Swap)

Process 간 통신 (IPC, Inter-Process Communication)

프로세스는 메모리를 공유하지 않기 때문에 통신이 필요함.

멀티 프로세스를 사용하는 이유

서버 머신 한 대의 성능에는 한계가 있기 때문에 Scale-out(수평 확장) 이 필수적임.
하나의 Process를 여러 대의 서버에서 실행할 수 없기 때문에, 작은 기능 단위로 분리하는 것이 유리함.
따라서 One Process, One Thread Architecture가 설득력이 있음.

Process 간의 통신 방법

서로 다른 언어로 개발된 프로세스끼리 통신하기 위해 Google ProtobufApache Avro 같은 기술이 등장.
*.idl 파일을 정의하면 다양한 언어에서 사용할 수 있도록 변환 가능.

정리

profile
평범

0개의 댓글