Skip to contentSkip to conversation

Call to the scheduler...

DISCUSSION Damien TOURAINE 3 participants 4 messages Jul 24, 2001 – Jul 25, 2001

lore
Share & tools
lore
#0 lore raw

Hi !
I would like to implement a system to actively wait something but without eating a lot of CPU.
Thus, I would like to know if there is any way to force the scheduler of Linux to pre-empt the current process/thread, like the "sginap(0)" function within IRIX. Moreover, I don't want to have to be root to execute such function.

Friendly
Damien TOURAINE

#1 lore raw
Quoted 11 lines · Damien TOURAINE

Hi !
I would like to implement a system to actively wait something but without eating a lot of CPU.
Thus, I would like to know if there is any way to force the scheduler of Linux to pre-empt the current process/thread, like the "sginap(0)" function within IRIX.
Moreover, I don't want to have to be root to execute such function.

Friendly
Damien TOURAINE

Try sched_yield(). Accounting may still be messed up so the process may be 'charged' for CPU time that it gave up. Also, usleep(n) works very well with accounting working.

This works, does not seem to load the system, but top shows 99+ CPU time usage:

main()

{
    for(;;) sched_yield();

}

This works and top shows nothing being used:

main()
{

    for(;;) usleep(1);

}

Cheers,
Dick Johnson

Penguin : Linux version 2.4.1 on an i686 machine (799.53 BogoMips).

I was going to compile a list of innovations that could be attributed to Microsoft. Once I realized that Ctrl-Alt-Del was handled in the BIOS, I found that there aren't any.

#2 lore raw
Quoted 4 lines · Richard B. Johnson

Try sched_yield(). Accounting may still be messed up so the process may be 'charged' for CPU time that it gave up. Also, usleep(n) works very well with accounting working.

Quoted 8 lines

This works, does not seem to load the system, but top shows 99+ CPU time usage:

main()

{
    for(;;) sched_yield();

}

This may not be an accounting problem. If the system has nothing else to do, it'll just re-schedule your yielding thread.

How much of that 99% cpu usage is user and how much of it is system? Basically what the above does is beat the scheduler to death...

Quoted 8 lines

This works and top shows nothing being used:

main()
{

    for(;;) usleep(1);

}

And here you DO block for a bit without getting called back immediately.

I don't think that's an accounting thing, I think it's different behavior. (Could be wrong, as always...)

Quoted 3 lines

Cheers,
Dick Johnson

Rob

#3 lore raw
In reply to Richard B. Johnson
Quoted 13 lines · Rob Landley
Quoted 11 lines · Richard B. Johnson

Try sched_yield(). Accounting may still be messed up so the process may be 'charged' for CPU time that it gave up. Also, usleep(n) works very well with accounting working.

This works, does not seem to load the system, but top shows 99+ CPU time usage:

main()

{
   for(;;) sched_yield();
Quoted 6 lines
Quoted 2 lines

}

This may not be an accounting problem. If the system has nothing else to do, it'll just re-schedule your yielding thread.

How much of that 99% cpu usage is user and how much of it is system? Basically what the above does is beat the scheduler to death...

In my case, as the process/thread that call the "sched_yield();" function "actively" waits for another process/thread finish its job, the process won't be the only one in the queue of activ job ... Then, it won't use 99% of the time ...

Quoted 11 lines
Quoted 9 lines

This works and top shows nothing being used:

main()
{

   for(;;) usleep(1);

}

And here you DO block for a bit without getting called back immediately.

However, I would like to know the scheduler frequency to switch between tasks. If it's above 1 us, the usleep don't match my requirements ...

However, thanks for your quick and pertinent answer !

Friendly
Damien TOURAINE