본문 바로가기
알고리즘 구상

[알고리즘] 데이터 Schedule

by 코딩히어로 2021. 12. 28.
728x90

데이터 스케줄링이란 말 그대로 객체지향 언어에서 하나의 통신 서로를 통해

데이터를 전송할 때 생길수 있는 문제에 대해 통신 교통정리의 생각으로 접근해서

알고리즘을 구상했고 진행했던 프로젝트에 적용하여 상용화까지 성공했습니다.

 

어떤 시스템에서 사용했냐도 중요할 텐데요

저는 Android 태블릿의 RS232 통신을 사용하는 데 있어 해당 알고리즘을 적용했습니다.

 

안드로이드 시스템은 객체지향으로 여러 Thread들로부터 RS232 통신을 전송하지만

통 신설 로자 체는 232 포트 하나가 유일하기에 각 Thread 간의 간섭이 생겼습니다.

 

 

알고리즘 구상


이 문제에 대해 생각해보던 중 아래와 같은 그림의 현재 시스템에서

각 Thread에서 동시에 RS232쪽으로 데이터를 전송한다고 하면

먼저 전송을 시작한 Thread가 전송이 완료되지 않은 시점에 다른 Thread의

전송이 요청되므로 충돌하는 문제가 발생합니다.

 

이 문제를 해결하기 위해서는 RS232 통신선로에 먼저 전송을 한 Thread가

데이터 전송을 종료할 때까지 기다린 뒤에 전송을 시작하는 방법이 가장 좋다고 생각했습니다.

 

하지만 시스템상 Thread는 다른 Thread를 기다리는 동안 각각의 시스템이 동작을 해야 하기 때문에

무작정 기다리기만 하는 것 또한 낭비입니다.

 

여기에서 등장하는 것이 바로 스케줄링 알고리즘입니다.

 

간단하게 개념 자체는 RS232 포트에 Thread가 직접 접근하는 방식이 아니라

전송하고자 하는 Data를 Shedule에 등록하면 이 Schedule 모듈은 자신에게 등록된 Data를

순서대로 하나씩 꺼내서 RS232 포트로 전송합니다.

 

이렇게 되면 Thread는 다른 Thread를 기다릴 필요 없이 Schedule 모듈에 등록만 하고

자신의 다른 시스템적인 일을 하면 됩니다.

 

 

ex) 안드로이드 프로그램 적용


먼저 Data를 등록할 수 있도록 ArrayList를 선언합니다.

다음으로 선언한 Uart_Schedule를 생성합니다.

여기까지가 Data를 등록하기 위한 실질적인 Schedule list를 만드는 방법입니다.

이제 실질적으로 데이터를 RS232쪽으로 보내줄 Handler를 하나 만들어줍니다.

이 Handler는 이제 Uart_Schedule list에 등록된 데이터가 하나라도 있으면 RS232쪽으로 보내줍니다.

UartFifo_send 함수를 보겠습니다.

여기까지가 Schedule module을 만드는 방법이었습니다.

이제 코드 어디서든

 

Uart_Schedule.add("보낼 데이터");

 

위 구문을 통해서 RS232로 데이터를 순서 신경 쓰지 않고 등록하면 됩니다.

728x90
반응형

댓글