2005-09-16 07:16:06

by Tzu-Jung Lee

[permalink] [raw]
Subject: A question about sceduling

I'm tracing the scheduling code of 2.6.12.
During the process creation, the parent process would let the child process
execute first to avoid the COW overhead.

In wake_up_new_task():

if (!(clone_flags & CLONE_VM)) {
/*
* The VM isn't cloned, so we're in a good position to
* do child-runs-first in anticipation of an exec. This
* usually avoids a lot of COW overhead.
*/
if (unlikely(!current->array))
__activate_task(p, rq);
else {
p->prio = current->prio;
list_add_tail(&p->run_list, &current->run_list);
p->array = current->array;
p->array->nr_active++;
rq->nr_running++;
}
set_need_resched();

It sets the flag to notify the kernel to reschedule.
But, the child has the same priority as it's parent and is the at the "tail"
of that priority queue.
What makes the scheduler choose the child to run before the parent?
I couldn't' find the point where the parent goes to sleep voluntarily, or
when did the scheduler put the parent behind the child.

Many Thanks
--
Roy


2005-09-16 08:54:57

by Zhang, Yanmin

[permalink] [raw]
Subject: RE: A question about sceduling

>>-----Original Message-----
>>From: [email protected]
>>[mailto:[email protected]] On Behalf Of Roy Lee
>>Sent: 2005??9??16?? 15:16
>>To: [email protected]
>>Subject: A question about sceduling
>>
>>I'm tracing the scheduling code of 2.6.12.
>>During the process creation, the parent process would let the child process
>>execute first to avoid the COW overhead.
>>
>>In wake_up_new_task():
>>
>> if (!(clone_flags & CLONE_VM)) {
>> /*
>> * The VM isn't cloned, so we're in a good position to
>> * do child-runs-first in anticipation of an exec. This
>> * usually avoids a lot of COW overhead.
>> */
>> if (unlikely(!current->array))
>> __activate_task(p, rq);
>> else {
>> p->prio = current->prio;
>> list_add_tail(&p->run_list, &current->run_list);
>> p->array = current->array;
>> p->array->nr_active++;
>> rq->nr_running++;
>> }
>> set_need_resched();
>>
>>It sets the flag to notify the kernel to reschedule.
>>But, the child has the same priority as it's parent and is the at the "tail"
>>of that priority queue.
list_add_tail(&p->run_list, &current->run_list) means insert the child into run list before parent (current)., not the tail of that priority queue.