Busy Wait の課題

Menu

以下の kbhit 関数の実装を調べる

ssh://futenma/net/home/hg/teacher/kono/os/ex/keyrecord

int kbhit(int fd){

    int c;
    fd_set readers,readfds;
    struct timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = 0;
    FD_SET(fd,&readers);
    readfds = readers;
    c = select(1,&readfds,(fd_set *)0,(fd_set *)0,
                                            &timeout);
    if (c<=0) return 0;
    if (! FD_ISSET(0,&readers)) return 0;
    return 1;

}

kbhit_test.c は、contorl - C を押すと止まるように書いたが、実際には止まらない。バグを指摘して修正せよ。


epoll/kevent

Mac OS X/BSD Unix には、kevent というのがある。Linux には、epoll という API がある。

kbhit に対応する関数を select ではなくて、kevent/epoll で実装せよ。

これを用いて、kbhit_test を動かして、CPU usage に差があるかどうか調べよ。


CPU usage を下げる

kbhit_test の動作を変えないようにしながら、CPU usage を下げるにはどうすれば良いか。

hint

      usleep
      select のオプション
      epoll/kevent のオプション


CPU usage と speed のトレードオフ

speed をどれだけ犠牲にすると、CPU usage をどれだけ下げられるか考察せよ。


Shinji KONO / Tue Jan 19 13:54:38 2010