gpt4 book ai didi

c++ - 这个程序是异步运行还是同步运行?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:19 26 4
gpt4 key购买 nike

当我运行这个程序时

OVERLAPPED o;

int main()
{
..
CreateIoCompletionPort(....);

for (int i = 0; i<10; i++)
{
WriteFile(..,&o);

OVERLAPPED* po;
GetQueuedCompletionStatus(..,&po);
}
}

WriteFile 似乎直到写入作业完成才返回。同时,调用 GetQueuedCompletionStatus()。该行为类似于同步 IO 操作,而不是异步 IO 操作。

这是为什么?

最佳答案

如果文件句柄和卷启用了写入缓存,则文件操作可能只需要将内存复制到缓存就可以完成,稍后会延迟刷新。由于没有实际的 IO 发生,因此在这种情况下没有理由执行异步 IO。

在内部,每个 IO 操作都由一个 IRP 表示(IO 请求数据包)。它由内核创建并提供给文件系统来处理请求,它通过分层驱动程序向下传递,直到请求成为实际的磁盘 Controller 命令。该驱动程序将发出请求,将 IRP 标记为挂起并返回线程的控制权。如果为重叠 IO 打开句柄,内核会立即将控制权交还给您的程序。否则,内核将等待 IRP 完成后再返回。

然而,并不是所有的 IO 操作都能到达磁盘。文件系统可能会决定写入应该被缓存,并且直到以后才写入。甚至有一个特殊的操作路径可以完全使用缓存来满足,称为 fast IO .即使您发出异步请求,快速 IO 始终是同步的,因为它只是将数据复制到缓存中和从缓存中复制出来。

Process monitor , 在高级输出模式下,显示不同的模式,并在 IRP 挂起时在状态字段中显示空白。

写入缓存中允许未完成的数据量是有限制的。一旦填满,写入操作将不会立即完成。尝试使用 may 操作一次写入大量数据。

关于c++ - 这个程序是异步运行还是同步运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/830708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com