Согласно этой статье опрос против выбора против событий :
select () использует (максимум) три бита данных на дескриптор файла, а опрос () обычно использует 64 бита на дескриптор файла.В каждом вызове системного вызова poll (), таким образом, нужно намного больше копировать в пространство ядра.Небольшой выигрыш для select ().
Вот реализация fd_set (найдена в Советы: множественные приложения Структура fd_set битовый массив переполнение индекса
#ifndef FD_SETSIZE
#define FD_SETSIZE 1024
#endif
#define NBBY 8 /* number of bits in a byte */
typedef long fd_mask;
#define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
#define howmany(x,y) (((x)+((y)-1))/(y))
typedef struct _types_fd_set {
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
} _types_fd_set;
#define fd_set _types_fd_set
Итак, в конце, fd_set это просто массив long
. Также записано:
При вызове FD_SET бит устанавливается в 1 с использованием номера сокета в качестве индекса:
, что означает, что если я получил сокет с номером 5, элемент с индексом 5 будет выбран, а его первый бит будет переключен с 0 на 1. Поскольку select()
использует 3 бита, я думаю, что другойдва бита предназначены для отправки и получения. Верно ли это? Почему select()
использует long, когда ему нужно только 3 бита?
Также, как указано выше, poll()
использует 64 бита для проверки. Почему poll
нужно проверять каждый бит в pollfd
структуре? Вот структура pollfd
:
struct pollfd {
int fd; // the socket descriptor
short events; // bitmap of events we're interested in
short revents; // when poll() returns, bitmap of events that occurred
};
Общее количество битов в структуре составляет 64 бита, для 32-разрядного типа int и двух 16-Я знаю, что обычным способом проверки флага битов является использование оператора AND (&)
для фильтрации другихнеактуальные биты.Относится ли это к этому делу?