问题标签 [context-switch]

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

windows - 来自多个进程的线程是否实际上同时运行

在具有 2 个物理 x86/amd64 处理器 (P0 + P1) 的 Windows 操作系统中,运行 2 个进程 (A + B),每个进程有两个线程 (T0 + T1),是否可能(甚至常见)看到以下内容:

P0:A:T0同时运行P1:B:T0

然后,在 1(或者是 2?)上下文切换之后(es?)

P0:B:T1同时运行P1:A:T1

简而言之,我想知道 - 在多处理器机器上 - 操作系统是否可以随时从任何进程中调度任何线程,而不管来自其他进程的其他线程已经在运行。

编辑: 为了澄清这个愚蠢的例子,假设进程 A 的线程 A:T0 与处理器 P0(和 A:T1 到 P1)具有亲和力,而进程 B 的线程 B:T0 与处理器 P1 具有亲和力(和 B:T1 到 P0 )。这些处理器是核心还是插槽可能并不重要。

进程上下文切换是否有一流的概念?Perfmon 在 Thread 对象下显示上下文切换,但在 Process 对象下不显示任何内容。

0 投票
3 回答
2662 浏览

embedded - 上下文切换时间 - RTOS 和处理器的作用

在确定上下文切换的时间方面,RTOS 起主要作用还是处理器起主要作用?这两个主要参与者在确定上下文切换时间方面所占的百分比是多少。

谁能告诉关于 uC/OS-II RTOS ?

0 投票
2 回答
620 浏览

c - 测量 ContextSwitch 时间 C (Windows)

我需要实现一种可以测量 Windows 中线程之间上下文切换的时间和 CPU 周期的方法。

这是我的代码

注意:除以二,是因为我在 initialTimeStamp 和 finalTimeStamp 之间有两个上下文切换。

我不知道这是否是最好或正确的方法......每次执行我得到不同的时间,这不是我所期望的。我不确定如何获得多个 CPU 周期。

0 投票
2 回答
4176 浏览

c# - Process.Start() 不在同一用户下生成新进程

我一直认为,当您运行一个进程(domain\user) mydomain\myuser时,使用Process.Start()它时会使用相同的凭据启动这个新进程 - mydomain\myuser

我遇到的问题是我的Process.Start()调用似乎是在 SYSTEM 帐户下创建一个进程,这导致我在启动的进程中出现权限问题(由于它所做的工作,它必须在管理员帐户下运行)。如果它改变了事情 - 我正在从windows installer 中生成这个过程(一个自定义构建的 exe) 。

有什么建议么?我已经阅读了有关 Windows 组策略(可能)对此产生影响的信息,但如果我说实话,它对我来说已经丢失了。

编辑:一个小片段:

其中exenamecommandLine是此方法主体的参数:

0 投票
1 回答
1887 浏览

linux-kernel - 在linux内核中,数据结构thread_struct同时包含esp0和esp字段,有什么区别?

这是我的猜测:

esp0 用内核栈顶地址初始化。内核栈分配时,在进程切换时用于初始化tss->esp0,以便上下文从用户态切换到内核态时,可以定位到内核栈;而esp用于保存进程切换时要调度的进程的内核栈顶。

所以 thread_struct 中的 esp0 一旦初始化就不会改变,而 esp 会改变。

我的猜测对吗?

0 投票
1 回答
1050 浏览

multithreading - 如何在 Windows 中获取上下文切换通知(7)

对于某些 RTOS,有一些事件,甚至是在内核切换到甚至切换出线程时调用的标注函数。在 pSOS 中,它被称为 TaskSwitchCallout。在这种情况下,我们将有代码来增加计数器,从而我们知道线程占用了多少 CPU 时间。在 Qnx 中,您可以订阅在内核切换到任务时发生的事件并执行相同的计数器增量。

Windows中是否有等价物?通常在 Windows 下,我们无法确定相对于系统中运行的其他线程(阅读:托管代码)何时准确地切换了线程上下文。

请不要问我为什么要这样做,我不能谈论它。但是我可以说 Windows perfmon 中的上下文切换计数器是不够的。但我认为 perfmon 中的上下文切换计数器必须从某个地方获取它的信息......我试图在每个线程的基础上访问某个地方。

谢谢!!

0 投票
2 回答
3658 浏览

javascript - 在 JavaScript 中模拟上下文切换?

我一直致力于在 JavaScript 中实现一个非常复杂的系统,该系统需要模拟多线程进程等。在真正的多线程进程(例如内核线程)中,可以通过上下文切换在线程之间切换。这是有效的,因为您可以将当前进程的程序计数器和寄存器存储到一个临时结构中,为其他进程恢复程序计数器和寄存器,然后从您在前一个进程中中断的地方恢复。

我很好奇是否有可能在 JavaScript 中有类似的东西。我目前不知道如何做到这一点,因此一直在使用协作多任务设计系统。特别是,我想在多线程模拟器中运行的任何“函数”都被拆分为一函数。为了执行“函数”,我遍历函数数组,按顺序执行每个函数,同时维护下一个要执行的函数的“程序计数器”。这允许我通过调用数组中的一个函数来模拟上下文切换,等待函数返回,然后切换到需要执行的其他一些函数数组。

我目前的方法有效,但是在这个系统中编写代码很困难。每个函数都必须明确指出何时可以中断,并且由于数组中的函数都是独立的,因此函数不同部分之间的数据通信逻辑很复杂。我希望得到更接近抢先式多任务工作的东西。

我的问题是:是否可以通过外部源暂停和恢复任意 JavaScript 函数的方式运行它?

0 投票
4 回答
1612 浏览

java - Java 如何管理对数组元素的多线程访问?

各位程序员好。我已经问了一个问题,但尽管我得到了非常好的答案,但我无法解决我的问题。然后,我花时间重构我的代码,以提高它的并行化潜力(通过更少的计算批次和更多的计算任务)。但是我仍然不能有比串行处理更好的性能。

我怀疑这种缓慢的并行处理是由于上下文切换造成的。或者可能是由于公共对象的“自动”同步。我想你可以帮助我了解发生了什么。

让我陈述一下我的情况:我正在编写一个用于科学计算的程序。它不依赖于外部事物,只依赖于我在开始时给它的输入值。这个问题的大小可以通过Ns(这是我使用的名称)来衡量。它可以看作是解的“分辨率”,是用户输入的一种,通常在 100 左右。

这样,我的主类中有几个双精度数组,例如 double ys[Ns][N]or phiS[Ns][Nord][N],其中 N 和 Nord 是程序的其他固定量值。在我的程序中,我必须为每个Ns点计算几件事,这就是并行化。每个点计算都是独立的,所以我可以将它们分成不同的线程并希望它变得更快。

因此,我没有使用循环,而是for (int i=0; i<Ns; <i++)将此计算任务划分为 Runnable 批次,每个批次都在一个较小的区间内:for (int i=start; i<end; i++),其中 start 和 end 始终介于 0 和 Ns 之间。例如,如果我在双核 PC 上,我会制作两批,一批使用start = 0and end = Ns/2,另一批使用start = Ns/2and end = Ns。如果我在四核上,第二批将不得不start = Ns/4等等end = Ns/2(假设在每种情况下划分都是准确的)。

每个 Batch 作为实现 Runnable 的类,都存储在 a 中ArrayList<Batch>,并赋予 aFixedThreadPool大小等于内核数。CountDown它使用简单的方案执行批处理并等待它们完成。

这些批次中的每一个都需要从程序的主类访问这些数组上的数据,但是它们的访问是这样的,每个批次只能从yS[start][]to读取yS[end][],因此两个批次永远不会尝试读取相同的数组元素。我想知道 Java 是否仍然锁定 yS,即使每个批次都没有尝试访问与其他批次相同的元素。

我还想知道我的问题是否与上下文切换导致的开销有关,因为每个批次都需要处理数千个双打,以及程序的构建方式是否会影响它。

也许我应该找到一种方法将与其相关的数组元素传递给每个批次,但我不知道如何解决这个问题。如果有指针,我可以通过简单的指针操作获得仅包含所需元素的新数组,而无需重新分配任何内容。有没有办法在 Java 中做这样的事情?

好吧,最后,提一下:有一部分代码需要同步(它处理其他数组)并且它已经可以正常工作了。我上面描述的计算任务并不是我的程序唯一要做的事情。它们在一个循环中,与顺序处理部分交替,但作为总执行时间确实很重要。

所以,总而言之,问题是:为什么我没有从多线程中获益,当我期望的时候?

我刚刚在这里运行了几次普通串行和多线程程序,串行和多线程分别为 14500 毫秒和 15651 毫秒。两者都在同一个双核上。其他需要注意的点:在串行运行中,每个计算任务(从 0 到 Ns)大约需要 1.1 到 4.5 ms。从双线程开始,每批(Ns/2 个点)大约需要 0.5 到 3 毫秒;(从上到下测量 run() 方法。每次计算任务因它自己的数值收敛而异)

非常感谢您的关注。

0 投票
2 回答
5763 浏览

php - 使用 Zend Action Helper ContextSwitch 创建自定义 JSON 响应对象

我通常将一个编码的 json 对象附加到响应正文中,但是我现在有一种情况需要使用 ContextSwitch 操作助手。

我有一个 Zend_Form 需要三个不同的响应上下文:

  1. html - 将表单呈现为布局中的普通 html。
  2. html-partial - 仅将表单呈现为 html 的 ajax “获取”请求。
  3. json - 返回任何表单验证错误消息的 ajax“发布”请求。

对于每个上下文,我有 3 个视图脚本。虽然两个 html 上下文可以使用相同的视图脚本,但我还没有弄清楚这是否可能。

  • 表单.phtml
  • form.html.phtml
  • form.json.phtml

html 上下文视图工作正常,但 json 视图没有被拾取。覆盖默认 json 后回调行为或将自定义编码对象传递给响应正文的最佳方法是什么?

0 投票
1 回答
1767 浏览

mysql - 有没有办法确定是什么导致 Linux 上的上下文切换?

我知道 vmstat 可以告诉你上下文切换,而 MPSTAT 会告诉你 intr/s。但是,您如何确定生成上下文切换的原因。哪个进程/中断/线程触发了切换?

我有:

红帽企业 Linux 服务器 5.2 版 (Tikanga)

当系统不忙时,上下文切换为 10K,但当系统忙时,则变为 40K。此服务器上的 MySQL 很忙,但我想了解是什么驱动了上下文切换。