问题标签 [thread-priority]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1793 浏览

linux - 与Linux中的进程(线程?)ID相关的优先级和调度程序策略如何?

我正在研究如何在后台运行 CPU 密集型任务时让我的 Linux 桌面体验保持流畅和交互。这是我用来模拟 CPU 负载的示例程序(用 Java 编写):

当我在命令行上运行它时,我注意到我的桌面应用程序(例如文本编辑器)的交互性显着下降。我有一台双核机器,所以我对此并不感到惊讶。

为了解决这个问题,我的第一个想法是使用renice -p 20 <pid>. 但是我发现这并没有太大影响。ls /proc/<pid>/task | xargs renice 20 -p --相反,我必须使用具有更大影响的东西来修改所有子进程。

我对此感到非常困惑,因为我不希望线程有自己的进程 ID。即使他们这样做了,我也希望renice对整个进程采取行动,而不仅仅是进程的主线程。

有没有人清楚地了解这里发生的事情? 看起来每个线程实际上是一个单独的进程(至少它有一个有效的 PID)。我知道历史上 Linux 是这样工作的,但我相信 NPTL 在几年前就已经修复了。

我正在 RHEL 5.4(Linux 内核 2.6.18)上进行测试。

(顺便说一句。如果我尝试使用sched_setscheduler(<pid>, SCHED_BATCH, ..)它来解决这个交互性问题,我会注意到同样的效果。即,我需要对我看到的所有“子”进程进行此调用,/proc/<pid>/task仅执行一次是不够的在主程序 pid 上。)

0 投票
1 回答
250 浏览

windows-7 - Windows 7:下载数据时我的程序中的 GUI 响应不佳;有什么办法可以改善吗?

我编写了一个程序,该程序(除其他外)使用 TCP 从 LAN 上的服务器下载多个大文件。这个程序在 Linux、MacOS/X 和 Windows 下运行良好(它使用 Qt 作为 GUI 和直接套接字调用网络),但在某些 Windows 机器上,下载对于机器来说似乎太多了,我想知道是否有人对为什么会这样以及可以做些什么有任何想法。

下载文件时,我的程序会生成一个单独的 I/O 线程,它基本上只是处于一个循环中,通过 TCP 下载数据并将其写入文件,每次调用 QFile:write() 写入 128KB。每个文件通常有几百兆字节长,一个典型的下载会话会写出几十个这样的文件。请注意,I/O 线程独立于 GUI 线程运行,因此我认为它不会对 GUI 的性能产生太大影响——尤其是在多核 PC 上运行时。

有问题的 PC 是 Core-2Duo Quad Q6600,运行频率为 2.40GHz,内存为 4GB。它运行的是 32 位 Windows 7 Ultimate SP1。它通过千兆以太网连接接收数据并将其写入 232GB 内部日立 ATA 驱动器的 NTFS 格式引导分区上的文件。

症状是有时在下载过程中(似乎是随机的)程序的 GUI 会在 10 到 30 秒内无响应,并且窗口的标题栏通常会附加“(无响应)”。然后症状将再次消失,下载将再次正常进行。另一个症状是下载过程中桌面非常缓慢......例如,如果我点击“开始”按钮,开始菜单将需要大约 30 秒来填充,而不是像我期望的那样几乎立即填充.

请注意,任务管理器显示了大量可用内存,但它确实显示了 CPU 使用率的短暂峰值,达到 100% 的 4 个内核之一,同时也看到了问题。

数据通过千兆以太网到达,如果我的程序只是接收数据并将其丢弃(不将其写入硬盘驱动器),机器可以保持约 96MB/秒的恒定下载速率而不会出汗。但是,如果我将接收到的数据写入文件,下载速率会降低到大约 37MB/秒,并且开始出现上述症状。

有趣的是,出于好奇,我在 I/O 线程的入口函数中添加了这个调用,就在它的事件循环开始之前:

当我这样做时,“(无响应)”症状消失了,但下载速度降低到只有 ~25MB/秒。

所以我的问题是:

  • 有谁知道当硬盘驱动器处于繁重的写入负载时可能导致 GUI 偶尔挂断的原因是什么?

  • 既然机器上有三个空闲内核,为什么降低 I/O 线程的优先级会导致下载率下降这么多?我认为在这种情况下,即使是较低优先级的线程也会有足够的 CPU 可用。

  • 有没有办法在不导致 Windows 桌面响应和/或我的应用程序的 GUI 响应出现问题的情况下获得最大下载速率?

0 投票
8 回答
1286 浏览

java - 在 Win7 中运行多线程 Java 项目的零星问题

我正在从事一个内存和计算密集型项目。执行的很大一部分使用了多线程FixedThreadPool。简而言之; 我有1 个BlockingQueue线程用于从多个远程位置(使用 URL 连接)获取数据并使用要分析的对象填充 a以及选择这些对象并运行分析的n 个线程。编辑:见下面的代码

现在这个设置在我运行 OpenSUSE 11.3 的 Linux 机器上运行起来就像一个魅力,但一位同事正在运行 Win7 的非常相似的机器上测试它,正在收到队列轮询超时的自定义通知(见下面的代码),实际上有很多。我一直在尝试监视她机器上的处理器使用情况,并且似乎软件没有获得超过 15% 的 CPU,而在我的机器上,处理器使用率达到了顶峰,正如我所期望的那样。

