가끔식 심심하면 나오는 떡밥 중에 하나가 바닐라로 LTN을 정말 구현할 수 있는가?였음
나는 이게 매번 이게 될 것 같기도 하다가도 또 안될것 같기도하고 또 될것같기도 하다가 지금은 될 것 같은데? 상태에 이르렀음
그런데 지금 내가 구상하는 방법에서는 모든 철도역들이 하나의 전역 네트워크에 접속이 되어있어야 하고 만약 물자 요청이 발생한다면 전역네크워크로 신호를 발생시키고 그럼 그 물자를 공급해줄수 있는 역에서는 그 신호를 수신해서 열차를 배정하는 시스템을 생각하고 있음
그런데 전역네트워크를 쓰는 도중에 하필 두개 이상의 역에서 요청을 발생시킨다면? 그럼 시스템이 엉망이 되고 말음 그래서 단 하나의 역만 전역 네트워크 권한을 가질 수 있어야하고 이 동안에는 다른 역들은 요청을 발생시켜서는 안됨
이런 문제점을 해결하기 위한 시도가 팩갤 과거글에서도 발견할 수 있음
· 여러개 클라이언트가 줄 하나로 통신할때 우선순위 문제 이거어떰
· 통신 꼬임 문제 해답 알아낸듯?
위 내용들이 대충 어떻게 하는거냐면
내가 전역 네트워크(앞으로는 그냥 버스라고 부름) 권한을 얻고 싶다면 일단 버스 권한 획득 신호를 1 내보냄
그 다음에 전역네트워크 상에 버스 권한 획득 신호가 진짜 1인지 확인을 하는거임. 만약 나말고 다른 누군가가 똑같은 짓을 하고 있다면 1보다 큰 값을 가질거임
값이 1이라면 행복하겠지만 1이 아니라면 일단은 내가 내보내고 있는 신호를 계속 유지함. 그러다가 아 안되겠는데? 하고 일정시간이 지난다면 걍 포기를 하는거임
아무리 여러개의 마스터가 동시에 권한 요청을 한다고 해도 결국 하나씩 떨어져 나가고 최후의 1인이 버스 권한을 획득하게 됨
권한을 획득했으면 전역네트워크로 원하는 신호들을 막 전송한다음 전송이 끝난다면 버스 권한 획득 신호를 0으로 초기화 한다
아까 포기했던 애들은 권한 신호가 0이 된다면 다시 선점을 시도하고 이를 반복하게 됨
그런데 여기에는 살짝 고려할 점이 있음. 일정 시간이 지나면 버스를 포기한다고 했는데 이 일정 시간을 어떻게 설정하느냐임
만약 모든 마스터가 동시에 버스를 포기해버리면 동시에 권한요청-> 동시에 권한포기->동시에 권한요청.. 무한 반복의 늪에 빠져버린다
따라서 각 마스터 역 별로 고유한 값을 가지고 있고 이 고유한 값 틱만큼 시간이 지나면 포기하는 식으로 하면 제대로 시스템을 동작시킬 수 있게 된다
그래서 이 고유값을 어떻게 설정하느냐 인데 이건 사람이 수동으로 지정하는 방법도 있고
전역 네트워크로 고유 아이디 할당 받기도 있고
기차 ID를 사용하는 방식도 있음
요로코롬
이런 방식의 시스템은 ID가 너무 커지게 되면 그만큼 권한포기하는데 시간이 오래 걸리기 때문에 선정시간이 오래걸린다는 소소한 단점이 있음
여기까지는 과거의 시도들에 대한 내용 정리였었고 꽤나 획기적인 방법을 생각해냈음
바로 열차를 이용하는 것이다
대충 설명을 위한 실험 세트
오른쪽에는 IDLE 역이랑 쌍두열차 한대가 서있음. 그리고 이 역을 나가는 곳에 신호가 하나 설치되어있는데 이건 항상 빨간불로 고정을 해둔상테
왼쪽에는 여러개의 GRANT 역이 있음 여기 기차역에서는 신호를 다루는데
L신호가 1일 때만 역이 활성화 되도록 하고
기차수를 읽어서 C로 출력되도록 하고 있음
회로상태를 쉽게 확인할 수 있도록 전구를 설치해놨다
일정신호조합기를 이용해서 L을 내보낼수도 있고 안내보낼 수도 있는 상황
만약 내가 버스에 권한을 얻고 싶다면 L을 입력해주고 그렇지 않으면 L을 입력하지 않으면 됨
지금 문제점이 여러 마스터가 동시에 버스 권한을 취득하면 어떡하느냐? 였는데 기차가 이걸 결정해준다
게임 잠시 일시멈춤해두고 3개의 마스터역에서 L을 할당하고 시간을 흐르게 하는 모습
L 전구가 동시에 3곳에 불이 들어오지만 C전구는 오직 한 곳에만 불이 들어오는 모습을 볼 수 있음
L이 입력되면서 역 3곳의 비활성화가 풀렸고 오른쪽 열차가 드디어 갈 곳이 생겼는데
당연하지만 열차가 목표하는 곳은 단 하나의 역뿐만임(보통은 가장 가까운역)
그래서 움짤을 보면 열차는 가장 오른쪽 마스터역을 향하려고 하고 그렇기 때문에 오른쪽 역의 C에만 불이 들어 오게 된 것
물론 저 열차는 무한빨간불에 묶여있기 때문에 저곳을 탈출하지 못함
권한을 획득한 마스터역은 여유있게 보내고 싶은 신호를 버스를 통해 전달하고 볼일이 끝나면 권한을 해제 하면된다
그럼 나머지 다른 열차들이 또 새로운 권한을 획득하고 동작하게 되겠지
권한을 줬다 뺏다 하는 모습
C는 단 한 곳에만 불이 들어온다
C를 획득한 것과는 별개로 권한획득완료 신호를 별도로 버스에 올리는 것이 좋을것같은데
그 이유는 이 방식도 repath 문제에서 완전히 자유롭지는 않기 때문임
어지간해서는 한번 할당한 C가 L을 끄기 전까지는 다른 곳으로 튀지 않는 것을 확인하기는 했는데 신호를 설치하거나 해체하거나 하면 repath가 발생할 수도 있고 이 과정에서 C가 다른곳으로 옮겨갈 수도 있음
즉 C를 획득했으면 즉각적으로 전역네트워크만 선점한 다음 L을 풀어주는게 좋을듯 함
사실 비슷한 것을 옛날에도 해본적이 있는데 이걸 응용하면 괜찮을 것같아서 정리해봤음
원격 신호 전송은 번거로운 주제에 한번에 1비트 밖에 못 전송함+무선 신호이긴 한데 철도네트워크로는 이어져 있어야 한다는 단점이 있었는데
이렇게 버스를 할당하기 위한 솔루션으로 사용하면 문제점이 없는셈이나 다름 없다
어짜피 바닐라 LTN 구현하기 위함이니까 철도네트워크는 당연히 이어져 있을거고
https://gall.dcinside.com/m/factorio/39409
시간 있으면 LTN 연구방 놀러오셈. 이 회로로 동시요청은 해결 가능함
ltn 연구방 아직도 살아있음? ㅋㅋ 타이밍 늦은것 같아서 안가봤는데
저글 보긴했던것같은데 분석하기 귀찮아서 넘긴것같네
..모르겠어
https://factoriobin.com/post/VegZWD0C
이런건
어때
마치 전역을 다같이 사용중인것처럼 해보자는 아이디어임
대신 신호가 업데이트되는데 오래걸리기 때문에 모든 틱을 다 받아올 필요가 없는 경우만 커버할 수 있음 예를 들어서 상자의 보유량이라던가, 경과된 시간이라던가..아니면 아예 값 자체가 변하지 않는다던가. 각 클라이언트는 항상 전역으로 자신의 정보를 알리고있고, 중앙 처리 시스템이 전부 다 커버해주겠지~하고 게으름 피우는 모델에서 사용할 수 있음
점신호이용해서 시분할 시스템 만든거군
괜찮네