회사도 참 많이 옮겨 다니긴 했지만
대부분 공장 자동화나 스마트 팩토리를 하는 개발업체였어서
C# 윈폼 기반의 프로그램 개발을 많이 했었다
사용자 입력 이벤트를 받아서 구동하는 프로그램은 문제가 없겠지만
현장 단말기는 실시간으로 데이터 집계 및 수량 표현이 되어야 해서
타이머로 지속적인 갱신이 발생하게 되는데
이 때 실시간으로 처리해야 하는 프로세스가 여러가지라서
다중 쓰레드를 실행 시켜서 개별적으로 처리를 해야 했었다
문제는 이 덕지 덕지 붙여놓은 다중 쓰레드 작업이
하나 하나 뜯어보면 엄청나게 무식한 작업들이었다는 것이다
1). 초 단위 단말기들의 동시 다발적인 DB 조회
2). 비동기 방식 화면 갱신 및 업무 처리
3). 단말기들의 동시 다발적인 DB 업데이트
만약 이러한 문제를 본인만 겪어본 문제라고 한다면
세마포어나 교착상태라는 말을 들어볼 일이 없었을 것이다
이 글을 적는 이유도 사실 DB 연결이란 것도
무선 인터넷 연결이다보니 연결이 수시로 끊어졌다 연결되는데
그 시점에 세마포 제한시간 만료 라는 에러를 보아왔기 때문이다
그래서 세마포어 에러가 인터넷 연결이 끊어지면 생기는 문제인 줄로만 알았다 그런데 알고보니 세마포어는 공유자원과 관련된 내용이었다
각 프로세스에 제어 신호를 전달하여 순서대로 작업을 수행하도록 하는 기법이다
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 동작)
교착상태가 발생되지 않도록 사전에 시스템을 제어하는 방법
교착 상태 발생 4가지 조건 중에서 하나를 제거(부정)함으로써 수행
일반적으로 자원의 낭비가 가장 심함
4 가지 조건 부정
1) 상호 배제 부정
한번에 여러개의 프로세스가 공유 자원을 사용할 수 있도록 하는 것
실제로는 구현하지 않음
2) 점유 및 대기 부정
프로세스가 실행되기 전 필요한 모든 자원 할당
프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원요구
3) 비선점 부정
자원을 점유하고 있는 프로세스가 다른 자원을 요구할때
점유한 자원을 반납하고 요구한 자원을 사용하기 위해 대기
4) 환형 대기 부정
자원을 선형 순서로 분류하여 고유번호 할당
각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤
어느 한쪽 방향으로만 자원을 요구하도록 하는 것
회피(Avoidence)기법
은행원 알고리즘
Dijkstra가 제안한 것으로
은행에서 모든 고객의 요구가 충족되도록
현금을 할당하는 데서 유래한 기법
각 프로세스에게 자원을 할당하여
교착 상태가 발생하지 않으면
모든 프로세스가 완료될 수 있는 상태를 안전 상태,
교착 상태가 발생할 수 있는 상태를 발안전 상태라고 함
발견(Detection)기법
회복(Recovery)기법