那么,我的问题是,这可能是队列“饥饿”的迹象吗?会不会是生产者线程没有获得足够的 cpu 时间?如果是这样,我该如何给池中的一个特定线程更高的优先级?

更新: 我一直在试图查明问题,但并不高兴……但我确实获得了一些新的见解。

  • 使用 JVisualVM 分析代码的执行表现出一种非常特殊的行为。这些方法在 CPU 时间的短时间内被调用,其间有几秒钟没有进展。对我来说,这意味着操作系统以某种方式在进程中踩刹车。

  • 禁用防病毒和备份守护程序对此事没有任何重大影响

  • 通过任务管理器(此处建议)更改 java.exe(唯一实例)的优先级也不会改变任何内容。(话虽这么说,我不能给java“实时”优先级,而不得不满足于“高”优先级)

  • 分析网络使用情况显示了良好的数据流入和流出,所以我猜这不是瓶颈(虽然它是流程执行时间的相当大一部分,但我已经知道并且几乎与我在我的 Linux 机器上得到了什么)。

关于 Win7 操作系统如何限制我的项目的 cpu 时间的任何想法?如果不是操作系统,那么限制因素可能是什么?我想再次强调,这台机器没有同时运行任何其他密集型计算,除了我的软件之外,cpus 上几乎没有负载。这真让我抓狂...

编辑:相关代码

该类QueryingAction是一个简单的类Runnable,它调用指定QueryService对象中的数据采集方法,然后填充一个BlockingQueue. 该类AnalysisActionMyObject.

0 投票
2 回答
2676 浏览

javascript - 有没有办法将 Web Worker 设置为低优先级?

我正在考虑在用户浏览我的网站时使用 Web Workers 提供一些后台功能(这就是 Web Workers 的用途,对吧?)。但是,我不想冒险通过导致延迟滚动、无响应的控件等来影响用户体验。Web Worker 映射在 OS 线程上,因此我希望对这些线程的优先级进行一些控制,但到目前为止据我所知,当前的 API 中没有这样的东西。你知道如何做到这一点吗?即使有黑客攻击?

0 投票
1 回答
6082 浏览

c# - 更改线程优先级

我正在尝试更改线程的优先级,但无法使其正常工作。我制作了一个按钮,可以在低和高之间切换优先级,当我在作业列表中检查它时,优先级会发生变化。但是CPU使用率没有改变。我想知道这是否只是因为我没有使用完整的 CPU 能力,或者这是怎么回事。

我不是在问这是否是个好主意。我在问怎么做。

这是我更改优先级的方法。这是类后面的代码:

0 投票
1 回答
13633 浏览

android - 更改线程优先级没有效果

我正在尝试使用更改主线程的优先级android.os.Process.setThreadPriority()。我在优先级更改之前和之后都有日志消息,这里是代码:

我得到以下输出:

这意味着优先级没有改变,无论我用什么方法来评估它。 android.os.Process.THREAD_PRIORITY_DISPLAY = -4,所以在改变我的输出后应该等于-4,为什么它保持不变?为什么android.os.Process.setThreadPriority()没有效果?

PS我阅读了关于线程的谷歌文档,但我没有遇到任何解释和之间区别的android.os.Process.getThreadPriority()问题Thread.currentThread().getPriority()。为什么这些方法返回不同的值?

PPSThread.currentThread().setPriority()工作正常。

0 投票
1 回答
461 浏览

linux - Linux 上的 CFS 优先级调度程序

如何避免孩子继承父母的 cgroup?

在我的系统中,我有一些 cgroup 层次结构,其中一个进程在某个特定的 cgroup 下运行,它产生了一些进程,而子进程默认在同一个 cgroup 下运行,但我不希望它继承父 cgroup。有没有办法通过使用一些API来做到这一点?

0 投票
1 回答
796 浏览

linux - 不错的价值观与静态优先级(Linux 调度)

我想了解 nice 值(用于SCHED_OTHER调度)和静态值(用于SCHED_RR& SCHED_FIFO{1..99} 和 0 用于SCHED_OTHER)之间的区别。

0 投票
3 回答
556 浏览

.net - Real Time priority in .Net

I have an application that feeds audio data to a FTDI device via the D2XX interface. It works perfectly while my application has focus, and uses very little CPU (5%). But when I hammer the CPU (by switching to other applications, or heavy drawing) sometimes I can produce a stutter in the audio.

I tried many things to prevent this (Process/Thread priorities to real-time, MMCSS scheduling, etc), but it still occurs sometimes.

Is there any other way left to raise priorities, or is it impossible without writing a kernel driver?

0 投票
1 回答
884 浏览

c# - 如何使进程具有高优先级(关键)

我有一个与外部串行端口协商的 win CE 应用程序。

串口协议有一些限制规则。例如:

如果您收到一个 ANNOUNCE 信号,您应该在 3 毫秒后发送您的 ACKNOWLEDGE 信号,否则您的协商失败!

所以我需要以高优先级模式运行我正在运行的进程(并且虽然正在运行监听线程)。我认为操作系统应该延迟/推迟所有不重要的任务(它包括所有形式的绘画、重新绘画、更新等)。结果,UI 在某些时候可能没有响应,但这并不重要。

我想知道是否有办法/解决方法来实现这个目标。