Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

В окончательном решении проблемы мультиплексирования каналов, предложенном в данном разделе, используется

epoll
. Оно очень похоже на другие примеры, вот только определенная часть кода инициализации перемещена в новую функцию
addEvent
для предотвращения нежелательного удлинения программы.

 1: /* mpx-epoll.c */

 2:

 3: #include <fcntl.h>

 4: #include <stdio.h>

 5: #include <stdlib.h>

 6: #include <sys/epoll.h>

 7: #include <unistd.h>

 8:

 9: #include <sys/poll.h>

10:

11: void addEvent(int epfd, char * filename) {

12: int fd;

13: struct epoll_event event;

14:

15: if ((fd = open (filename, O_RDONLY | O_NONBLOCK)) < 0) {

16: perror("open");

17: exit(1);

18: }

19:

20: event.events = EPOLLIN;

21: event.data.fd = fd;

22:

23: if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event)) {

24: perror("epoll_ctl(ADD)");

25: exit(1);

26: }

27: }

28:

29: int main(void) {

30: char buf[4096];

31: int i, rc;

32: int epfd;

33: struct epoll_event events[2];

34: int num;

35: int numFds;

36:

37: epfd = epoll_create(2);

38: if (epfd < 0) {

39: perror("epoll_create");

40: return 1;

41: }

42:

43: /*
открыть оба канала и добавить их в набор epoll */

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

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

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

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник