2.6커널은 진짜 preempt가 아닌것같은데요....
2.6커널의 preempt_schedule()입니다.
그런데 preemt가 발생하는 부분을 보니 조건이있군요.
preempt_count가 0이어야한다는거죠..
그러니까 A,B,C 프로세스가 실행중이라고 할경우 각 priority가
A=1 , B=2 , C=3 이라고하면...(A가 가장높음)
C가 실행중 B가 preempt_schedule()하면 B가 실행되는데 이상태에서
A가 preempt_schedule()하면 preempt가 되지 않지 않나요?
그렇다면 진정한 preempt가능한 커널이 아닌것 같은데요..
1611 asmlinkage void preempt_schedule(void)
1612 {
1613 struct thread_info *ti = current_thread_info();
1614
1615 /*
1616 * If there is a non-zero preempt_count or interrupts are disabled,
1617 * we do not want to preempt the current task. Just return..
1618 */
1619 if (unlikely(ti->preempt_count || irqs_disabled()))
1620 return;
1621
1622 need_resched:
1623 ti->preempt_count = PREEMPT_ACTIVE;
1624 schedule();
1625 ti->preempt_count = 0;
1626
1627 /* we could miss a preemption opportunity between schedule and now */
1628 barrier();
1629 if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
1630 goto need_resched;
1631 }
선점형 커널은 2.6 에 보면 compile 옵션에서 본것 같은데 ^^
혹시 커널을 마이그레이션하면 해결할수 있는문제가 아닐까 해봐서
남겨봅니다. 커널 설정 옵션에서 선점형 커널 옵션이 있더군요 ^^
Dig it.
Re: 2.6커널은 진짜 preempt가 아닌것같은데요....
preempt_count는 프로세스의 priority를 나타내는게 아닙니다.
preempt_disable()이 호출 될 때마다 preempt_count는 1이 증가되고 preempt_enable()이 호출될 때마다 반대로 1이 감소됩니다.
즉 preempt_count > 0이면 preempt될 수 없고, preempt_count = 0이면 preempt될 수 있습니다.
spinlock같은 경우에 preemption disable이 필요하죠.
커널의 schedule방식을 잘 못 이해하고 계시는 것 같네요.
preempt_schedule을 호출하는 프로세스가 scheduled-in되는 것이 아니라 scheduled-out이 됩니다.
댓글 달기