Java Developer Interview

OS

쓰레드와 프로세스의 차이

  • 프로세스와 쓰레드는 서로 관계가 있으나 기본적으로는 다름
  • 프로세스는 실행되고 있는 프로그램 개체
  • 프로세스는 CPU 시간이나 메모리 등이 시스템 자원이 할당되는 독립적인 객체
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 할 수 없음
  • 어떤 프로세스는 다른 프로세스의 자원을 접근하려면 프로세스 간 통신(IPC)을 사용하여야 함
  • 프로세스간 통신 방법으로는 파이프나 파일, 소켓 등이 있음
  • 쓰레드는 프로세스와 같은 스택 공간을 사용하며, 여러 쓰레드는 그 상태의 일부를 서로 공유
  • 통상 같은 메모리를 읽고 쓰는 여러 프로세스를 생성 할 수 있음
  • 프로세스가 다른 프로세스의 메모리를 읽고 쓰는 여러 프로세스를 생성 할 수 있음
  • 프로세스가 다른 프로세스의 메모리를 직접적으로 접근할 수 없는 것과는 다름
  • 각각의 쓰레드에는 별도의 레지스터와 스택이 배정
  • 다른 쓰레드가 해당 스택 메모리를 읽고 쓰는 것은 허용
  • 쓰레드는 프로세스의 특정한 수행 경로
  • 한 쓰레드가 프로세스 자원을 변경하면, 다른 이웃 쓰레드도 그 변경 결과를 즉시 볼 수 있음

뮤텍스와 세마포어의 차이

  • 뮤텍스(Mutex)
    • 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것
    • 상호배제라고도 하며, Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술
    • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 synchronized 또는 lock을 사용
      • 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음
  • 세마포어(Semaphore)
    • 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
    • 리소스 상태를 나타내는 간단한 카운터로 생각할 수 있음
      • 운영체제 또는 커널의 한 지정된 저장장치 내의 값
      • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용
      • 유닉스 시스템 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화 시키는 기술
    • 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있음
    • 각 프로세스는 세마포어 값은 확인하고 변경할 수 있음
      • 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있음
      • 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 함
      • 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야함
      • 세마포어는 이진수 (0 또는 1)를 사용하거나, 또는 추가적인 값을 가질 수도 있음
    • 차이
      • 가장 큰 차이점은 관리하는 동기화 대상의 개수
      • Mutex는 동기화 대상이 오직 하나뿐일 때, Semaphore는 동기화 대상이 하나 이상일 때 사용
      • Semaphore는 Mutex가 될 수 있지만 Mutex는 Semaphore가 될 수 없음
      • Mutex는 상태가 0, 1 두 개 뿐인 binary Semaphore
      • Semaphore는 소유할 수 없는 반면, Mutex는 소유가 가능하며 소유주가 이에 대한 책임을 가짐
      • Mutex 의 경우 상태가 두개 뿐인 lock 이므로 lock 을 가질 수 있음
      • Mutex의 경우 Mutex를 소유하고 있는 스레드가 이 Mutex를 해제할 수 있음
      • Semaphore의 경우 이러한 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있음
      • Semaphore는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재하는 반면 Mutex는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 됨

동기와 비동기