세마포어와 교착상태

안희수·2021년 3월 18일
0

용어 정리 사전

목록 보기
4/5

서두

개발하면서 가장 본인을 괴롭혔던 멀티 쓰레드

회사도 참 많이 옮겨 다니긴 했지만
대부분 공장 자동화나 스마트 팩토리를 하는 개발업체였어서
C# 윈폼 기반의 프로그램 개발을 많이 했었다

사용자 입력 이벤트를 받아서 구동하는 프로그램은 문제가 없겠지만
현장 단말기는 실시간으로 데이터 집계 및 수량 표현이 되어야 해서
타이머로 지속적인 갱신이 발생하게 되는데

이 때 실시간으로 처리해야 하는 프로세스가 여러가지라서
다중 쓰레드를 실행 시켜서 개별적으로 처리를 해야 했었다

문제는 이 덕지 덕지 붙여놓은 다중 쓰레드 작업이
하나 하나 뜯어보면 엄청나게 무식한 작업들이었다는 것이다

1). 초 단위 단말기들의 동시 다발적인 DB 조회

  • DB 연결만이 유일한 데이터 확인 수단이고
    미들웨어나 대용량 데이터 처리를 위한 서버 따위는 없는 시점에
    Select 쿼리와 조회 프로시저만 주구장창 돌리고 앉아 있었다

    타 개발 업체는 실시간 데이터 조회를 어떻게 하는지 모르겠다
    내가 아는 클라이언트 기반 프로그램은 대체로 전처리 서버 없이
    DB에 직접 붙어서 조회한다

    문제는 해당 프로그램이 사용자 이벤트의 의한 것이 아니라
    실시간 자동 집계 방식일 경우 심각하게 비효율 적이라는 것이다

2). 비동기 방식 화면 갱신 및 업무 처리

  • 이러한 경우는 아예 정상적인 디버깅을 포기한다
    아예 안 되는 것은 아니지만 중단점을 걸어 놓고 걸릴 때 까지 기다리거나
    극단적으로 한줄 한줄 디버깅을 하는 수 밖에 없다

    비동기 방식은 클라이언트 프로그램에서만 사용되지 않는다

    웹에서도 Ajax 라고 하는 비동기 처리 방식을 사용하는데
    웹에서는 어떨지 모르겠지만 클라이언트 프로그램에서는
    비동기 방식이면 개발자가 원하는 타이밍에 에러를 잡아낼 수 없다

    오류가 명확히 재현이 되지 않는다는 점에서
    제대로 이해하지 않은 다중 쓰레드는 아예 걷어내고
    가급적 단일쓰레드에서 처리하는 것이 바람직하다
    [그렇다고 단일 쓰레드에서 다 처리하려 하면 버퍼링이 생긴다]

3). 단말기들의 동시 다발적인 DB 업데이트

  • 한 테이블에 여러 단말기들이 접근해서 값을 업데이트 하는 상황에
    데드락이 발생하거나 CPU 점유율이 100프로 임박하는 케이스가 많았다

만약 이러한 문제를 본인만 겪어본 문제라고 한다면
세마포어나 교착상태라는 말을 들어볼 일이 없었을 것이다

이 글을 적는 이유도 사실 DB 연결이란 것도
무선 인터넷 연결이다보니 연결이 수시로 끊어졌다 연결되는데
그 시점에 세마포 제한시간 만료 라는 에러를 보아왔기 때문이다
그래서 세마포어 에러가 인터넷 연결이 끊어지면 생기는 문제인 줄로만 알았다 그런데 알고보니 세마포어는 공유자원과 관련된 내용이었다


세마포어 (Semaphore)

  • 각 프로세스에 제어 신호를 전달하여 순서대로 작업을 수행하도록 하는 기법이다

  • E.J Dijkstra가 제안하였으며 P 와 V라는 2개의 연산에 의해서 동기화를 유지시키고 상호 배제의 원리를 보장한다

  • 어러 개의 프로세스가 동시에 값을 수정하지 못한다

  • S는P와 V 연산으로만 접근 가능한 새마포어 변수로 공유 자원의 개수를 나타내며 0과 1 혹은 0과 양의 값을 가질 수 있다

  • P연산: 자원을 사용하려는 프로세스들의 진입 여부를 자원의 개수(S)를 통해 결정하는 것으로 자원의 개수를 감소시켜(S=S-1) 자원이 점유되었음을 알림(Wait 동작)

  • V연산: 대기중인 프로세스를 깨우는 신호(Wake up)로써 자원의 개수를 증가시켜서(S=S+1) 자원이 반납되었음을 알림(Signal 동작)


교착 상태 (Deadlock)

교착 상태의 정의

  • 상호 배제에 의해 나타나는 문제점으로
    둘 이상의 프로세스들이 자원을 점유한 상태에서
    서로 다른 프로세스가 점유하고 있는 자원을 요구하며
    무한정 기다리는 현상

교착 상태 해결 방법

  • 예방(Prevention)기법
    • 교착상태가 발생되지 않도록 사전에 시스템을 제어하는 방법

    • 교착 상태 발생 4가지 조건 중에서 하나를 제거(부정)함으로써 수행

    • 일반적으로 자원의 낭비가 가장 심함

      4 가지 조건 부정

      1) 상호 배제 부정

      한번에 여러개의 프로세스가 공유 자원을 사용할 수 있도록 하는 것
      실제로는 구현하지 않음

      2) 점유 및 대기 부정

      프로세스가 실행되기 전 필요한 모든 자원 할당
      프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원요구

      3) 비선점 부정

      자원을 점유하고 있는 프로세스가 다른 자원을 요구할때
      점유한 자원을 반납하고 요구한 자원을 사용하기 위해 대기

      4) 환형 대기 부정

      자원을 선형 순서로 분류하여 고유번호 할당
      각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤
      어느 한쪽 방향으로만 자원을 요구하도록 하는 것

  • 회피(Avoidence)기법

    • 교착 상태가 발생할 가능성을 배제하지 않고
      교착 상태가 발생하면 적절히 피해가는 방법
    • 주로 은행원 알고리즘이 사용됨


은행원 알고리즘

  • Dijkstra가 제안한 것으로
    은행에서 모든 고객의 요구가 충족되도록
    현금을 할당하는 데서 유래한 기법

  • 각 프로세스에게 자원을 할당하여
    교착 상태가 발생하지 않으면
    모든 프로세스가 완료될 수 있는 상태를 안전 상태,
    교착 상태가 발생할 수 있는 상태를 발안전 상태라고 함


  • 발견(Detection)기법

    • 시스템에 교착 상태가 발생했는지 점검하여
      교착 상태에 있는 프레세스와 자원을 발견하는 것으로
      자원 할당 그래프 등을 사용함
  • 회복(Recovery)기법

    • 교착 상태를 일으킨 프로세스를 종료하거나
      교착 상태의 프로세스에 할당된 자원을 선점하여
      프로세스의 자원을 회복하는 것
profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

0개의 댓글