CS/Embedded System

Real-Time Operating Systems - Semaphore

WakaraNai 2021. 12. 7. 23:08
728x90
반응형

Real-Time OS (RTOS)가 필요한 이유

[Resource Management]

  • Task scheduling : 액셀, 브레이크 처리 등등
  • I/O handling

[Services & management]

  • Resource sharing  ( lock 기법) or task synchronization
  • Timing services
  • Dynamic memory management

 

 

System organization with RTOS

desktop은 os 위에서 code가 구동되는 것과 달리

임베디드 시스템은 하드웨어 위에서 코드가 구동된다

RTOS application code : example

 

Real-Time의 특징

sensor와 actuator의 시간 제약을 통제해야 함

각 task 별로 주기적으로 실행되고 마치도록 한다든지 - 환기 시스템

 event가 발생하면 일어나도록 한다든지 (aperiodic) - 연결 끊김

 

 

Scheduling Algorithm

-> preemptive(대부분) or non-preemptive

-> 그런데 우선순위가 dynamic or static


RTOS에서 task란

main building blocks of application software written for an RTOS

 

task는 독립적으로 운영됨

- 어떤 task를 다음 번째로 run할지 RTOS가 선택

 

각 task는 own private context를 가짐 - 같은 register, counter를 사용X

  • register values
  • program counter
  • stack

그 외의 데이터(전역변수)는 모든 task에게 공유됨

process보다 thread의 개념으로 task를 이해하자

 

 

Multitasking

많은 application은 많은 task에 의해 쓰여짐

그래서 multitasking system은

다음에 실행될 task를 선택하기 위해 “scheduler” SW가 필요

RTOS에서 모든 task는 우선순위 높은 것부터 하여 스케쥴이 됨 ( Priority-driven scheduler)

 

그런데 만약 같은 우선순위를 가진다면?

 

 

Preemption 선점

1번 task라고 해도,

더 중요한 것이 들어온다면

이미 실행 중인 task를 어떻게 잠시 hold, stop할 것인가

 

  1. preemptive RTOS : 나보다 중요한 일이 들어오면, 실행 중인 것을 즉시 멈추고 그 일을 바로 실행
  2. non-preemptive RTOS: : task가 스스로 멈추는 시점을 결정. 다시 돌아와야 할 때 그 지점을 알고 있어서, 이전 상태를 복원하기 편함. 대신 내가 하던 일을 끝날 때까지 기다려야 하기에 시간 면에서의 패널티는 어쩔 수 없으니 시간 면에서 덜 민감한 상황에 적용해야 함

 

 

Scheduler

= kernel routine that decides what to run next

 

각 task는..

  • unique priority와
  • state (running, ready, blocked, interrupted)를 가짐

높은 우선순위이고 ready 상태인 task가 scheduler에 의해 선택됨

 

 

Global data - Shared Resources

교차로에서 부딪히는 사고를 방지하기 위해

신호등 같은 방법을 도입 (mutual exclusion)

교차로 중심은 semaphore  깃발을 꼽은 차만 지나갈 수 있도록

Semaphore

A semaphore is an object that limits shared access to another object. 

공유되는 자원을 누가 선점하여 사용하게 할 지

공유 자원마다 각각 semaphore를 둠

 

 type

  • binary (boolean) : simplest
  • counting (integer) original type



Semaphore Operation (Pend and Post)

pend : 깃발 가져오기

post : 깃발 반납하기

 

욕심쟁이  semaphorer는 3개 다 반납시켜 받을 수도

 

깃발을 다 주어서 남지 않았을 때

누가 깃발을 요청하면, 즉 semaphore에 pending하면 blocked시킴




Counting semaphores 사용하기

semaphore이 가진 깃발의 숫자가 

양의 수라면 이용가능하지만

음수라면 기다려야 함


semaphore를 응용하면

mutual exclusion(shared data는 한 사람만) 뿐만 아니라

signalling(synchronization)(일하고 있다고 알리기)도 가능

 

task 간 선후관계가 존재할 때 

task A가 끝나면 B에게 신호를 보내서 이제 실행해도 된다고 알리는 식

그럼 task A가 semaphore에게 깃발을 반납해야 unblock task b가 풀림

 

Semaphores vs disabling interrupts

disable interrupt는 모든 시스템이 멈추,,,지만 overhead가 적다는 장점…

semaphore는 runtime overhead는 좀 더 있지만 시스템에 적은 영향을 끼침

 

 

!! RTOS does not – cannot – enforce rules of semaphore usage.

Application programmer’s responsibilities:

 Create, initialize each semaphore.
 Use semaphores consistently throughout code.

728x90
반응형