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

Троан Эрик В.

Шрифт:

 12: #include <stdlib.h>

 13:

 14: #include <sys/select.h>

 15:

 16: int gotAlarm;

 17:

 18: void catch(int sig) {

 19: gotAlarm = 1;

 20: }

 21:

 22: #define OFFSET 10

 23:

 24: int main(int argc, const char ** argv) {

 25: int pipeFds[2];

 26: int count;

 27: int numFds;

 28: struct pollfd * pollFds;

 29: struct epoll_event event;

 30: int epfd;

 31: int i;

 32: struct rlimit lim;

 33: char * end;

 34:

 35: if (!argv[1]) {

 36: fprintf(stderr, "ожидалось число\n");

 37: return 1;

 38: }

 39:

 40: numFds = strtol(argv[1], &end, 0);

 41: if (*end) {

 42: fprintf(stderr, "ожидалось число\n");

 43: return 1;

 44: }

 45:

 46: printf("Запуск теста для %d файловых дескрипторов.\n", numFds);

 47:

 48: lim.rlim_cur = numFds + OFFSET;

 49: lim.rlim_max = numFds + OFFSET;

 50: if (setrlimit(RLIMIT_NOFILE, &lim)) {

 51: perror("setrlimit");

 52: exit(1);

 53: }

 54:

 55: pipe(pipeFds);

 56:

 57: pollFds = malloc(sizeof (*pollFds) * numFds);

 58:

 59: epfd = epoll_create(numFds);

 60: event.events = EPOLLIN;

 61:

 62: for (i = OFFSET; i < OFFSET + numFds; i++) {

 63: if (dup2(pipeFds[0], i) != i) {

 64: printf("сбой в %d: %s\n", i, strerror(errno));

 65: exit(1);

 66: }

 67:

 68: pollFds[i - OFFSET].fd = i;

 69: pollFds[i - OFFSET].events = POLLIN;

 70:

 71: event.data.fd = i;

 72: epoll_ctl(epfd, EPOLL_CTL_ADD, i, &event);

 73: }

 74:

 75: /* с помощью signal выяснить, когда время истекло */

 76: signal(SIGALRM, catch);

 77:

 78: count = 0;

 79: gotAlarm = 0;

 80: alarm(1);

 81: while (!gotAlarm) {

 82: poll(pollFds, numFds, 0);

 83: count++;

 84: }

 85:

 86: printf("Вызовов poll в секунду: %d\n", count);

 87:

 88: alarm(1);

 89:

 90: count = 0;

 91: gotAlarm = 0;

 92: alarm(1);

 93: while (!gotAlarm) {

 94: epoll_wait(epfd, &event, 1, 0);

 95: count++;

 96: }

 97:

 98: printf("Вызовов epoll в секунду: %d\n", count);

 99:

100: return 0;

101: }

13.2. Отображение в памяти

Операционная система Linux позволяет процессу отображать файлы в их адресное пространство. Такое отображение создает взаимно однозначное соответствие между данными в файле и в отображаемой области памяти. Отображение в памяти обладает рядом преимуществ.

Высокоскоростной доступ к файлам. Нормальные механизмы ввода-вывода, такие как

read
и
write
, вынуждают ядро копировать данные через буфер ядра, а не непосредственно между файлом, содержащим устройство, и процессом пространства пользователя. Карты памяти устраняют этот промежуточный буфер, сохраняя копию памяти [84] .

84

Сохранение копии памяти может показаться не столь важным, но благодаря эффективному механизму кэширования Linux, эти задержки копий являются самой медленной частью записи в файлы данных, в которых нет набора

O_SYNC
.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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