- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
aio_write() 和 O_NONBLOCK write() 有什么区别?此外,我使用 O_NONBLOCK 函数将 write() 用于使用文件描述符的文本文件,并通过在函数前后放置一个计时器来将性能与 aio_write() 进行比较。
当字符串的长度增加时,write() 函数似乎需要更长的时间来写入文件,但 aio_write() 仍然保持大约相同的时间。
为什么会这样? NONBLOCK 和异步有什么区别?
谢谢
最佳答案
使用 O_NONBLOCK write(),write() 调用将接受(即,复制到内核缓冲区)您传递给它的全部、部分或不接受任何数据(如果接受了一些字节,写入() 的返回值将指示它接受了多少字节...如果没有接受,write() 将返回 -1 并且 errno 将设置为 EWOULDBLOCK)。 write() 接受的字节数将取决于此时它在内核缓冲区中有多少可用空间。在 write() 返回后,您有责任记住它接受了多少字节,然后调用 select() (或 poll() 或其他机制),以便在缓冲区中有更多可用空间时通知您.当有更多空间可用时(即在将来的某个时间),您可以再次调用 write() 以将更多字节传递到缓冲区。
aio_write() 另一方面,将“取得”您传递给该函数的数据的所有权,并稍后在它完成写出数据时通知您。使用 aio_write(),您不必担心调用只接受部分数据缓冲区;它要么接受整个事情,要么出错。这将使您的应用程序的 I/O 逻辑在这方面更简单一些;但是我认为异步 i/o 有其自身的一系列复杂因素,因此它可能并不总是成功的。 (我自己没用过aio_*(),所以不能说详细)
至于为什么 write() 函数似乎没有随着写入数据长度的增加而花费更多时间……那是因为非阻塞 write() 仅复制(无,或部分,或全部)将你传递给它的数据放入缓冲区,然后立即返回;它实际上并不等待数据进入磁盘。从你的应用程序缓冲区复制一个(相对较小的)字节序列到内核缓冲区总是很快的,并且复制的字节数永远不会大于内核缓冲区中当前可用的空白空间量,所以甚至每次 write() 复制的字节数也是有限的/很小。
关于c++ - aio_write() 和 O_NONBLOCK write() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697701/
更改或释放传递给 aio_write 以便写入文件的缓冲区是否安全。或者我应该等待操作完成?该函数是将所有缓冲区内容复制到队列还是仅复制对数据的引用? 最佳答案 来自man 7 aio: he con
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我试图从本质上模仿 sendfile(2) 的功能以异步方式使用 aio_read(3)和 aio_write(3) . 一切似乎都工作正常,除了测试大型(> 150k)文件。 我有一个简单的stru
我正在寻找 POSIX aio_write 函数的简单示例。 到目前为止我尝试过的内容 下面的内容并不是太重要。只需跳转即可回答 下面的代码创建一个文件,但不向其中写入任何内容。 aio_error
我正在将 write 重写为 aio_write,这样我就可以处理超时(而且我不想为 select 而烦恼) .我从手册页中不明白的一件事是 aio_write 怎么会失败。 对于write,我最感兴
我知道 POSIX write 函数可以成功返回,即使它没有写入整个缓冲区(如果被信号中断)。您必须检查短写并恢复它们。 但是 aio_write 有同样的问题吗?我不认为它会发生,但文档中没有提到它
我正在尝试向文件中写入一个简单的内容,但 AIO 似乎不起作用。可能是什么问题?我知道有一些不必要的额外 header 。 #include #include #include #include #i
我正在尝试使用 aio_write(1) 函数。下面的代码是我的程序。但是,aio_write() 总是返回 EINVAL。 看了EINVAL的错误原因:aio_offset、aio_reqprio、
Linux man-page for aio_write说 The buffer area being written out must not be accessed during the oper
我开始使用aio写一个简单的客户端服务器程序。我的客户端程序: int main(int argc, char const *argv[]) { int port = 6000; s
我在 Linux 2.6.16.46 上玩这段代码: io.aio_fildes = open(name, O_CREAT | O_TRUNC | O_WRONLY | O_SYNC, 00300);
我有一个 C 程序,它写入 32768 个 block ,每个 block 大小为 16K(总大小为 512MB),到运行 3.18.1 内核的系统上的 ext4 文件系统。该程序的常规写入系统调用版
我实现了需要读写的游戏服务器。所以我接受传入连接并使用 aio_read() 开始读取它,但是当我需要发送一些东西时,我停止使用 aio_cancel() 读取然后使用 aio_write ()。在
我正在尝试用“a”字符填充我的文件,我需要使用 aio_write。这是我的写作功能 int da_aio_write(const int d, struct aiocb *aiorp, void *
aio_write() 和 O_NONBLOCK write() 有什么区别?此外,我使用 O_NONBLOCK 函数将 write() 用于使用文件描述符的文本文件,并通过在函数前后放置一个计时器来
我有一个使用 linux aio_write 和 aio_read 的测试实用程序。此测试实用程序包装我的静态库并对其进行测试。这个库是多线程黑盒。 到目前为止,它运行良好。但是现在我们对这个黑盒进行
我在带有 rtkaio 库的 linux 上使用异步 io。在我的测试中,一切都完美无缺,但是,在我的实际应用程序中,我发现应该返回得非常快的 aio_write 却非常慢。将 128KB 写入 O_
我是一名优秀的程序员,十分优秀!