쓰레드 동기화/Deadlock

김태성·2024년 2월 20일
0

내실 다지기

목록 보기
3/11

이 내용은 csapp 12장에서도 나온다.

와! 싱크로!
와! 정크워리어!

동기화(synchronize)

동기화는 특정한 작업을 agreement나 commit 하기 위해 여러 프로세스를 handshake와 join up을 통해 조정하는 것이다.(영문위키)

  • commit = 데이터를 DB에 저장하고 트랜잭션을 종료하는것.
  • handshake = 조정, 인증을 위해 사용하는 두 장치/프로그램 간의 신호

여기서 쓰레드 동기화는

  • 여러 쓰레드가 하나의 리소스를 사용하려고 할 때
    하나의 쓰레드를 제외한 나머지가 리소스를 사용하지 못하게 하는것

이다.

임계 영역

공유되는 자원에서 하나의 쓰레드만 진입할 수 있는 영역을 의미한다.
임계영역을 지정하는 방법은 다음과 같다.

  • Lock(mutex) : 하나의 쓰레드 가 접근할 때 다른 프로세스가 접근하지 못하도록 잠그는 방법.

  • 세마포어 : 멀티 프로그래밍 환경에서 프로세스가 임계영역의 사용을 끝냈을때 대기중인 프로세스에게 끝났다는 사실을 알려주는 방식. 멀티쓰레드 상황이 아니더라도 프로세스가 여러개면 세마포어가 필요할 수 있음.(프로세스가 점유했을때 다른 프로세스는 접근x)
    접근 최대치를 정할 수 있고, 접근 최대치 만큼 사용자가 접근할 수 있음. 접근 최대치가 1인 세마포어를 binary 세마포어라고 한다.
    -> 개발자가 실수하면 큰일나는 방식.

경쟁 상태

경쟁 상태는 공유자원(ex/ 멀티쓰레딩 상태에서의 힙 영역 공유)에 대해 여러개의 프로세스가 동시에 접근 할 경우 접근 타이밍에 의해 결과값이 계속 변하는 상황이다.
그렇기 때문에 우리는 위의 임계영역을 사용해서 다중 프로세스가 공유자원에 동시에 접근하는 것을 막아야 한다.

교착상태(Deadlock)

둘 이상의 쓰레드가 서로의 작업이 끝나기만을 기다리며 작업을 진행하지 못하는 상태.

Deadlock 필요조건

  • 상호 배제 : 공유자원은 하나의 쓰레드만 접근하도록 허용해야 한다.
    다른 쓰레드가 동시에 사용할 수 없기 때문에 교착상태가 발생할 수 있다.

  • 비선점 : 한 쓰레드가 사용중인 자원은 선점 자원이 아니다. 해당 자원을 빼앗을 수 없다면 공유할 수도 없기에 교착 상태가 발생 할 수 있다.

  • 점유와 대기 : 다른 쓰레드가 필요로 하는 자원을 점유하고 있으면서 또 다른 자원을 기다리는 상태.
    즉 다른 쓰레드는 필요한 자원을 할당받지 못하고 , 자신도 필요한 자원이 없어 작업을 진행 할 수 없다.

  • 원형 대기 : 점유와 대기를 하는 쓰레드가 원을 이루어야 한다.
    서로 양보하지 않기 때문에 교착상태에 빠진다.

교착상태 해결방법

예방/회피/검출 방법이 있다.

  1. 교착상태 예방 ( 4가지 조건을 무력화함 )
  • 상호배제 예방 : 임계구역 보호를 위해 상호배제를 하는데 문제가 발생.

  • 비선점 예방 : 동기화 자원을 뺏을 수 있다면 다른 문제가 발생.

  • 점유와 대기 예방 : 쓰레드가 자원을 점유한 상태에서 다른 자원을 기다리지 못하도록 막는 방법. 전부 할당하거나 할당하지 않는 방식을 적용.

  • 원형 대기 예방 : 자원을 한 방향으로만 사용하도록 설정해서 원형 대기를 해방.
    모든 자원에 숫자를 부여하고 숫자가 큰 방향으로만 자원을 할당.
    하지만 숫자 부여를 어떻게 할 것인지 정하는게 힘들다.

  1. 교착상태 회피 : 교착상태가 발생하지 않을정도로만 할당한다.

  2. 교착 상태 검출 : 자원할당 그래프를 사용해서 교착 상태를 발견

  3. 교착 상태 회복 : 교착상태를 검출 후 해결한다.

profile
닭이 되고싶은 병아리

0개의 댓글

관련 채용 정보