Resoure Management
태스크나 인터럽트의 공유 자원에 대한 동시다발적인 접근을 제어하기 위해 사용되며, 모든 CC에서 제공된다.
자원 관리는 다음을 보증한다.
- 두 개 이상의 모듈이 동일한 자원을 동일한 시간에 소유할 수 없다.
- 자원을 소유하고 있는 동안 우선 순위 역전은 발생하지 않는다.
- 데드락은 발생하지 않는다.
- 태스크,인터럽트는 LIFO 원리에 따라 자원을 요청/해제할 수 있다.
Access to Resource
- DeclareResource() : 자원의 존재를 선언한다.
- GetResource() : 자원의 사용을 시작한다.
- ReleaseResource() : 자원의 사용을 마친다.
- RESOURCE 정의를 통해 시스템 구성 단계에서 정의되어야 한다.
- 우선순위 상한(Ceiling Priority) - 우선순위 역전(Priority Inversion) 처리 방법을 우선순위 상한으로 예방한다.
Restrictions
- TerminateTask, ChainTask, Schedule and WaitEvent는 절대로 불리면 안 된다.
- ISR은 자원을 소유한채 끝낼 수 없다.
Problems with Synchronization Mechanisms
Priority Inversion
task T4가 공유 자원을 소유한 채로 더 높은 우선 순위의 task T1이 실행된다. T1은 공유 자원을 요청해도 사용할 수 없기 때문에 그 다음 우선 순위를 갖는 task T2로 우선 순위가 넘어간다. 결국 task T4가 S1을 해제한 후 task T1이 실행될 수 있다. 이 경우 T1이 가장 먼저 실행되고 완료되었어야 함에도 불구하고 자원 때문에 우선 순위가 밀리는데 이를 우선순위 역전(Priority Inversion)이라고 한다.
Deadlocks
T1은 S1을 소유, T2는 S2를 소유한 채로 T1이 S2를 요청 T2가 S1을 요청할 경우 어떤 태스크도 진행이 불가능하다.
즉, 서로 다른 태스크가 서로 다른 자원을 소유한 채 다른 자원을 요청할 경우 어떤 태스크도 실행이 불가능한데 이를 교착상태(DeadLock)이라고 한다.
OSEK Priority Ceiling Protocol
각 자원에 우선순위 상한(ceiling protocol)을 부여한다. 우선순위 상한은 적어도 그 자원에 접근하는 task의 우선순위 중 가장 높은 우선순위로 설정한다. 우선순위 상한은 그 자원에 접근하지 않는 task의 우선순위보다 낮게 설정한다.
T4가 자원을 소유할 경우, T4의 우선순위가 우선순위 상한으로 변경되고 자원을 해제할때까지 해당 우선순위를 유지한다. 따라서 자원을 사용하는 T1, T2, T3는 T4보다 우선순위가 높다고 하더라도 T4가 자원을 사용하는 동안은 태스크를 돌릴 수 없다.
반면 자원을 사용하지 않은 T0의 경우 우선순위 역전과 관계가 없다. T0는 우선순위 상한보다 높은 우선순위를 갖는다. 따라서 T0은 T4가 자원을 소유하고 있더라도 중간에 CPU를 선점할 수 있다.
Preemptable Tasks and ISR
향후에 소개될 ISR의 경우 무조건 Task보다 높은 우선 순위를 갖는다. 하지만 ISR(INT1)이 공유 자원을 사용하는 인터럽트일 경우, 우선순위 상한 매커니즘을 적용받는다.
Priority Ceiling between ISR
공유 자원을 사용하는 INT1와 INT2 는 우선순위 상한에 영향을 받는다. 하지만 공유자원을 사용하지 않는 INT3는 언제든지 CPU를 선점할 수 있다.
우선순위 역전(Priority Inversion) 처리 방법
공유 자원에 여러 태스크가 접근해서 작업할 경우 우선 순위가 높은 태스크가 우선 순위가 낮은 태스크에 밀려서 우선순위 역전(Priority Inversion)이 발생하는 경우가 있다.
예를 들어 태스크 우선 순위가 태스크 A > 태스크 B > 태스크 C 3개의 태스크가 있다고 가정해 보자.
태스크 C가 먼저 실행이 되어서 공유 자원을 사용하고 있는 상황에서 태스크 A가 실행되면 선점을 할 수는 있지만 실행이 되지 못해서 우선순위 역전 현상이 발생 한다.
이때 태스크B가 실행이 되면 당연히 태스크C보다 태스크B가 우선순위가 높기 때문에 태스크B가 실행이 될테고 태스크B가 끝날 때 까지 태스크C는 실행이 되지 않아서 공유 자원을 반납하지 못한다.
그러던중 태스크B가 실행이 끝나고 태스크C가 작업을 마저 끝낸 후 공유자원을 반납한 뒤에어 드이어 태스크A가 실행이 된다.
이렇게 되면 우선순위역전되는 시간이 길어지게 되고 태스크가 많은 시스템에서 아주 큰 문제가 될 수 있다.
그렇다면 우선순위역전을 해결하기 위한 방법은 무엇이 있을까?
다음의 두가지 방법에 의해서 우선순위역전을 해결할 수 있다.
Priority Inheritance Protocol (우선순위 계승 프로토콜)
Task C가 공유자원을 사용하고 있는 도중 Task B, Task A가 실행이 되어서 공유자원에 Lock을 걸지 못하게 되면 가장 우선순위가 높은 Task의 Priority를 Task C가 상속을 받는다.
그러면 Task C가 가장 우선순위가 높아서 Task C 처리가 먼저 실행을 완료하고 공유자원을 반납하면 우선순위에 의해 Task가 선점되어서 Task A, Task B가 실행이 완료 된다.
Priority Ceiling Protocol(우선순위 상한 프로토콜)
Task C가 공유자원을 사용하고 있을 때 우선순위가 높은 Task가 실행이 되면 처리를 완료하고 공유자원을 반납할 때 까지 Task의 Priority를 늘려서 Task C 처리를 완료한다.
그뒤 우선순위에 의해서 Task B, Task A가 실행이 완료 된다.
'기술 > 개발 지식' 카테고리의 다른 글
OSEK - NM (0) | 2020.01.14 |
---|---|
OSEK - OS(3) (0) | 2020.01.13 |
OSEK - OS (1) (0) | 2020.01.10 |
OSEK - Overview (0) | 2020.01.10 |
OSEK - 역사 (0) | 2020.01.10 |