问题标签 [context-switching]

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 回答
1058 浏览

c++ - 使用 Boost 进程间代码时的高 CSwitch(“上下文切换”)(在 Windows、Win32 上)

我正在编写一个多线程应用程序。

我正在使用 boost::interprocess 类(版本 1.36.0)

本质上,我有工作线程需要在有工作可供他们执行时得到通知。

我尝试了“信号量”和“条件”两种方法。

在这两种情况下,工作线程的 CSwitch(上下文切换)似乎都非常高,例如每秒 600 次切换。

我看了一下代码,它似乎只是检查一个标志(原子地使用互斥锁),然后在下次重试之前产生时间片。

我期待代码使用 WaitForSingleObject 或其他东西。

具有讽刺意味的是,这正是我在决定“正确”使用并使用 Boost 之前的做法!(即使用互斥锁定期检查标志的状态)。唯一的区别是,在我的方法中,我在两次检查之间睡了 50 毫秒,所以我没有高 CSwitch 问题(是的,工作不会在 50 毫秒内开始对我来说很好)。

几个问题:

  1. 这个“高”的 CSwitch 值重要吗?
  2. 如果 boost 库使用 CRITICAL_SECTIONS 而不是信号量(我不关心进程间同步 - 所有线程都在同一个进程中),会发生这种情况吗?
  3. 如果 boost 使用 WaitForSingleObject 会发生这种情况吗?
  4. Boost 库中是否有另一种使用上述 Win32 等待方法 (WaitForXXX) 的方法,我认为它不会受到此 CSwitch 问题的影响。

更新:这是一个伪代码示例。我不能添加真正的代码,因为它会有点复杂。但这几乎就是我正在做的事情。这只是启动一个线程来执行一次性异步活动。

注意:这些只是插图!此示例中缺少负载,例如,如果您在线程达到“等待”之前调用 injectWork() 它将无法工作。我只是想说明我对 boost 的使用。

用法类似于:

这是使用 boost 的示例。

这是我的“天真”轮询代码:

干杯,

约翰

0 投票
3 回答
2588 浏览

java - 不必要的 Java 上下文切换

我有一个通过固定容量通道进行通信的 Java 线程网络(基于流的编程) - 在 WindowsXP 下运行。根据我们对“绿色”线程(非抢占式)的经验,我们期望的是,如果通道更大,线程切换上下文的频率会降低(从而减少 CPU 时间)。但是,我们发现增加通道大小对运行时间没有任何影响。似乎正在发生的事情是,即使通道未满或未空(即即使线程不必挂起),Java 仍决定切换线程,这会花费 CPU 时间而没有明显优势。更改线程优先级也不会产生任何明显的差异。

我的问题是是否有某种方法可以说服 Java 不要进行不必要的上下文切换,而是推迟切换,直到确实需要切换线程 - 是否有某种方法可以改变 Java 的调度逻辑?还是它对我没有注意的事情做出反应?!或者是否有其他异步机制,例如线程工厂、Runnable(s),甚至可能是守护进程(!)。答案似乎并不明显,因为到目前为止,我的通讯员都没有提出答案(包括最近的两位 CS 教授)。或者,也许我错过了一些如此明显以至于人们无法想象我不知道的东西......

我在这里添加了发送和接收代码 - 不是很优雅,但它似乎工作......;-) 如果您想知道,我认为“发送”中的 goLock 逻辑可能会导致问题,但将其删除暂时没有任何区别。我已经添加了发送和接收的代码......

public synchronized Packet receive() {

}

synchronized boolean send(final Packet packet, final OutputPort op) {

}


谢谢你的提问!我一直在 Sun 论坛上讨论同样的问题,这是我在该论坛上的最后一篇文章:

我们现在最好的猜测是,这种效果是由 Windows 的调度逻辑造成的。

微软似乎承认这个领域需要一些改进,因为它正在引入 UMS - 我引用:“UMS 推荐用于需要在多处理器或多核系统上同时有效运行多个线程的高性能要求的应用程序。...... UMS 可用从 64 位版本的 Windows 7 和 Windows Server 2008 R2 开始。此功能在 32 位版本的 Windows 上不可用。希望 Java 将在以后的某个版本中利用 UMS。

谢谢你的帮助!

0 投票
3 回答
6154 浏览

multithreading - Windows 上的上下文切换之间的时间范围是多长时间?

通过 C# 2.0 读取 CLR(我目前没有 3.0)

是否仍然如此:

