sleep(0)はなにもしない。システムコールも呼ばない。
for(;;);
当然CPU使用率は100%になる。
for(;;)sleep(0);
これもCPU使用率は100%になる。
sleep(1)などではシグナル関連の制御をもりもりおこなうところだけど、sleep(0)ではstraceで見てもほんとうになにもしてない。
for(;;)usleep(0);
CPU使用率はほぼ0になる。straceで見ると、nanosleep()が呼び出されている。これは即座に返る。
struct timespec t={}; for(;;)nanosleep(&t,NULL);
システムコールを呼ばないということは、コンテキストスイッチもおきないので、yield()の代わりにsleep(0)を呼ぶのは意味がない。そういう使い方するならusleep(0)を呼んだほうがいいっぽい。
わざとエラーになるようなシステムコールの呼び方、例えばnanosleep(NULL,NULL)のときにコンテキストスイッチするかどうかは知らない。