- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了一个程序,它(除其他外)使用 TCP 从 LAN 上的服务器下载多个大文件。这个程序在 Linux、MacOS/X 下运行良好,通常在 Windows 下也能正常运行(它使用 Qt 作为 GUI,使用直接套接字调用网络),但在某些 Windows 机器上,下载似乎太多,机器无法处理,我想知道是否有人对为什么会这样以及可以采取什么措施有任何想法。
当下载文件时,我的程序会生成一个单独的 I/O 线程,该线程基本上处于一个循环中,通过 TCP 下载数据并将其写入文件,每次调用 QFile:write() 写入 128KB。每个文件通常有几百兆字节长,典型的下载 session 会写出几十个这样的文件。请注意,I/O 线程独立于 GUI 线程运行,因此我认为它不会对 GUI 的性能产生太大影响——尤其是在多核 PC 上运行时。
有问题的 PC 是运行频率为 2.40GHz 的 Core-2Duo Quad Q6600,具有 4GB 内存。它运行的是 32 位 Windows 7 Ultimate SP1。它通过千兆以太网连接接收数据,并将其写入 232GB 内部 Hitachi ATA 驱动器的 NTFS 格式引导分区上的文件。
症状是有时在下载过程中(看似随机)程序的 GUI 一次会变得无响应 10 到 30 秒,并且窗口的标题栏通常会附加“(无响应)”给它。然后症状将再次消失,下载将再次正常进行。另一个症状是桌面在下载过程中非常缓慢...例如,如果我单击“开始”按钮,“开始”菜单将需要大约 30 秒来填充,而不是像我预期的那样几乎立即填充.
请注意,任务管理器显示大量可用内存,但它确实显示 4 个内核之一的 CPU 使用率出现短暂峰值,达到 100%,同时出现问题。
数据通过千兆以太网到达,如果我的程序只接收数据并将其丢弃(不将其写入硬盘驱动器),则机器可以保持大约 96MB/秒的恒定下载速率而不会中断出汗。但是,如果我将接收到的数据写入文件,下载速率将下降到大约 37MB/秒,并且开始出现上述症状。
有趣的是,出于好奇,我将这个调用添加到我的 I/O 线程的入口函数中,就在它的事件循环开始之前:
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
当我这样做时,“(无响应)”症状消失了,但随后下载速度降至仅约 25MB/秒。
所以我的问题是:
有谁知道当硬盘驱动器处于高写入负载下时,可能导致 GUI 偶尔挂起的原因是什么?
既然机器上有三个空闲核心,为什么降低 I/O 线程的优先级会导致下载速率下降如此之多?我认为在这种情况下,即使是较低优先级的线程也会有足够的 CPU 可用。
有什么方法可以在不导致 Windows 的桌面响应和/或我的应用程序的 GUI 响应出现问题的情况下获得最大下载速率?
最佳答案
没有看到任何代码很难回答,但这似乎与处理器有关,而且您的下载线程没有为其他线程留出任何空间来执行其他操作。
好像是从不等待,网卡驱动没写好。当没有数据传入时,您确定您的线程进入空闲状态吗?在具有单个处理器的操作系统中,a for (;;) {} 将消耗 100% 的 CPU,如果它持续与内核对话,它可能会停止其他进程或其他线程来执行此操作,尤其是在存在错误或非常糟糕的行为时在您的情况下的某些网卡驱动程序中。
可能将线程优先级设置为低于正常值,您是在要求操作系统减少使用线程的频率,这是一种神奇的组合,可以让事情不会挂得太久。检查代码,也许您忘记了什么?
检查添加 sleep(0) 以强制操作系统在某个时候让步给另一个线程是否会让事情变得更好,但这是一个临时修复,你应该找出你的线程消耗 100% cpu 的原因,如果是的话。
关于windows-7 - Windows 7 : poor GUI response in my program while downloading data; is there some way to improve this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856251/
我认为这个问题说明了一切,但我有一个使用 .net 安装工具包的应用程序(在 vs.2005 中),并且用户问我是否可以将它安装在 c:\Program Files\ProgramName 而不是C:
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 Stephen Wolfram 的忠实粉丝,但他绝对是一个不怕自吹自擂的人。在许多引用资料中,他将 Mathematica 颂扬为一种不同的符号编程范式。我不是 Mathematica 用户。
我现在正在使用 Squeak4.1 学习 SmallTalk。我使用 Squeak by Example 作为教程,在这里我反驳了一个 delema,“Morphic 是由...开发的,用于自编程语言
Wikipedia有话要说: Total functional programming (also known as strong functional programming, to be cont
在阅读 Paul Graham's Essays 时, 我对 Lisp 越来越好奇了。 在this article ,他提到最强大的功能之一是您可以编写可以编写其他程序的程序。 我无法在他的网站或其他
我知道 functional programming 有几个定义。 .我认为这是一个模糊的类别。我个人的定义是接近' referential transparency '。 这个问题不是“函数式编程的
我注意到许多顶尖大学都开设了类(class),在这些类(class)中,学生将学习与计算机图形学相关的 CS 专业科目。可悲的是,这是我的大学没有提供的东西,我真的很想在 future 几年的某个时候
我正在安装100%托管代码的.NET(C#)应用程序。安装程序(InnoSetup)始终希望将应用程序安装到Vista x64中的“Program Files(x86)”文件夹中,我认为这是因为安装程
假设在 C 中,我们有以下结构: struct MyData { char key1[20]; long key2; ... /* some data */ }; 本质上,除
这个问题已经有答案了: When should I use ampersand with scanf() (3 个回答) 已关闭 6 年前。 所以我在python3中有这个“程序”,它添加了3个字符串
我编写了一个包含 self 更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。如果安装了应用程序,这将完美地工作,例如在用户主目录中,如果它安装在 C:\
注意:标记为社区维基。 是否有一个很好的分析为什么可视化编程语言仍然没有起飞?这些天我们仍在 80x25 文本窗口中“线性”编码;而我们表示的概念(数据结构、算法)似乎可以更直观地表示出来。 最佳答案
我一直在阅读Code Complete 2 .由于我不是以英语为母语的人,因此我需要一些时间才能理解某些陈述。我希望你描述作者在他的书中所做的这两个陈述之间的区别: You should progra
我在为我的 tomcat 设置 CLASSPATH 时遇到了这个问题。我需要在 tomcat 的 CLASSPATH 中引用我的 2 个安装。其中一个位于 C:\Program Files\Postg
这个问题已经有答案了: How can I lock a file using java (if possible) (8 个回答) 已关闭 6 年前。 我有 2-3 个程序可以修改文件,但如果有一个
我 checkout Reading stdout from one program in another program却没有找到我要找的答案 我是 Linux 的新手,我正在使用 Python 中
我有一个程序可以打印出通过或失败。我想检测卡在那里的程序并回显“超时” 我写了这样一个脚本: #!/bin/bash echo -n 'test' && timeout 5 ./mytest | gr
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
请求:每个进程需要计算自己的组到所有点的距离。我的代码如下: #include stdio.h #include stdlib.h #include math.h #include string.h
我是一名优秀的程序员,十分优秀!