首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Procmon分析读取操作

使用Procmon分析读取操作
EN

Stack Overflow用户
提问于 2015-08-25 21:35:23
回答 2查看 1.2K关注 0票数 2

我试图分析一个基本的读取操作使用ifstream与Procmon。

用于读取操作的部分代码中,我试图从一个文件中读取16 to大小的数据:

代码语言:javascript
复制
char * buffer = new char[128000];
ifstream fileHandle("file.txt");
fileHandle.read(buffer, 16000);
cout << buffer << endl;
fileHandle.close();

在Procmon中有4个ReadFile操作,其详细信息如下:

偏移量: 0,长度:4 096,优先级:正常

偏移:4 096,长度:4 096

偏移:8 192,长度:4 096

偏移:12 288,长度:4 096

因此,这是否意味着每4kb大小有4个操作?如果是这样的话,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。

EN

回答 2

Stack Overflow用户

发布于 2015-08-25 21:44:14

因此,这是否意味着每4kb大小有4个操作?

是。

如果是这样的话,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。

可能是因为编译器附带的标准库将文件流缓冲区的默认大小设置为4KB;由于read操作必须通过缓冲区,所以必须(通过OS调用)填充它,并在满足请求之前清空4次。请注意,您可以使用fstream更改fileHandle.rdbuf->pubsetbuf的内部缓冲区。

票数 2
EN

Stack Overflow用户

发布于 2015-08-25 21:43:52

因此,这是否意味着每4kb大小有4个操作?

它就是这么说的。

如果是这样的话,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。

仅仅因为您请求16000字节,并不意味着ifstream在一次操作中实际上可以读取16000字节。文件系统通常不允许如此大的读取,通常有一个上限。即使您增加了ifstream使用内部的内部缓冲区的大小,这仍然不能保证文件系统将符合更大的读取大小。

read()的约定是,除非遇到EOF/错误,否则它返回请求的字节数。它是如何在内部完成这种读取的,这是一个实现细节。在这种情况下,ifstream必须读取四个4KB块才能返回16000字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32214514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档