如果一台计算机中只有一个 CPU,那么任何时候都只能运行一个线程。Windows 必须跟踪线程对象,并且每隔一段时间,Windows 必须决定接下来调度哪个线程以进入 CPU。这是必须每 20 毫秒左右执行一次的附加代码。当 Windows 使 CPU 停止执行一个线程的代码并开始执行另一个线程的代码时,我们称之为上下文切换。上下文切换相当昂贵,因为操作系统必须:

所以通过 C# 2.0 的 CLR 可以说我们在 Pentium 4 2.4ghz 1 core non-HT, XP 上。每 20 毫秒?在 CLR 线程或 Java 线程映射到 OS 线程的情况下,每秒最多只有 50 个线程可能有机会运行?

我已经读到在 SO 上的上下文切换在微秒内非常快,但是大致(大小风格的猜测)多久会说一个适度的 5 岁服务器 Windows 2003 Pentium Xeon 单核给操作系统提供上下文切换的机会?20ms 在正确的区域?

我不需要确切的数字我只是想确保它在正确的区域,对我来说似乎相当长。

0 投票
2 回答
459 浏览

iphone - iOS4 - 快速上下文切换

当应用程序进入后台运行状态时,有多少脏内存使用是好的。在苹果视频中提到应该尽可能减少脏内存。

但在我的应用程序中,我使用导航控制器来推送和弹出视图。从大约 20 个不同的页面移动后,脏内存使用量达到 30 MB 左右。

同样在“dismissModalViewControllerAnimated”和“popViewControllerAnimated”上,不调用 dealloc。

我有两个疑问:

  1. 可以接受多少脏内存才能上线?
  2. 导航控制器支持后退按钮的替代方法是什么?

提前致谢。

0 投票
3 回答
10399 浏览

multithreading - 如何在多核处理器上完成线程的上下文切换?

在单核处理器上进行上下文切换时,负责的代码在唯一负责切换线程的 CPU 上执行。

但是当我们有多个 CPU 时,这是怎么做到的呢?是否有一个主 CPU 可以完成所有从 CPU 的所有上下文切换?每个 CPU 是否负责自己的上下文切换?如果是这样,切换如何同步以使两个 CPU 不执行同一个线程?还是有其他机制?

0 投票
1 回答
180 浏览

multithreading - 最大限制 可以在多线程中创建的线程

我有多个线程同时被其他几个进程调用。通常最大的拇指规则。处理器可以开始提供性能效率的线程数为否。线程数 = 没有。处理器 + 1(虽然不确定)。所有现代应用程序都维护一个线程池,并在任何特定实例上继续重用线程。

我们如何确保性能不会因此而降低。因为当它超出限制时,线程会继续进行上下文切换,并且在任何单点,它们都不会执行代码的关键部分。

0 投票
3 回答
1124 浏览

java - 可以捕捉操作系统在线程上进行上下文切换吗?

我想知道如何在java中捕获被上下文切换中断的线程。我有两个线程并排运行,它们都在上下改变相同的 int,为了我的报告,我想知道如何捕捉开关并做点什么。(例如,发生这种情况时制作一个简单的 System.out)谢谢!

0 投票
2 回答
1378 浏览

linux - 线程调用系统调用时的上下文切换

我有一个多线程的进程。如果我的一个线程调用类似的系统调用gettimeofday(),内核是否仅将该线程从上下文中切换出来以服务系统调用,还是将整个进程(和所有其他线程)从上下文中切换出来?

0 投票
3 回答
635 浏览

php - PHP 上下文切换

在经典的 ASP 世界中,存在上下文切换的问题。上下文切换是您打开 PHP 标记,编写一点 php 代码,然后关闭标记,继续编写一点 HTML,然后回到 PHP 并经常进行这些切换。在 ASP 中,不建议使用这种编程风格,我们建议尽可能减少它。

换句话说,而不是在 ASP 中编写这样的代码

My name is <%response.write myName %> and I am <%response.write myage %> years of age.

我们建议编写如下代码;

<%response.write "My name is " & myName & " and I am " & myage & " years of age."%>

使用后者,ASP.DLL 花费更少的时间来解析脚本。

我的问题是这个概念/问题/担忧是否适用于 PHP 世界?

0 投票
1 回答
139 浏览

java - ObjectOutput / InputStream 的上下文切换

一个开放的 ObjectOutputStream 最初发送了一个特定的对象,并且补充的 ObjectInputStream 成功地反序列化了它。然后将此 OIS 传递给单独线程类的构造函数,该线程类需要继续无缝地读取()进一步(更新)对象。这部分没有发生。当“上下文切换”流在这里进行时,我是否有一些关于要求的问题?非常感谢。