메인 회로 네트워크 채널(줄여서 전역채널 이라 말함)이 존재한다
전역채널은 모든 역들의 프로세서와 중앙 프로세서에 연결되어있는 한 가닥의 선이다
중앙에서 계산을 담당하는 중앙 프로세서가 존재한다
중앙 프로세서에는 선점 관리자, 전역id관리자가 포함된다
물류 기차는 메인역 -> 메인역 -> 대기역 의 스케줄을 가진다
대기역에는 주유소가 존재한다
기차를 이용한 신호 처리 우선순위 선점 기능(줄여서 선점 이라 말함)으로 전역채널의 소유권을 분배한다
전역채널은 한 번에 최대 한 요청역만이 소유권을 갖게 된다
전역채널을 다 사용한 이후에는 전역채널을 소유하던 역의 프로세서에서 전역 채널로 선점 종료 신호를 보낸다
선점 종료 신호를 받은 중앙의 선점 관리자는 소유권을 회수하고 다른 선점 요청을 처리하기를 시작한다
공급/요청 역마다 프로세서가 존재한다
공급/요청 역마다 기차가 정차하고 신호를 읽는 메인 역 하나, 그리고 선점 기능을 위한 선점 역 하나 이렇게 2역이 필요하다
공급 역은 추가로 공급 전용 소유권을 할당받기 위한 공급 선점역이 1개 추가로 필요해 총 3개의 역이 필요하다
모든 메인 역 이름은 서로 같으며, 모든 선점 역 이름은 서로 같다
선점 역과 공급 선점 역 이름은 서로 다르다
공급/요청 역마다 할당된 작업의 id를 저장하는 작업id 레지스터가 존재한다
요청 역마다 상태를 저장하는 상태 레지스터가 존재한다
공급 역마다 아이템의 공급 수량을 저장하는 레지스터가 존재한다
전역id관리자에 존재하는 변수인 작업id는 초기값 1을 가진다
소유권을 얻은 공급/요청역은 현재의 작업 id값을 해당 작업의 작업id로 사용한다
이렇게 작업id값을 사용한 다음 전역id관리자는 작업id값을 1 증가시켜 다음에 쓰일 작업id가 중복되지 않도록 한다
전역id관리자는 전역 채널의 작업id값이 오버플로우하여 0이 되면 작업id값을 1 증가시켜 다시 사용할 수 있도록 한다
(0인 작업id값은 유효하지 않다)
<알고리즘>
1. 요청역은 상자의 아이템 수량이 설정량보다 적은 걸 감지해 자신의 상태 레지스터를 0에서 1로 바꾸고 선점을 요청한다
2. 선점이 시작되면 요청역은 자신의 상태 레지스터를 1에서 2로 바꾸고 전역 채널에 자신이 필요한 아이템을 신호로 1틱동안 출력한다
3. 공급역은 자신이 공급하는 아이템과 전역 채널에 표시된 아이템이 같은 경우 해당 수량만큼을 공급할 여력이 되면 공급 선점을 요청한다
4. 선점에 성공한 공급역은 선점 성공 신호를 전역 채널에 1틱동안 보내며 필요한 아이템의 수량을 레지스터에 저장한다
5. 전역 채널에 선점 성공 신호가 1틱만큼 보내지면 그 다음 틱엔 공급/요청 역의 작업id레지스터에 동일한 작업id가 들어가고
전역id관리자는 작업id를 1 증가시킨다
동시에 공급역이 1틱통안 활성화되어 기차는 대기역에서 공급역으로 출발한다
5. 어떤 공급역도 선점 성공 신호를 보내지 않았을 경우 요청역은 자신의 상태 레지스터를 2에서 3으로 바꾼다
그리고 일정 틱만큼 대기한 후 상태 레지스터를 3에서 1로 바꾸고 다시 선점을 요청하게 된다
6. 기차가 공급역에 도착하고 해당 아이템을 전부 정확한 수량으로 적재하면 공급역은 선점을 요청한다
7. 선점이 시작되면 공급역은 자신이 저장하고 있던 작업id를 전역 채널로 1틱 보낸다
8. 요청역은 자신이 저장하던 작업id와 동일한 작업id가 전역 채널에 송신된 것을 확인하고 역을 활성화시킨다
이때 공급역과 요청역의 작업id레지스터는 더 필요가 없으니 초기화된다
또한 요청역의 상태 레지스터를 2에서 4로 바꾼다
9. 기차가 요청역에 도착해 물건을 전부 하역했을 경우 요청역은 상태 레지스터를 4에서 0으로 바꾼다
끝
어디에 썼다가 복사해왔길래 글이 시꺼매 ㅋㅋ
내가 생각했던거하고 거의 비슷하네. 차이가 있다면 요청역/공급역별로 고유아이디가 있긴 있어야 하고 요청역이 공급역 찾는 과정에서 상대방의 고유아이디를 기억해두는 식으로 제어 하려고 했는데 이 글 처럼 작업아이디 할당하는게 좀더 깔끔한듯
난 바닐라 LTN에서 제일 궁금한게 모든 공급/요청역 이름을 통일했을때 원하는 역으로 가는게 확실하게 가능한지인데 이거 되나..?
기본적으로 모든 역의 열차수 제한을 0으로 걸어둔 다음 원하는 목적지 제한 수만 1로 올리고 기차 출발시킨 다음 제한 다시 0으로 내려주면 됨
그럴려면 중간에 길찾기 다시 하는 일 없어야 할거 같은데.. 그리고 기차 제한을 2 이상으로 하고 싶으면?
가장 크리티컬한 부분이 다른 열차를 다른 역에 배정하기 위해 다른 역의 제한 수를 올리는 순간 기존에 달리던 열차가 튈 가능성이 있는게 문제인건데, 이걸 막기 위해서 새로 여는 목적지 입구에 철도신호 설치하고 이걸 회로 이용해서 강제로 빨간불로 고정시키면 원래 달리던 열차는 길찾기를 다시하더라도 새로 연 목적지는 패널티가 크기 때문에 굳이 그곳으로 안감. 하지만 새로 출발할 열차는 목적지가 거기밖에 없기 때문에 패널티가 크더라도 출발하겠지
기차 제한 2대 이상하고 싶으면 첫번째 열차는 배정때는 1까지만 잠깐 열었다가 닫고, 추가 배정하고 싶은 열차가 있다면 그때는 2까지 열었다가 닫으면 되지 않을까
내가 생각좀 해봤는데, 회로통제가 잘 된다면 1씩 열 필요가 없음. 그냥 10이고 100이고 큰 수로 열어도 어차피 0으로 닫을 거니까.
ㅇㅇ대기역에서 열차가 출발하는 조건도 회로로 제어할거면 그래도 되지. 출발조건 제어를 안한다면 100대가 우르르 나갈테고
이거 정보처리기사 공부하면서 본 것 같은데.. 컴퓨터의 공유자원 관리기법이잖아