본문 바로가기

CS

[면접을 위한 CS 전공지식 노트] 3.3. 프로세스와 스레드(3)

728x90

 


 

🔑 공유자원(shared resource)

  • 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일 등의 자원, 변수
  • 경쟁 상태(race condition)
    • 공유자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
    • 동시에 접근 시도 시 접근 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태

 

🔑 임계영역(critical section)

  • 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
  • 해결 할 수 있는 조건
    • 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
    • 한정 대기 : 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안 됨
    • 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해선 안됨
  • 해결 방법
    • 뮤텍스(mutex)
      • 프로세스가 스레드나 공유자원을 lock()을 통해 잠금 설정하고 사용 후에는 unlock()을 통해 잠금해제하는 객체
      • 잠금 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고, 해제는 반대로 접근 가능함
      • 잠금과 잠금 해제의 상태만 가짐
      • 잠금을 기반으로 상호 배제가 일어나는 잠금 매커니즘
    • 세마포어(semaphore)
      • 일반화된 뮤텍스
      • 간단한 정수값과 두 가지 함수(wait, signal)로 공유 자원에 대한 접근 처리
        • wait() : 자신의 차례가 올 때 까지 기다리는 함수
        • signal() : 다음 프로세스로 순서를 넘겨주는 함수
      • 프로세스/스레드가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행함
      • 프로세스/스레드가 공유자원에서 해제되면 세마포어에서 signal() 작업을 수행함
      • 세마포어에는 조건 변수가 없음. 프로세스 / 스레드가 세마포어 값을 수정하면 다른 프로세스 / 스레드는 동시에 세마포어 값을 수정할 수 없음
      • 신호를 기반으로 상호배제가 일어나는 신호 메커니즘으로 상호배제를 명시적으로 구현해야 함
        • 바이너리 세마포어  : 0과 1 두 값만 가지 수 있음
        • 카운팅 세마포어 : 여러 개의 값을 가질 수 있는 세마포어로 여러 자원에 대한 접근을 제어하는 데 사용
    • 모니터
      • 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공
      • 모니터 큐를 통해 공유 자원에 대한 작업을 순차적으로 처리
      • 세마포어보다 구현하기 쉽고 상호배제는 자동적으로 이뤄짐

 

 


 

🔑 교착상태(deadlock)

  • 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
  • 원인
    • 상호배제 : 한 프로세스의 자원 독점, 다른 프로세스들은 접근 불가능
    • 점유대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
    • 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없음
    • 환형대기 : 서로가 서로의 자원을 요구하는 상황
  • 해결 방법
    • 자원 할당 시 애초에 조건이 성립되지 않도록 설계
    • 교착 상태 가능성이 없을 때만 자원 할당을 하고, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 묻는 은행원 알고리즘을 사용
    • 교착상태 발생 시 사이클이 있는 지 찾아보고 이와 관련된 프로세스를 한 개씩 지움
    • 교착상태는 매우 드물게 발생해 처리 비용이 더 크기 때문에 교착상태 발생 시 사용자가 작업을 종료함
728x90