Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Posix AIO坏/坏?_C_Posix_Sockets_Aio - Fatal编程技术网

C Posix AIO坏/坏?

C Posix AIO坏/坏?,c,posix,sockets,aio,C,Posix,Sockets,Aio,我正在研究一个TFTP实现,它正在从复杂的多线程实现过渡到单线程/单进程实现,该实现使用状态机跟踪连接会话的状态。TFTP足够简单,并发会话的数量也足够小,因此除了节省大量代码大小和复杂性之外,对软件没有任何影响 当然,当其他会话连接时,我不能只阻塞单个会话。为了解决这个问题,我的第一个想法是POSIX AIO,不过经过一些研究后,我读到它是 记录不良,不完整 仅在磁盘I/O上工作,不支持套接字,或在套接字上工作,但仅用于读/写-不用于侦听 这个链接()中包含了一个示例,不过我也找到了其他示

我正在研究一个TFTP实现,它正在从复杂的多线程实现过渡到单线程/单进程实现,该实现使用状态机跟踪连接会话的状态。TFTP足够简单,并发会话的数量也足够小,因此除了节省大量代码大小和复杂性之外,对软件没有任何影响

当然,当其他会话连接时,我不能只阻塞单个会话。为了解决这个问题,我的第一个想法是POSIX AIO,不过经过一些研究后,我读到它是

  • 记录不良,不完整
  • 仅在磁盘I/O上工作,不支持套接字,或在套接字上工作,但仅用于读/写-不用于侦听
这个链接()中包含了一个示例,不过我也找到了其他示例。2008年以前的stackoverflow post()中给出了一些额外的视角


对于C开发人员来说,AIO是否仍然像人们所说的那样破碎?人们是否真的不使用AIO,并且主要依赖于轮询/选择或有限大小的线程池?

< P>您可以考虑跨平台异步套接字库。它有很好的示例,并且有大量的文档记录。

我无法回答您关于POSIX AIO的问题,但我已经将其用于事件。小,快,简单。为IO提供了一个很好的包装器,以代替轮询/选择。

毫无疑问,文档记录得很差


大多数人确实坚持使用
poll()
/
select()
,原因很简单,因为这些都被很好地理解、测试、记录和支持。如果我是你,我会使用
select()
,除非你有令人信服的理由不这样做。

aio的问题取决于平台,因此你的决策很大一部分是针对哪个平台。质量差异很大,在某些情况下,它是通过轮询/选择类型调用实现的

在Unix平台上,人们确实倾向于使用poll/select或类似的接口,如kevent/kqueue或epoll来实现这类功能

aio接口存在问题,像aio_waitcomplete()这样的添加以及aio和kqueues的集成会带来不同


处理大量I/O的大量线程不是一个好方法。

对于磁盘,为什么必须使用AIO而不是缓冲读/写,除非您想1)使用自己的缓存2)控制对脏页的影响或3)使用IO优先级

因为如果您的目标只是代码重构,那么您可能会在当前版本中通过缓存。从缓冲IO更改为直接IO是一个巨大的变化


例如,在具有1,5G RAM的ext3/SSD/noop上,只有3个线程执行300Mb的流式写入,从而导致小的写入和读取。将违规者转换为直接IO修复了这一问题,但写入现在需要花费很长时间。

谢谢,但不幸的是,软件本身是用C编写的,可能不会更改(它将是经过认证的D级航空电子软件-我公司的编码标准要求使用C)。我想我使用“C/C++”引用有点不小心。@Robert,那太糟糕了。你可能想删除你的问题中的C++标志,这只是我之前的问题的一个副本。除了“这是否仍然有效”之外,还有什么您想知道的吗?根据POSIX AIO,它有很好的文档记录