Messages in this thread | | | From | Nikita Danilov <> | Date | Sat, 20 Aug 2005 17:23:39 +0400 | Subject | Re: sched_yield() makes OpenLDAP slow |
| |
Howard Chu writes: > Nikita Danilov wrote:
[...]
> > > What prevents transaction monitor from using, say, condition > > variables to "yield cpu"? That would have an additional advantage of > > blocking thread precisely until specific event occurs, instead of > > blocking for some vague indeterminate load and platform dependent > > amount of time. > > Condition variables offer no control over which thread is waken up.
When only one thread waits on a condition variable, which is exactly a scenario involved, --sorry if I weren't clear enough-- condition signal provides precise control over which thread is woken up.
> We're wandering into the design of the SleepyCat BerkeleyDB library > here, and we don't exert any control over that either. BerkeleyDB > doesn't appear to use pthread condition variables; it seems to construct > its own synchronization mechanisms on top of mutexes (and yield calls).
That returns us to the core of the problem: sched_yield() is used to implement a synchronization primitive and non-portable assumptions are made about its behavior: SUS defines that after sched_yield() thread ceases to run on the CPU "until it again becomes the head of its thread list", and "thread list" discipline is only defined for real-time scheduling policies. E.g.,
int sched_yield(void) { return 0; }
and
int sched_yield(void) { sleep(100); return 0; }
are both valid sched_yield() implementation for non-rt (SCHED_OTHER) threads.
Nikita. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |