2024.11.05 레이스 컨디션

장재영·2024년 11월 4일
0

레이스 컨디션

  • 여러 프로세스나 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제
  • 접근 순서에 따라 결과가 달라질 수 있는 상황

세마포어

  • 동시에 여러 스레드가 접근할 수 있는 자원의 수를 제한

동작방식

  • 세마포어는 자원에 접근할 수 있는 허가된 "카운트"를 가지며, 이 카운트가 0이 되면 더 이상 접근이 불가능
  • 자원에 접근하기 위해 P() 또는 wait() 연산을 수행하여 카운트를 1 감소시키고, 작업을 마친 후 V() 또는 signal() 연산을 통해 카운트를 1 증가

종류

  • 이진 세마포어(Binary Semaphore): 카운트가 0 또는 1만 가지며, 자원에 한 번에 하나의 스레드만 접근(뮤텍스처럼 동작)
  • 계수기 세마포어(Counting Semaphore): 특정 자원에 여러 개의 접근을 허용할 수 있는 세마포어로, 자원의 허용 가능한 최대 접근 수를 나타내는 초기값을 가짐

뮤텍스

  • 한 번에 하나의 스레드만 자원에 접근할 수 있도록 상호 배제를 보장하는 도구

동작방식

  • 잠금(Lock) 개념을 사용하여 자원 접근을 관리
  • 스레드가 자원에 접근할 때 뮤텍스를 잠그고, 작업이 끝나면 뮤텍스를 해제
  • 뮤텍스가 잠겨 있으면 대기

데드락

  • 여러 스레드나 프로세스가 서로의 자원을 기다리며 무한히 대기하는 상태
  • ex: 스레드 A는 자원 X를 잠그고 자원 Y를 기다리는 동안, 스레드 B는 자원 Y를 잠그고 자원 X를 기다린다면 두 스레드는 영원히 대기

데드락을 발생시키는 접근 제한 조건

  • 상호 배제(Mutual Exclusion): 자원은 한 번에 한 프로세스만 접근
  • 점유 대기(Hold and Wait): 자원을 점유한 프로세스가 추가로 다른 자원을 기다림
  • 비선점(No Preemption): 다른 프로세스가 자원을 강제로 빼앗을 수 없음
  • 순환 대기(Circular Wait): 프로세스들이 자원을 기다리는 관계가 순환 구조

데드락 해결방법

  1. 데드락 예방
  • 접근 제한 조건중 하나라도 사용하지 않으면 됨
  1. 데드락 회피
  • 은행가 알고리즘(Banker's Algorithm): 자원 요청 시 현재 시스템 상태를 확인하고, 데드락 상태가 발생하지 않는 경우에만 자원을 할당
  1. 데드락 검출과 회복
  • 검출: 주기적으로 자원 할당 그래프를 검사하여 데드락 상태를 감지
  • 회복: 데드락 상태가 감지되면 일부 프로세스를 종료하거나 자원을 회수하여 데드락을 해소
  1. 타임아웃 설정
  • 특정 자원을 일정 시간 동안 얻지 못하면 요청을 취소하고 자원을 재요청
profile
개발 하고 싶은 비버

0개의 댓글