말머리에 정보라고 달아놓긴했는데 사실 내가 자꾸 까먹어서 메모용으로 쓰는글임




일단 실험환경에 대해 설명함


빨간색 기차역 2개는 이름이 A로 설정되어있고

파란색 기차역 2개는 이름이 B로 설정되어있음

기차역은 모두 기차 수 제한 1로 설정되어있음

B역에 붙어있는 램프는 역이 켜지면 초록색 열차가 할당되면 파란색으로 불이 들어옴


열차 설정은 둘다 A에서 출발해서 B로 가게끔 되어있음






먼저 기차가 움직이는 도중에 도착지점으로 설정된 역이 꺼지면 어떻게 움직이는지 알아보자


현재 노란색 열차는 비활성화 상태이고 초록색 열차만 자동운행으로 설정했다


B역이 둘다 켜져 있고 초록색 기차가 B역들중에 왼쪽에 있는 역을 도착지점으로 설정하고 그쪽으로 움직이고 있다






왼쪽B역으로 향하던 도중 왼쪽B역이 꺼지자 오른쪽B역으로 도착지점을 변경하는걸 볼 수 있다


열차는 도착지점으로 지정했던 역이 꺼지면 같은 이름을 가진 역중에 켜져있는 역을 찾아 그곳으로 도착지점을 변경한다


만약 도착지점인 B역들이 모두 꺼져있다면 다시 A역으로 돌아간다






이제 데드락이 걸리는 상황을 보자


현재 초록색 열차와 노란색 열차가 둘다 자동운행 상태이다


먼저 초록색 열차가 왼쪽B역으로 향하고있다






노란색 열차가 오른쪽 B역으로 향하고있다


B역의 기차 수 제한이 1이기 때문에 초록색 기차가 이미 선점한 왼쪽B역으로는 갈 수 없기 때문에 오른쪽B역이 도착지점으로 설정됨






지금 초록색 기차의 도착지점인 왼쪽 B역이 꺼진다면 어떻게 될까


왼쪽 B역은 꺼져있고 오른쪽 B역은 노란색 열차가 선점해있기 떄문에 열차수 제한에 걸려 갈 수 없다


그렇다면 도착지점으로 지정할 B역이 없는 상태이기 때문에 A역으로 돌아가 빈 B역이 생기길 기다릴거라 예상할텐데






그냥 선로위에서 비어있는 B역이 생기길 기다린다






왼쪽 B역은 꺼져있고 유일하게 켜져있는 오른쪽 B역은 노란색 기차가 선점한 상황


초록색 기차가 움직일 수 있는 조건 - 노란색 기차가 오른쪽 B역을 통과함

노란색 기차가 움직일 수 있는 조건 - 초록색 기차가 움직여서 길을 만들어줘야 함


두 가지 조건이 충돌해 데드락이 발생했다


데드락이 발생하는 조건을 알아봤으니 이제 해결법을 알아보자






위에 데드락 실험과 동일한 상황이다


두 열차 모두 자동운행 상태이고 노란색 기차가 먼저 왼쪽 B역을 도착지점으로 설정하고 출발했다






초록색 기차는 오른쪽 B역을 도착지점으로 설정하고 출발한 상태


이번에는 역을 끄는 대신 기차 수 제한을 0으로 설정해보자






현재 양쪽 B역은 켜져있고 왼쪽은 기차 수 제한이 0 오른쪽은 1로 설정된 상태이다


왼쪽 B역의 기차 수 제한이 0으로 설정되었지만 노란색 열차는 멈추지않고 계속 왼쪽 B역으로 향하고있다


기차 수 제한이 0으로 바뀌어도 이미 해당 역을 목표로 지정하고 출발한 열차에는 영향을 주지 않기 때문에 노란색 열차는 왼쪽 B역을 들렸다 A역으로 돌아간다


이렇게 역의 활성화/비활성화 대신 기차 수 제한으로 역을 컨트롤 하면 데드락을 방지할 수 있다