1. What is the Real Time? ¶
리얼 타임이라는 말은 Timing 의 correctness (정확성)에 의해 결정되는 말이다. 이러한 리얼타임은 대략 두가지 부류를 가지고 있다.
Soft / Hard 가 그 두가지 예라고 할 수 있다. Soft Real Time 이란 말은 Task 의 수행이 가능하면 보다 빠르게 진행 될 수 있게 만들어진시스템을 말한다.
예를 들어 High Priority를 가진 Task가 선점형 수행을 하며 다른 Task 보다 많은 자원을 사용할 수 있을 때를 말한는것 같다.
반에 Hard System이란 특정 시간내에 Task의 작업이 완수 되어야 하는 작업들을 말한다. 대부분의 Real-Time 시스템에서는 두가지
시스템의 혼합을 필요로한다.
1.1. Real Time System 의 사용 범위 ¶
실제로 이러한 전반적인 부분에서 쓰이는 지는 모르겠다. 요즘 가전 제품들이 보다 우수해져서 이러한 리얼타임이 필요하지만 책에 나온 예는 과한 것 같다.
책에 나온 예는 다음과 같다. 참고적으로 알아 두었음 한다.
Food processing, Chemical plants, Engine controls, Antilock braking systems, Fax machines, ETC
1.2. Foreground / Background System ¶
작은 시스템에서는 시스템의 효율성을 위해 보단 간편하고 일반적인 디자인을 사용한다고 한다. 실제로 어플리케이션이 작동하는 부분을 Background System이라고 하며 ISR (interrupt service rountines) 라고 불리우는 인터럽트 부분을 Foreground system이라고 한다.
ISR부분은 크리티컬 섹션에 의해 보호되며 시스템의 효율성을 높이기 위해서는 보다 짧은 ISR 이 필요하다.
1.3. Critical Section of Code ¶
크리티컬 섹션 또는 크리티컬 리젼이라 불리우는 이 부분은 커널과 관련된 중요 부분에서 인터럽트로 인한 커널의 손상을 막기 위해 불리우는 곳이며 또한 수행시간의 단축이 절대적으로 필요한 부분에서 쓰이는 구간이다. 이는 코드와 자원의 공유를 막고 배타적인 공간으로 설정된다.
태스크에 의해 쓰여지는 빈 공간을 말한다. 이러한 리소스는 I/O , Printer , Memory ,
KeyBoard 가 될 수 있으며 다른 기타 자원도 있다.
1.5. Shared Resource ¶
공유 자원이란 하나 이상의 Task가 같은 자원을 쓸 경우를 말한다. 두 Task는 배타적으로 같은 Resouce에 접근을 하며 Data의 파손을 방지한다. 이러한 방식을 mutual exclusion (상호 배타성) 이라고 한다.
1.6. Multitasking ¶
멀티태스킹이란 프로세스의 스케줄과 CPU의 스위칭에 의해 복수의 Task가 실행되는 것을 말한다. 또한 멀티태스킹이란 Back/Fore Ground 처럼 복수의 Task가 운영되는 것을
말한다.
태스크는 thread라고도 불린다. 이는 하나의 태스크가 하나의 Stack과 TCB를 가진 경량 프로세스이다.
태스크의 상태는 다음과 같은 상태가 있다.
DORMANT :: 태스크가 메모리 상에는 존재하나 아직 활성화 되지 못한 상태
READY :: 런닝을 하기 전 준비된 상태,우선순위가 낮아 아직 활성화 되지 않은 상태
RUNNING :: 지금 활동 중인 상태
WAITING :: 이벤트를 기다리며 휴식 중인 상태
ISR(interrupted) :: 인터럽트를 수행 중인 상태
1.8. Context Switch ( or Task Switch) ¶
문맥전환이라 불리우는 이 과정은 하나의 태스크에서 다른 태스크로 작업이 이전 되기 위한 과정을
말한다. 이렇게 하기 위해서는 지금 수행 중인 태스크의 환경(레지스터,변수등)을 저장공간(스택)에
저장하고 전환 되고자 하는 태스크의 환경을 읽어들여야 가능할 것이다.
커널은 멀티태스킹에서 태스크의 관리를 수행하며 또한 태스크 사이에서의 통신을 담당한다. 또한
커널은 CPU 시간을 측정하며 세마포어,메세지,큐등과 같은 서비스를 제공한다.
스케쥴러는 DISPATCHER라고도 불리우며 우선순위가 높은 태스크를 수행시킨다.
1.11. Non - Preemptive Kernel (비 선점형 커널) ¶
새로운 높은 순위의 태스크는 현재 낮은 우선순위의 태스크가 CPU를 포기했을 때 권한을 갖는다.
이러한 비선점형 커널은 인터럽트 네스팅이 낮다.또한 수행중인 태스크가 다른 태스크에 의해
수행이 중단되는 상황도 막을 수 있다.
1.12. Preemptive Kernel (선점형 커널) ¶
선점형 커널은 시스템의 반응성이 중요할 때 쓰인다. 선점형 커널의 경우 커널이 우선순위가 높은
태스크로의 전환을 확실히 해 준다. 만약 우선순위가 높은 태스크가 준비상태라면 바로 인터럽트가
되고 지금 수행중인 태스크는 멈추며 높은 태스크로의 문맥전환이 이루어진다.
말 그대로 재진입이 가능한 함수를 말하는 것입니다. 태스크가 하나의 함수로 이루어져있으므로 재진입을
위해서는 함수에서 쓰일 변수에 대해서 전역으로 설정해 놓으면 안되겠져 만약 전역으로 설정하고 다시 진입하
게 된다면 다른 Task들에 의해 그 값이 바뀌어져 있을 수도 있습니다. 그러므로 Task에서 쓰일 변수/메모리는
Task Stack 에 값을 저장하여 해당 Task로 다시 진입했을 때 스택에서 꺼내 그 값을 복원하는 방법이 있겠습니다.
다음은 재진입이 가능한 코드와 불가능한 코드의 예이다.
가능 코드
~cpp
void strcpy (char * dest , char * src){
while (*dest++ = *src++) {
;
}
*dest = NUL;
}
불가능 코드
~cpp
int Temp; // 언제 바뀔지 모르는 전역 변수
void swap(int *x,int *y)
{
Temp = *x;
*x = *y;
*y = Temp;
}
위와 같은 경우 Temp를 지역변수로 두어 태스크의 스택에 값이 저장 되면 될 것 같다.
1.14. Round Robin Scheduling ¶
같은 우선권을 갖는 태스크끼리는 같은 수행 시간 만큼 작동 되게 만들어지는 방식으로
Time Slicing 이라고도 한다. 또한 이 수행 시간을 quantum 이라고 한다.
1.15. Task Priority ¶
말 그대로 태스크의 우선권이다. 마이크로씨 오에스에서는 높은 우선권을 갖은 태스크가
수행되도록 만들어 졌다.
1.16. Static Priority ¶
태스크가 수행하는 동안 태스크의 우선순위가 바뀌지 않는 것을 말하는 데 리얼타임에서는
대부분의 태스크가 그러하다
1.17. Dynamic Prioirty ¶
위와 반대 되는 상황으로 필요에 따라 우선순위가 바뀔 수 있는 데 이러한 점은 수행시간의
변화를 가져오므로 리얼타임에서는 사용되지 않는다.
1.18. Priority Inversions ¶
우선순위 반전 시나리오. 우선순위가 바뀌어야 할 상황을 시나리오로 풀어 나타낸 것.
1.19. Assigning Task Priorities ¶
우선순위 할당은 가벼운 문제는 아니다. 이는 대부분의 시스템에서 중요한 것으로 간주된다.
그리고 덜 치명적 중요한 태스크는 낮은 우선순위가 주어질 것이다.
대부분의 리얼타임에서는 SOFT/HARD 리얼타임의 적절한 조합으로 쓰여진다.
SOFT에서는 가능한 보다 빠른 실행을 중시하며 특정시간에 꼭 작업을 마칠 이유는 없다. 반에
HARD에서는 정확히 그리고 정해진 시작에 작업을 마쳐야 한다.
- Rate Monotonic Scheduling (RMS)
- 얼마나 자주 TASK가 수행되어 지느냐에 따라 할당되는 우선순위
- 간단히 자주 실행되는 TASK가 높은 우선 순위를 갖는다는 말....
- Figure 2.9를 보면 알 수 있다.
- RMS 에 대한 가정들 ....
- 모든 TASK는 정기적으로 수행 된다.
- TASK들은 동기적이지 않다...-> 이 말은 다른 TASK들과 대화하며 공유하므로 동기적으로 실행 되지 않는다는 것.
- CPU는 가장 높은 우선순위를 갖는 TASK를 수행한다는 점.
~cpp
식은 다음과 같다.
-- E(i) 1/n
> ---- < n ( 2 - 1 )
-- T(i)
i
으흐 알아 보겠나...
1.24. Intertask Communication ¶
1.35. Advantages and Disadvantages of Real-Time Kernels ¶