Massive performance loss from OS::sleep hack
deischen at freebsd.org
Sat Sep 15 22:15:26 PDT 2007
On Sat, 15 Sep 2007, Kurt Miller wrote:
> Hello Kris,
> I recall why I added the os_sleep() call. While working on the certification
> testing one of the JCK tests was deadlocking. The test itself was faulty in
> that it created a high priority thread in a tight yield loop. Since
> pthread_yield() on a single processor system will not yield to lower
> priority threads, the higher priority thread effectively blocked the
> lower priority thread from running and the test deadlocked.
> I filed a formal appeal to have the JCK test corrected. However since the
> api states:
> "Causes the currently executing thread object to temporarily pause
> and allow other threads to execute."
> the appeal was denied. I further argued that many publications written
> by or or-authored by Sun employees state that Thread.yield() can not
> be relied upon in this fashion:
[ ... ]
It's odd that Sun would take this position since the POSIX behavior
for sched_yield() is:
The sched_yield() function shall force the running thread to
relinquish the processor until it again becomes the head of its
thread list. It takes no arguments.
The "its thread list" mentioned above is the list of threads for its
given priority. POSIX has a notion of a list of threads for each
given priority; in SCHED_RR and SCHED_FIFO scheduling the higher
priority threads will always run before lower priority threads.
Sun's defined Java behavior, or their interpretation, of Thread.yield()
is not obtainable on a POSIX compliant system using sched_yield()
(or pthread_yield()). Even using scope system threads or libthr,
the kernel scheduler should run the higher priority threads before
lower priority threads.
I suspect that Sun will eventually be forced to change their
documented behavior for Thread.yield().
More information about the freebsd-java