Welcome to eComStation.RU site!

Select your language: Russian English Deutch Spanish Italian Portuguese Czech Polish French

Frequently asked questions and answers:

eComStation.RU

ru · en · de · es · it · pt · cz · pl · fr
eComStation - это совершенно другая операционная система для PC (IBM OS/2 Warp)
Программы, новости, статьи, поддержка пользователей, оборудование, вопросы и ответы.
 
      Что такое OS/2?НовостиУстановкаОбновлениеПрименениеБудущееСообществоКупить    
(Карта сайта)

 
 
Отчет: OS/2 совместимое оборудование
Как получить драйверы OS/2 бесплатно

 
Обновление

 
Программы

 
(Санкт-Петербург)

 
Преимущества (1)

 
Разработчику (1)

 
(Пайпы программ)

 
Компании: (1)

 
История (1):

 
(Бонусы)

 
Советы:

 
(Барьеры и решения)

 
Технологии: (1)

 
(Применение в науке, лаборатории, ..)

 

 
Готовые решения:

 
Новая eComStation:

 
Будущее: (1)

 
(Ссылки на другие сайты)

 
(Картинка дня)

 
Артефакты OS/2

 
Гаджеты

 

Моя 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

Попробуй программу:

Как готовить флешки (USB винчестеры и другие USBMSD устройства), чтобы eComStation могла их увидеть?

Комментарии:

Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).


Ваше имя:

Ваш E-Mail:

CODE:
......

  

Ваш комментарий:


Что такое eComStation? Вместе создаем операционную систему + 2-3 раза в год посещаем конференции + плюс общение с людьми и востребованность.

Статьи

Операционная система
Программное обеспечение
Оборудование
Для разработчика
Разное
Колонка редактора


Готовая eComStation на SSD диске

 

Самая комментируемая новость за неделю: ArcaOS 5.01 еще две недели





Последний активный опрос: Какая высота барьера RPM?

Самая комментируемая новость за месяц: ArcaOS 5.01 еще две недели

IBM OS/2 Warp

 
Обучение новичков

Отчет: OS/2 совместимое оборудование

 
Статьи


   
  Почему eComStation?
Возможности
Особенности
Применение
Ролики и скриншоты
   eComStation для
для бизнесменов
для студентов и инженеров
для продавцов компьютеров
сообщество пользователей
   Разработчик
Распространить программу
Описание API, библиотеки
Начать новый проект
Конкурсы
   Программы
Он-лайн каталог
Выбрать через eCo Market
   Служба поддержки
Отправить вопрос
Купить eComStation
Вопросы и ответы
Обучение новичков
 
 
© 2001 - 2014 eCo Software, All rights reserved
eComStation is a registered trademark of Serenity Systems International
OS/2 Warp is a registered trademark of IBM Corporation
 

 

 
Картинка дня: