|
ArcaOS 5.0 Русская версия
Пакет русификации ArcaOS 5.0 OS/2 давно доступен.
Поддерживается любая версия: 5.0, 5.0.1, 5.0.2.
eCo Software может выпустить и другие пакеты
(Немецкий, Голландский, Бразильский Португальский, Испанский, Шведский и т.д.)
|
Моя EMX программа кушает много CPU |
TITLE: Моя EMX программа кушает много CPU
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
Комментарии: Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).
|
|
Готовая eComStation на SSD диске
Последний активный опрос: Какая высота барьера RPM?
[Google]
|
IBM OS/2 Warp
|