揮発性のメモ2

知識をメモ書きしておく

sleep(0)はなにもしない

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)のときにコンテキストスイッチするかどうかは知らない。