Process & Thread
스레드와 프로세스의 차이를 설명하고, 동시성 문제를 해결하기 위한 방법을 제시하세요.
프로세스: 운영체제에서 실행중인 프로그램의 인스턴스. 독립된 메모리 공간을 할당 받음. 메모리 공간은 코드, 데이터, 힙, 스택을 가지고 있고, 다른 프로세스와 공유하지 않음
스레드: 프로세스 내에서 실행되는 작업 단위로 프로세스의 메모리를 공유. 한 프로세스 내에 여러 스레드가 존재하며, 코드, 데이터, 힙 메모리를 공유하고 스택은 독립적으로 사용
동시성 문제: 여러 스레드가 동시에 작업을 진행하면서 발생하는 문제. 가시성과 원자성 문제로 나뉨
가시성 문제: 여러 스레드가 같은 변수를 공유할때 한 스레드에서 변경한 값이 메인 메모리에 저장되지 않고 스레드 캐시에 저장되어서 다른 스레드에 반영되지 않는 문제.
원자성 문제: 여러 스레드가 하나의 복합 작업을 동시에 수행할때 발생하는 문제.
가시성 문제 해결방법:
volatile 키워드를 사용: 변수의 값을 CPU 캐시 대신 메인 메모리에서 직접 읽고 쓰도록 보장.
원자성 문제 해결방법:
불변객체: 상태를 변경할 수 없기때문에 동시 접근에 안전. 단점으로는 데이터 갱신시 새로운 객체를 생성하므로 오버헤드 발생
synchronized 키워드: 코드 블록이나 메서드에 모니터 락을 걸어서 한번에 하나의 스레드만 블록에 접근 가능. 구현이 간단하지만 섬세한 thread 제어가 불가능
java.util.concurrent 패키지
스레드 안전한 컬렉션: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedList 등
락 인터페이스: ReentrantLock, ReadWriteLock
Executor, ExecutorService를 통해 스레드풀 관리
CAS 알고리즘: AtomicInteger, AtomicLong 같은 클래스는 CAS 알고리즘을 기반으로 동작. 메모리의 현재 값과 예상 값을 비교하고, 예상 값이 일치한 경우에만 새로운 값으로 변경. 락을 사용하지 않으므로 데드락이 발생하지 않지만, spin lock이 발생.
스레드 풀(Thread Pool)의 장단점은 무엇인가요?
장점:
자원 재사용: 스레드 생성 비용을 줄임
과도한 스레드 생성 방지: 한정된 수의 스레드로 작업
관리 용이성: 스레드 생성, 종료, 실행 제어 가능
응답 시간 개선: 미리 생성된 스레드 사용
단점:
스레드 수에 따른 성능 저하 가능성
데드락 가능성
디버깅 어려움
동시성 문제를 해결하기 위한 CAS(Compare-And-Swap)의 동작 원리를 설명하세요.
CAS는 동시성 문제를 해결하기 위한 non-blocking 동기화 기술. Read와 Write가 하드웨어 수준에서 원자적으로 작동
현재 값 읽기: 처음 값을 저장
작업 후 현재 값 확인: 처음 저장한 값과 현재 값이 동일한지 확인하여 변경 감지
반영: 두 값이 같으면 값을 저장하고, 아니면 다시 시도.
장점:
락을 사용하지 않아서 데드락 발생하지 않음
비교 및 교환이 원자적으로 이루어짐
단점:
스핀락이 발생하면 CPU 낭비
작업이 복잡한 경우에는 부적절
스레드 간 데이터 공유를 안전하게 처리하기 위한 디자인 패턴은 무엇인가요?
생산자-소비자 패턴 BlockingQueue를 사용하여 생산자와 소비자가 공유 자원에 접근하지 않고, 큐를 통해 데이터를 주고 받음
싱글 스레드 패턴: 작업 요청을 하나의 작업 큐에 저장하고, 하나의 스레드가 처리하도록 함
Immutable 객체
동기화 패턴: 메서드나 블록을 동기화
Thread-Local: 각 스레드마다 독립적인 데이터 유지
멀티스레드 환경에서 데드락(Deadlock)이 발생하는 조건은 무엇인가요?
상호 배재(Mutual Exclusion): 하나의 자원은 하나의 스레드만 사용
점유 대기: 자원을 점유한 상태에서 다른 자원의 해제를 기다림
비선점: 점유 중인 자원을 빼앗을 수 없음
순환 대기: 자원을 점유한 스레드들이 서로 다음 자원을 기다리며 순환 형태를 이룬다.
해결방법:
상호 배제 조건 완화: 동시 접근 가능
점유 대기 조건 완화: 모든 자원의 락을 한번에 요청. (은행원 알고리즘)
비선점 조건 완화: 다른 프로세스가 자원을 뺴앗을 수 있도록 함
순환 대기 조건 완화: 자원을 고정된 순서로만 요청.
스레드와 프로세스의 차이를 고려한 애플리케이션 설계 전략은 무엇인가요?
멀티프로세스 설계:
메모리 격리가 필요한 경우, 안정성을 우선시 하는 경우에 적합
웹 서버의 워커 프로세스(NginX), 분산 시스템
멀티스레드 설계:
메모리를 공유하여 빠른 통신이 필요한 경우 (게임서버, 실시간 채팅)
하이브리드 설계:
프로세스 간 주요 기능을 분리하고 각 프로세스 내에서 멀티스레드를 사용(데이터베이스 서버)
비동기 처리
Last updated