Как заменить select () на kevent () для повышения производительности? - PullRequest
6 голосов
/ 22 апреля 2011

со страницы Kqueue Википедии :

Kqueue обеспечивает эффективный конвейер событий ввода и вывода между ядром и пользовательским пространством. Таким образом, можно модифицировать фильтры событий, а также получать ожидающие события, используя только один системный вызов kevent (2) для каждой итерации цикла основного события. Это контрастирует с более старыми традиционными системными вызовами опроса, такими как poll (2) и select (2), которые менее эффективны, особенно при опросе событий по большому количеству файловых дескрипторов

Звучит великолепно. Я ориентируюсь на FreeBSD для своего сервера, и я обрабатываю значительное количество сетевых сетевых сокетов - использую select () для них всех и выясняю, с кого читать данные. Я бы предпочел использовать вызовы kevent () для повышения производительности, поскольку это то, что нужно!

Я прочитал справочную страницу для kevent во FreeBSD здесь , но она загадочна для меня, и я не нахожу хороших ресурсов, объясняющих это. Пример использования kevent для замены select решит мою проблему, а также поможет мне лучше понять, как используется kevent ().

Ответы [ 2 ]

11 голосов
/ 25 апреля 2011

Сначала создайте новый kqueue:

int kq=kqueue();

Теперь зарегистрируйте свой fd в kq:

struct kevent kev;
kev.ident=your_fd;
kev.flags=EV_ADD | EV_CLEAR;
kev.filter=EVFILT_READ;
kev.fflags=0;
kev.data=0;
kev.udata=&your_data;

int res=kevent(kq,&kev,1,0,0,0);

Наконец, дождитесь поступления данных в ваш сокет:

struct kevent res_kevs[5];
int res=kevent(kq,0,0,res_kevs,5,0);

После возврата res_kevs[i].ident будет содержать дескриптор вашего сокета, res_kevs[i].data - количество байтов, готовых для чтения.

См. Man kevent для более подробной информации и возможностей.

0 голосов
/ 22 апреля 2011

Обычно вы используете libevent, , который позаботится обо всех ваших деталях, а также означает, что вы можете переместить свою программу в другую ОС, которая имеет другую схему (например, Linux иepoll) за что-то подобное.

...