Как оценить производительность, используя fcntl для лучшего мультиплексирования ввода-вывода? - PullRequest
0 голосов
/ 25 января 2020

Использование select / poll для мультиплексирования ввода / вывода требует, чтобы программа активно проверяла вход. Поэтому любая работа, кроме этой, должна выполняться с использованием отдельных потоков. Я исключил необходимость этого активного опроса, используя fcntl, чтобы получать сигнал, отправляемый моему процессу, когда дескрипторы файлов, которые я просматриваю, готовы к IO. Поэтому, только когда я получу сигнал, я опрошу дескрипторы и буду действовать соответственно.

Я написал рабочую программу, использующую это. Есть ли какие-либо недостатки / недостатки / потенциальные ошибки, вытекающие из этого? Существуют ли значительные издержки ядра для отправки этих сигналов? Если да, то как мне оценить производительность и сравнить ее с обычными методами?

Основа c контур / псевдокод моей рабочей программы


void hdfn(int signo)
{
    fd_set rset;
    FD_ZERO(&rset);
    int maxfd = max_of_fds + 1; //find max
    for(i : fds)
        FD_SET(i, &rset);
    select(maxfd, &rset, NULL, NULL, NULL);
    for(i : fds)
        if (FD_ISSET(i, &rset))
            //do something
}

int main()
{
    signal(SIGUSR1, hdfn);
    .....
    //open different fds
    //do something
    .....
    //loop to get a signal sent for every input
    for(i : fds)
    {
        fcntl(i, F_SETFL, O_ASYNC);
        fcntl(i, __F_SETSIG, SIGUSR1);
        fcntl(i, F_SETOWN, getpid());
    }
    while (1)
    {
        //Server does some other work until signal for IO is recieved.
    }
    return 0;
}

...