임베디드/임베디드 레시피

선점형 Multitasking

twoweeks-within 2024. 12. 14. 19:47

선점형 (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()을 해주기 전까지는 자기가 실행되겠다는 의미

 

Non-preemptive

 

 

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 사용권을 치고 들어올 수 있음

 

Preemptive

 Task A가 실행되는 동안 >  더 높은 Priority의 Task B >또 중간에 C > 또 중간에 D

궁금)
Task A가 Running 중, 어떻게 B Ready 상태? Task C  : Ready 상태?

// Ready 상태 : Signal을 받아야함 , 자기 혼자 ready X 

    >  " Interrupt "

 

Preemptive 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