C 从一个描述符进行非阻塞读取的效率

C 从一个描述符进行非阻塞读取的效率,c,select,read-write,C,Select,Read Write,我开发了一个C程序,它监视来自不同来源的传入消息,并根据消息进行处理。 我的任务是只等待一个来源。 当然,等待必须是非阻塞的 做这件事最有效的方法是什么 非阻塞读取() 选择/投票/投票方式 好吧,如果消耗的cpu/时间大致相同,我将选择更简单的选项,read选项。 谢谢。选择文件描述符上有超时的。如果select的超时是无限的,请改用阻塞读取。如果您的select有一个超时,但您的程序没有执行任何其他操作,请改用阻塞读取。select在文件描述符上有一个超时。如果select的超时是无限的,请

我开发了一个C程序,它监视来自不同来源的传入消息,并根据消息进行处理。 我的任务是只等待一个来源。
当然,等待必须是非阻塞的

做这件事最有效的方法是什么

  • 非阻塞读取()

  • 选择/投票/投票方式

  • 好吧,如果消耗的cpu/时间大致相同,我将选择更简单的选项,read选项。
    谢谢。

    选择文件描述符上有超时的
    。如果select的超时是无限的,请改用阻塞读取。如果您的select有一个超时,但您的程序没有执行任何其他操作,请改用阻塞读取。

    select
    在文件描述符上有一个超时。如果select的超时是无限的,请改用阻塞读取。如果您的select有一个超时,但您的程序不执行任何其他操作,请改用阻塞读取。

    使用非阻塞读取()有一些缺点:

    • 当数据输入速度非常慢时,程序会频繁而不必要地唤醒,这会浪费CPU资源
    • 当数据确实进入时,如果程序处于睡眠状态,它可能不会立即读取数据,因此程序的延迟将很差
    • 使用这种模式处理大量文件描述符将变得很麻烦
    但是如果您的数据太小,使用select/poll将进行系统调用(
    read
    ),以便多次调用

    为了更简单,我认为使用select/poll更好。

    使用非阻塞读取()有一些缺点:

    • 当数据输入速度非常慢时,程序会频繁而不必要地唤醒,这会浪费CPU资源
    • 当数据确实进入时,如果程序处于睡眠状态,它可能不会立即读取数据,因此程序的延迟将很差
    • 使用这种模式处理大量文件描述符将变得很麻烦
    但是如果您的数据太小,使用select/poll将进行系统调用(
    read
    ),以便多次调用


    为了更简单,我认为使用select/poll更好。

    还有一种方法可以为每个源代码生成单独的线程,并使用blocking
    read()
    <代码>效率最高-没有简单的答案,我认为这个问题太宽泛了。我曾经见过同一个http服务器的多个实现在linux上使用了所有可能的方法——每个实现都有不同的缺点(客户端数量、消息大小、响应时间等等)。回答这个问题几乎是不可能的,这取决于您的体系结构(还有bsd
    kqueue()
    )-对于某些内核版本,一种方法可能比另一种更快。如果您正在等待单个源,请使用阻塞读取。非阻塞API适用于您有其他事情要做而不是等待的情况。还有一种方法可以为每个源生成单独的线程,并使用阻塞
    read()
    <代码>效率最高-没有简单的答案,我认为这个问题太宽泛了。我曾经见过同一个http服务器的多个实现在linux上使用了所有可能的方法——每个实现都有不同的缺点(客户端数量、消息大小、响应时间等等)。回答这个问题几乎是不可能的,这取决于您的体系结构(还有bsd
    kqueue()
    )-对于某些内核版本,一种方法可能比另一种更快。如果您正在等待单个源,请使用阻塞读取。非阻塞API适用于您有其他事情要做而不是等待的情况。