본문 바로가기
게임서버-스파르타코딩NodeJs_7기/모의면접

면접카타 [OS] 25~28

by GREEN나무 2025. 2. 27.
728x90

[OS]

1. 프로세스와 쓰레드의 차이점

  • 프로세스(Process): 실행 중인 프로그램으로, 운영체제로부터 독립적인 메모리 공간(Code, Data, Stack, Heap)을 할당받음.
  • 쓰레드(Thread): 프로세스 내에서 실행되는 흐름의 단위로, Code, Data, Heap을 공유하지만, 개별적인 Stack을 가짐.

차이점:

구분 프로세스 쓰레드
메모리 공간 독립적 프로세스 내에서 공유
실행 단위 독립 실행 프로세스 내에서 실행
생성 비용 높음 (새로운 메모리 할당 필요) 낮음 (메모리 공유)
통신 방식 IPC(Inter Process Communication) 필요 프로세스 내 공유 메모리를 사용

2. 멀티프로세스와 멀티쓰레드의 특징

  • 멀티프로세스:
    • 여러 개의 프로세스를 실행하여 병렬 처리.
    • 각 프로세스는 독립적인 메모리를 가지므로 안정성이 높음.
    • 하지만, 프로세스 간 통신(IPC)이 필요하여 속도가 느림.
  • 멀티쓰레드:
    • 하나의 프로세스에서 여러 개의 쓰레드를 실행하여 병렬 처리.
    • 공유 메모리를 사용하여 빠른 데이터 접근 가능.
    • 하지만, 하나의 쓰레드가 비정상 종료되면 전체 프로세스가 영향을 받을 수 있음.

3. 동기와 비동기의 차이

  • 동기(Synchronous):
    • 요청을 보내고 응답이 올 때까지 대기.
    • 처리 순서가 보장되지만, 하나의 작업이 끝날 때까지 다음 작업을 진행할 수 없음.
  • 비동기(Asynchronous):
    • 요청을 보내고 응답을 기다리지 않고 다른 작업을 수행.
    • 응답이 도착하면 별도의 콜백 함수 또는 이벤트 핸들러를 통해 처리.
    • CPU 활용도가 높고 속도가 빠르지만, 제어가 복잡해질 수 있음.

4. 데드락(Deadlock)

  • 정의: 두 개 이상의 프로세스(또는 쓰레드)가 서로가 가진 자원을 기다리면서 무한 대기 상태에 빠지는 현상.
  • 발생 조건(교착 상태 조건):
    1. 상호 배제(Mutual Exclusion): 한 번에 하나의 프로세스만 자원을 사용 가능.
    2. 점유 대기(Hold and Wait): 자원을 점유한 상태에서 다른 자원을 요청하며 대기.
    3. 비선점(No Preemption): 강제로 자원을 회수할 수 없음.
    4. 순환 대기(Circular Wait): 프로세스 간 순환적으로 자원을 기다림.
  • 해결 방법:
    • 교착 상태 예방: 위 조건 중 하나 이상을 제거.
    • 회피 (Deadlock Avoidance): 은행원 알고리즘(Banker's Algorithm) 활용.
    • 탐지 및 복구: 데드락 발생 시 프로세스 종료 또는 자원 회수.

꼬리 질문 및 답변

Q1. 프로세스 간의 통신(IPC) 방법에는 어떤 것들이 있나요?

  • 메시지 큐(Message Queue): 운영체제가 제공하는 메시지 큐를 통해 데이터 송수신.
  • 공유 메모리(Shared Memory): 여러 프로세스가 같은 메모리 공간을 사용.
  • 파이프(Pipe): 한 프로세스의 출력을 다른 프로세스의 입력으로 전달.
  • 소켓(Socket): 네트워크를 통해 원격 프로세스 간 통신.

Q2. 멀티쓰레드 환경에서 발생할 수 있는 문제점과 해결 방법은?

  • 경쟁 조건(Race Condition): 여러 쓰레드가 동일한 자원을 동시에 접근하며 발생하는 문제.
    • → 해결: 뮤텍스(Mutex) 또는 세마포어(Semaphore) 사용
  • 데드락(Deadlock): 두 개 이상의 쓰레드가 서로 자원을 점유한 상태에서 무한 대기.
    • → 해결: 락 순서(lock ordering) 또는 타임아웃(timeout) 설정
  • 기아 상태(Starvation): 우선순위가 낮은 쓰레드가 자원을 계속 할당받지 못하는 문제.
    • → 해결: 우선순위 조정 또는 공정한 스케줄링(Fair Scheduling) 적용

Q3. 동기와 비동기 방식에서 성능을 최적화하는 방법은?

  • 동기 방식 최적화:
    • 멀티쓰레드 활용하여 동기 작업을 병렬 처리.
    • 블로킹 작업 최소화 및 캐싱 활용.
  • 비동기 방식 최적화:
    • 이벤트 기반 프로그래밍(Event Loop) 활용.
    • 논블로킹 I/O를 적극 사용하여 처리 속도 향상.
    • Promise/Future 패턴 활용하여 가독성 개선.