Reviews / articles about OS/2 |
Operating systems: ArcaOS, eComStation, IBM OS/2 Warp |
|
|
DATE: 2001-08-14 00:32:52 AUTHOR: nickk
Моя EMX программа кушает много CPUЕсли вы скомпилировали программу-демон с помощью gcc и заметили, что она кушает слишком много CPU на общем уровне (смотреть надо не абсолютные, а относительные показатели, например, с помощью top) даже во время простоя, проверьте, используете ли вы функцию select. Если это так, попробуйте заменить ее на нижеследующую функцию: int ibm_select( int *fds, int n_read, int n_write, int n_exept, long timeout); int os2_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) /* We are using the EMX select() call if non-socket handlers are presented in sets and IBM select() otherwise. EMX select() causes high CPU usage in polling loop. */ { fd_set *fds[3] = { readfds, writefds, exceptfds }; int fd_os2[FD_SETSIZE * 3], fd_emx[FD_SETSIZE * 3]; int n_fd[4], n = 0; int i, k, s; long ibmtimeout = -1; for(k = 0; k < 3; k++) { n_fd[k] = n; if(!fds[k]) continue; for(i = 0; i < nfds; i++) { if(!fds[k]->fds_bits[i>>5]) { i += 31; continue; } if(!FD_ISSET(i, fds[k])) continue; s = _getsockhandle(i); if(s < 0) return select(nfds, readfds, writefds, exceptfds, timeout); else { fd_os2[n] = s; fd_emx[n++] = i; } } } n_fd[3] = n; if (timeout) ibmtimeout = timeout->tv_usec/1000 + timeout->tv_sec*1000; s = ibm_select(fd_os2, n_fd[1]-n_fd[0], n_fd[2]-n_fd[1], n_fd[3]-n_fd[2], ibmtimeout); if(s == 0) /* Timeout */ return 0; if(s < 0) { /* Error */ if(sock_errno() == 10004) /* SOCEINTR */ errno = EINTR; else errno = EINVAL; return -1; } i = 0; for(k = 0; k < 3; k++) { n = n_fd[k+1]; for( ; i < n; i++) if(fd_os2[i] < 0) FD_CLR(fd_emx[i], fds[k]); } return s; } Где функции ibm_select и sock_errno() берутся из so32dll.dll: ; ibmtcp.imp ; -------- so32dll entry points -------- ibm_select so32dll 12 ? sock_errno so32dll 20 ? Чтобы получить либу с этими функциями, запустите: emximp -o ibmtcp.a ibmtcp.imp. Почему надо менять EMX'овый select на вышеприведенный, вкратце написано в комментарии к ней - "EMX select() causes high CPU usage in polling loop". Впрочем, если вы используете select только файловые хэндлы, то лучше ничего не меняйте - никакого выигрыша от этого не будет. Для справки, данной функцией успешно пользуются последние и не очень последние OS/2 билды squid, bind, sshd, wget... Сделаем EMX лучше ! :) Автор статьи: nickk
Комментарии: |
|
||||||||
(C) OS2.GURU 2001-2021