Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

44: addEvent(epfd, "p1");

45: addEvent(epfd, "p2");

46:

47: /* продолжать, пока есть один или более файловых дескрипторов

48: для слежения */

49: numFds = 2;

50: while (numFds) {

51: if ((num = epoll_wait(epfd, events,

52: sizeof(events) / sizeof(* events),

53: -1)) <= 0) {

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] = '\0';

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
, и в результате гораздо лучше масштабируется.

82

Эту программу необходимо запускать от имени root для наборов, содержащих более 1000 дескрипторов.

83

Настоящее тестирование не гарантирует статистическую точность. Был проведен лишь один тестовый прогон, поэтому результаты поначалу будут неустойчивыми, что, однако, исчезнет после большого количества повторов.

Таблица 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
717097
50000
38
729746
100000
18
712301

1: /* poll-vs-epoll.с */

2:

3: #include <errno.h>

4: #include <fcntl.h>

5: #include <stdio.h>

6: #include <sys/epoll.h>

7: #include <sys/poll.h>

8: #include <sys/signal.h>

9: #include <unistd.h>

 10: #include <sys/resource.h>

 11: #include <string.h>

  • Читать дальше
  • 1
  • ...
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: