선점형 (Preemptive) Multitasking
: 비선점형 (Non-preemptive) Multitasking : " 하나의 Task가 Scheduler로부터 CPU를 사용권을 할당 받았을 때,
> Task가 자발적으로 CPU 사용권을 반납할 때까지 강제적으로 CPU의 제어권을 빼앗을 수 없는 방식
선점형 (Preemptive) Multitasking : Scheduler의 필요에 따라 Task로부터 CPU의 제어권을 강제적으로 빼앗음
> Task가 실행될 수 있도록 Task의 실행 순서를 결정하는 방식
Multitasking :
시분할 방식 : 동시에 뭔가를 동시 다발적으로 일을 하는 것
> 한 개의 CPU에서 여러 가지 일을 동시에 하는 것처럼 보이게 하는 것
<> Embedded System : 여러 개의 Task를 Ready 상태로 만들고,
> Task들에게 따로 따로 일을 시킬 수 있는 System
시분할 방식을 여기에 더 접합 > 동시다발적으로 동작하는 것처럼 보이게 할 수있으나
> Multitasking : X
보통) Non-preemptive Multitasking > 시분할 방식을
> 모든 task들이 동시에 실행되는 것처럼 보이는 테크닉
Non-preemptive : Task가 자발적으로 CPU 사용권을 반납할 때까지, 해당 Task가 CPU를 점유
ex) wait_signal ( 전의 Task의 구조에서 Task가 자발적으로 CPU에게 사용권 반납 )
> Task는 그 signal이 올 때 까지는 실행
> Non-preemptive : Task가 wait_signal()을 해주기 전까지는 자기가 실행되겠다는 의미
Task A, B, C, D
Non-preemptive : Task A ㅌ일 종료 >wait_signal()을 부를 때 까지 계속 실행
wait_signa()이 호출 > Task B로
Task : 무한 loop X > 일반적인 Software 처럼
> 극단적인 Non-preemptive 방식,,
> A가 끝날 때 까지는 B, C가 실행 X
이럴때야말로 시분할!
> Task A 1초, Task B 1초 : 순번을 돌리며 실행
> 여러 개가 한꺼번에 진행되는 것처럼 보임
>> 시분할 방식의 Multitasking
Preemptive
: Task A가 일하던 중 > Task B,Task C가 치고 들어올 수 있음
> Task 마다의 중요도(Priority)
> 더 높은 순위의 Priority를 가진 Task가 CPU 사용권을 치고 들어올 수 있음
Task A가 실행되는 동안 > 더 높은 Priority의 Task B >또 중간에 C > 또 중간에 D
궁금)
Task A가 Running 중, 어떻게 B Ready 상태? Task C : Ready 상태?
// Ready 상태 : Signal을 받아야함 , 자기 혼자 ready X
> " Interrupt "
Task가 실행 중에 다른 Task가 Ready가 되는 Mechanism
가장 Priority가 높은 Interrupt가 중간중간 발생
Task A를 처리중 , Priority가 가장 높은 Interrupt가 발생
> Task A를 Ready상태 >
Interrupt가 처리해야 할 일 > ISR에서 처리 중 > Task B에게 일을 시켜야겠다 > send_signal()
> Task B : Ready 상태.
Scheduler ISR을 다 처리 > Context Switching > Task B :Ready
( Task A 실행중이여도, Task B 중요도높음 > B 선택하게됨 )
Scheduler : Task B가 Running 상태가 되도록 만듦
...... Task D 실행 끝난후 > Task D : wait_signal() > CPU 실행권을 놓고 > wait 상태
Scheduler : 가장 Priority가 높은 Ready상태의 Task > C
// D는 끝났으므로
Task C : Running > wait_signal() > CPU의 실행권을 놓음 > B > A
>>
ex) Priority : customer_isr > waiter_task> cook_task
cook_task 요리 중 > 손님 : customer_isr발생
> customer_isr : waiter_task > ready로 만들고 종료
waiter_task : cook 요리 중 > 손님에게 인사 > cook에게 또 주문이 왔다고 알려줌
> DELIVER_SIGNAL > wait_signal() : wait
waiter가 Priority가 높음 > 음식을 날라주고 > 다시 wait >
cook : 또 할일 알아 챔 > 요리 > waiter에게 알려줌
void cook _task()
{
cook_task_init();
while (1)
{
wait_siganl (COOK_SIGNAL);
sig = get_signal ();
if ((sig & COOK_SIGNAL)!=0)
{
clear_signal (COOK_SIGNAL);
열심히 요리를 하자;
send_signal ( waiter_task, DELIVER_SIGNAL);
}
} /* while (1) */
}
Priority : cook < waiter
: cook 하다가 waiter 가 오면 cook 멈춘뒤 waiter running
> ISR 이 신호를 줌
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
TCB 구조 (0) | 2024.12.18 |
---|---|
TCB - Task , CS (1) | 2024.12.17 |
Task Service (1) | 2024.12.14 |
Task 구조, signal (0) | 2024.12.12 |
Embedded Software는 무한 Loop (0) | 2024.12.11 |