54: perror('epoll_wait');
55: return 1;
56: }
57:
58: for (i = 0; i < num; i++) {
59: /* events[i].data.fd готов для чтения */
60:
61: rc = read(events[i].data.fd, buf, sizeof(buf) - 1);
62: if (rc < 0) {
63: perror('read');
64: return 1;
65: } else if (!rc) {
66: /* этот канал закрыт, не пытаться
67: читать из него снова */
68: if (epoll_ctl(epfd, EPOLL_CTL_DEL,
69: events[i].data.fd, &events[i])) {
70: perror('epoll_ctl (DEL)');
71: return 1;
72: }
73:
74: close(events[i].data.fd);
75:
76: numFds--;
77: } else {
78: buf[rc] = ' ';
79: printf('чтение: %s', buf);
80:
81: }
82: }
83:
84: close(epfd);
85:
86: return 0;
87: }
13.1.6 Сравнение poll()
и epoll
Методы poll()
и epoll
существенно отличаются; poll()
хорошо стандартизован, но плохо масштабируется, в то время как epoll
существует только в Linux, но очень хорошо масштабируется. Приложения, наблюдающие за небольшим количеством файловых дескрипторов и переносимости величин, должны использовать poll()
, но любому приложению, которому необходимо контролировать большое количество дескрипторов, лучше применять epoll
, даже если ему нужно поддерживать poll()
для других платформ.
Отличия в производительности двух методов поразительны. Чтобы продемонстрировать, насколько лучше масштабируется epoll
, в коде poll-vs-epoll.с
измеряется количество системных вызовов poll()
и epoll_wait()
, которые можно создать за одну секунду для наборов файловых дескрипторов разных размеров (количество файловых дескрипторов для помещения в набор задается в командной строке). Каждый файловый дескриптор ссылается на считывающую часть канала, и они создаются с помощью dup2()
.
В табл. 13.1 суммируются результаты запуска poll-vs-epoll.с
для установленных размеров диапазоном от одного до 100 000 файловых дескрипторов[82]. В то время как количество системных вызовов в секунду резко падает для poll()
, оно остается почти постоянным для epoll
[83]. Как поясняет эта таблица, epoll
добавляет в систему намного меньше нагрузки, чем poll()
, и в результате гораздо лучше масштабируется.
Таблица 13.1. Результаты сравнения poll()
и epoll()
Файловые дескрипторы | poll() | epoll() |
---|---|---|
1 | 310063 | 714848 |
10 | 140842 | 726108 |
100 | 25866 | 726659 |
1000 | 3343 | 729072 |
5000 | 612 | 718424 |
10000 | 300 | 730483 |
25000 | 108 |