시분할의 개념과 필요성


시분할의 필요성


동시에 여러 개의 신호를 이동시키는 루프를 어떻게 설계할 수 있을지 생각해보고 가능한 여러 가지 방법들을 비교해 보자. 세 개의 신호 M1, M2, M3를 동시에 움직이고 싶을 때 다음과 같은 루프를 작성할 수 있다.

 

for (;;) {

     M1 이동

     M2 이동

     M3 이동

}

 

매 루프를 돌 때마다 M1, M2, M3를 한 칸씩 이동시키는 루프인데 이렇게 하면 세 개의 신호가 동시에 이동하기는 하지만 속도가 일정할 것이다. 속도의 차이를 주려면 각 신호가 한 번에 얼마만큼 이동할 것인지를 지정하는 값이 있어야 한다. 이 값을 speed 멤버로 정의하고 각각 1,2,3으로 준다면 M1이 한 칸 움직일 때 M2는 두 칸, M3는 세 칸 움직여 속도의 차이가 발생할 것이다.

그러나 이렇게 되면 속도가 빠른 신호는 한 번에 여러 칸을 움직이기 때문에 매끄러워 보이지 않는다. 그래서 이동 속도를 정수로 줄 수는 없으며 실수를 사용해야 한다. 1 미만의 실수로 이동 속도를 정의하면 한 번에 두 칸씩 이동하지 않으면서도 부드럽게 이동 처리된다. 하지만 실수를 쓰게 되면 속도가 느려지는 큰 문제점이 있고 또한 실제로 이동하지 않는 신호에 대해서도 지속적으로 좌표를 갱신하고 출력까지 해야 한다는 문제가 있다. 좌표가 바뀌지도 않았는데 지웠다 그림으로써 속도는 더 느려지고 화면은 계속 깜박거려 품질도 떨어진다.


좀 더 좋은 방법은 속도를 이동 거리로 통제하는 것이 아니라 주기로 통제하는 방식이다. 이 개념을 시분할(Time Sharing) 방식이라고 하는데 시간을 아주 잘게 조각내어 시간을 필요로 하는 대상에게 나누어 주는 것이다. 운영체제가 멀티 태스킹을 하는 기본 방식이 바로 시분할이다. 이때 분할된 시간을 시간 조각(Time Slice, 퀀텀이라고 한다.)이라고 한다. 각 신호가 몇 번의 시간 조각에 대해 한 번 움직일 것인가를 기억하는데 Signal 구조체에서 nFrame이 바로 이 정보이다. 가령 M1, M2, M3에 대해 nFrame이 3, 4, 6으로 정의되어 있다면 이 신호들은 다음과 같이 움직일 것이다.

이동 주기가 다름으로 해서 M1이 네 번 움직일 때 M2는 세 번밖에 움직이지 못하며 M3는 두 번만 움직일 것이다. nFrame이 클수록 신호의 이동 주기는 길어지고 이동 속도는 느려진다. 이동 주기는 정수이므로 느리지 않으며 또한 주기가 되지 않은 신호는 좌표를 갱신할 필요도 없고 다시 그릴 필요도 없어 실수를 쓰는 방법보다 훨씬 더 좋다.


출저: Win32 Api 연구 사이트

이 글을 공유하기

댓글

Designed by JB FACTORY