gpt4 book ai didi

c++ - 非自愿上下文切换 : How can I prevent them?

转载 作者:IT王子 更新时间:2023-10-28 23:57:29 26 4
gpt4 key购买 nike


我有一个正在运行的小应用程序,我想检查其中是否有任何内存泄漏,所以我输入了这段代码:

for (unsigned int i = 0; i<10000; i++) {
for (unsigned int j = 0; j<10000; j++) {
std::ifstream &a = s->fhandle->open("test");
char temp[30];
a.getline(temp, 30);
s->fhandle->close("test");
}
}

当我运行应用程序时,我搜索了/proc//status 以查看内存是否增加。运行约 2 分钟后输出如下:

Name:   origin-test
State: R (running)
Tgid: 7267
Pid: 7267
PPid: 6619
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 20 24 46 110 111 119 122 1000
VmPeak: 183848 kB
VmSize: 118308 kB
VmLck: 0 kB
VmHWM: 5116 kB
VmRSS: 5116 kB
VmData: 9560 kB
VmStk: 136 kB
VmExe: 28 kB
VmLib: 11496 kB
VmPTE: 240 kB
VmSwap: 0 kB
Threads: 2
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000002004
SigCgt: 00000001800044c2
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: 3f
Cpus_allowed_list: 0-5
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 120
nonvoluntary_ctxt_switches: 26475

除了最后一个值外,其他值都没有改变,那么是否意味着没有内存泄漏?

但更重要的是,我想知道的是,最后一个值快速增加(大约 2 分钟内大约 26475 次切换!)是否不好。

我查看了其他一些应用程序以比较它们有多少非自愿开关:

  1. Firefox:大约 200
  2. GDM:2
  3. Netbeans:19

然后我在谷歌上搜索并找到了一些东西,但它对我来说是技术性的理解。我从中得到的是,当应用程序切换处理器或其他东西时会发生这种情况? (顺便说一句,我有一个 AMD 6 核处理器)。

如何防止我的应用程序执行此操作以及在多大程度上这会在运行应用程序时成为问题?

提前致谢,罗宾。

最佳答案

当您的应用程序在系统调用中被阻塞并且内核决定将其时间片提供给另一个进程时,就会发生自愿上下文切换。

非自愿的上下文切换发生在当你的应用程序已经使用了调度程序分配给它的所有时间片时(内核试图假装每个应用程序都有自己的整个计算机,并且可以使用他们想要的尽可能多的 CPU,但必须从一个切换到另一个,这样用户就会产生他们都在并行运行的错觉。

在你的例子中,因为你正在打开、关闭和读取同一个文件,它可能在整个进程执行期间停留在虚拟文件系统缓存中,并且你的程序正在被内核抢占不阻塞(因为系统或库缓存)。另一方面,Firefox、Gdm 和 Netbeans 大多是在等待用户或网络的输入,不能被内核抢占。

那些上下文切换是无害的。相反,它允许所有应用程序公平地使用您的处理器,即使其中一个应用程序正在等待某些资源。≈

顺便说一句,要检测内存泄漏,更好的解决方案是使用专用于此的工具,例如 valgrind .

关于c++ - 非自愿上下文切换 : How can I prevent them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430571/

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