2016-09-01 5 views
3

Я пытаюсь понять, как epoll() отличается от select() и poll(). select() и poll() довольно похожи. select() позволяет отслеживать несколько файловых дескрипторов и проверяет, доступен ли какой-либо из этих файловых дескрипторов для операции (например, чтение, запись) без блокировки. Когда истекает время ожидания, select() возвращает дескрипторы файлов, которые готовы, и программа может выполнять операции над этими файловыми дескрипторами без блокировки.Что означает select() и poll(), являются апатридами?

... 
FD_ZERO(&rfds); 
FD_SET(0, &rfds); 
/* Wait up to five seconds. */ 
tv.tv_sec = 5; 
tv.tv_usec = 0; 
retval = select(1, &rfds, NULL, NULL, &tv); 
/* Don’t rely on the value of tv now! */ 

if (retval == -1) 
    perror("select()"); 
else if (retval) 
    printf("Data is available now.\n"); 
    /* FD_ISSET(0, &rfds) will be true. */ 
else 
    printf("No data within five seconds.\n"); 
... 

опроса() является немного более гибким в том, что он не опирается на растровом изображении, но массив дескрипторов файлов. Кроме того, поскольку poll() использует отдельные поля для запрошенных (событий) и результатов (revents), вам не нужно беспокоиться о пополнении наборов, которые были перезаписаны ядром.

... 
struct pollfd fds[2]; 
fds[0].fd = open("/dev/dev0", ...); 
fds[1].fd = open("/dev/dev1", ...); 
fds[0].events = POLLOUT | POLLWRBAND; 
fds[1].events = POLLOUT | POLLWRBAND; 
ret = poll(fds, 2, timeout_msecs); 
if (ret > 0) { 
    for (i=0; i<2; i++) { 
     if (fds[i].revents & POLLWRBAND) {  
... 

Однако, я прочитал, что есть проблема с опросом() тоже, так как выбор() и опрос() являются лицами без гражданства; ядро не внутренне поддерживает запрошенные наборы. Я прочел следующее:

Предположим, что существует 10 000 одновременных соединений. Как правило, только небольшое количество файловых дескрипторов среди них, скажем 10, готовы к . Остальные 9,990 файловых дескрипторов копируются и сканируются без причины , для каждого вызова select()/poll(). Как упоминалось ранее, эта проблема возникает из-за того, что эти интерфейсы select()/poll() являются stateless.

Я не понимаю, что подразумевается под файловыми дескрипторами, «скопировано» и «отсканировано». Скопировано где? И я не знаю, что означает «без гражданства». Спасибо за разъяснение.

ответ

4

«Без гражданства» означает «Не сохраняет ничего между двумя вызовами». Поэтому ядро ​​необходимо перестроить многие вещи, в основном ничего в этом примере.

Смежные вопросы