标签: context-switch

当 CPU 分配给用户进程时,谁在操作系统中运行调度程序?

如果有 10 个进程 P1,P2...P10,并由调度程序使用循环策略调度来访问 CPU。现在当进程P1正在使用CPU并且当前时间片已过期时,P1需要被抢占,P2需要被调度。但是既然P1正在使用CPU,那么谁抢占P1并调度P2呢?我们可能 Scheduler 会这样做,但是当 CPU 被 P1 占用时,调度程序如何运行呢?

cpu operating-system process scheduler context-switch

6
推荐指数
1
解决办法
1141
查看次数

为什么上下文切换是一个昂贵的过程并且在什么方面昂贵?

在我的操作系统课程中,考试需要了解的问题之一是“为什么上下文切换成本高昂?” 贵是什么意思,贵是什么意思?就执行任务所需的时间而言?

operating-system context-switch

6
推荐指数
1
解决办法
4423
查看次数

Java如何管理对阵列元素的多线程访问?

程序员大家好.我已经问了一个问题,但是尽管我得到了很好的答案,但我无法解决我的问题.然后,我花时间重构我的代码,以便提高其并行化潜力(通过减少计算批次,每个计算任务更多).但是我仍然无法获得比串行处理更好的性能.

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

让我说明一下我的情况:我正在制定一个科学计算程序.它不依赖于外部事物,只取决于我在开始时给它的输入值.这个问题的大小可以通过Ns(我使用的名称)来衡量.它可以被视为解决方案的"分辨率",它是用户输入之一,通常大约为100.

通过这种方式,我在我的主类中有几个双数组,例如double ys[Ns][N]或者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 = 0end = Ns/2,另一个用start = Ns/2end = Ns.如果我在一个四核,第二批将有start = Ns/4end = Ns/2等(假设分工精确时间任何情况下).

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

各该批次的需要从主类别的节目的访问这些阵列中的数据,但它们的访问使得每个批次仅读取yS[start][]yS[end][],因此分两批将永远不会尝试读取相同的数组元素.我想知道Java是否仍然锁定了yS,即使每个批次都没有尝试访问与其他元素相同的元素.

我想知道我的问题是否与上下文切换引起的开销有关,因为每个批处理需要处理数千个双打,并且如果构建程序的方式会影响它.

也许我应该找到一种方法来传递给每个批次只是与它相关的数组的元素,但我不知道如何处理它.如果有指针,我可以使用简单的指针操作获得所需元素的新数组,而无需重新分配任何内容.有没有办法在Java中做这样的事情?

好吧,最后,还要提一下:有一部分代码需要同步(它处理其他数组)并且它已经正常工作.我上面描述的计算职责不是我的程序所做的唯一事情.它们位于循环内,与顺序处理部分交替,但作为总执行时间非常重要.

总而言之,问题是:为什么我没有获得多线程,当我期待的时候?

我刚刚在这里运行了几次简单的串行和多线程程序,串行程序为14500 ms,多线程程序为15651 ms.两者都在同一个双核心.其他注意事项:在串行运行中,每个计算任务(从0到Ns)大约需要1.1到4.5 ms.从双线程开始,每批(Ns/2点)大约需要0.5到3毫秒; (从run()方法的顶部到底部测量.每次计算任务因其自身的数值收敛而不同)

非常感谢您的关注.

java multithreading synchronization context-switch

5
推荐指数
1
解决办法
1438
查看次数

内核运行ISR例程时的限制

在内核模式和ISR例程中有哪些重要的事情和不重要的事情?例如 -

  • 运行中断处理程序时是否禁用了上下文切换?
  • 当进程位于关键
    部分内时,是否可以发生上下文切换?
  • 内核模式中的哪些情况值得禁用进一步的中断?

如何在页面错误上发生进程切换,其中进程从磁盘获取数据,但在其他中断发生期间不会发生.如果可执行路径可以被中断/重新安排/抢占,您如何分类?

当进程处于内核模式或处理ISR例程时,必须记住的其他事项是什么?

operating-system locking interrupt context-switch linux-kernel

5
推荐指数
1
解决办法
1084
查看次数

Arm 中的任务切换

我正在阅读 Arm 架构参考手册,我想我有一些理论问题。

好吧,一开始我很困惑上下文切换是否意味着任务切换?

其次,通过对Intel 80386架构的体验,我记得有任务描述符和其他一些自动保存任务状态的机制,在arm中它是如何完成的?比如说“手动”,通过将寄存器保存在堆栈中来完成吗?

该 ASID(应用程序空间 ID)是否与我之前询问的内容相关联?

arm context-switch

5
推荐指数
1
解决办法
7674
查看次数

上下文切换睡眠/等待线程

我试图了解操作系统如何处理不同模型中的上下文切换,以更好地理解为什么在请求数量达到峰值的情况下NIO性能更好.除了线程数量可能有限之外,我很好奇如何在大量请求中执行阻塞操作会影响资源利用率.

在每个线程模型的一个请求中,比如基于servlet 2.5的Web应用程序,如果499个线程正在等待数据库IO并且只有一个线程需要工作,则OS上下文在所有这500个线程之间切换,试图找到需要工作的线程?要执行上下文切换,操作系统必须存储当前线程的状态,并恢复下一个线程的状态.执行此操作后,操作系统将发现它不需要任何CPU时间,并将保持上下文切换,直到找到需要工作的线程.此外,在服务器利用率方面,这看起来如何?CPU是否很低,因为它主要受到交换上下文而不是实际计算任何内容的IO成本的约束?

在此先感谢您的帮助.如果你能指出我的书籍,教科书等方向,我也会非常感激.

multithreading nonblocking context-switch threadpool context-switching

5
推荐指数
1
解决办法
3478
查看次数

通过Akka应用程序中的上下文切换实现高CPU使用率

我正在维护和开发两个与串行设备连接的Akka Scala应用程序来收集传感器信息.两者之间的主要区别在于,一个(我的二氧化碳传感器应用程序)使用1%CPU,而另一个(我的功率传感器应用程序)使用250%CPU.这在Linux机器(Raspberry Pi 3)以及我的Windows台式PC上都是如此.代码方面,主要区别在于CO2 直接使用串行库(http://fazecast.github.io/jSerialComm/),而Power传感器应用程序通过一层中间件来转换串行库的In/OutputStreams到Akka Source/Sink:

  val port = SerialPort.getCommPort(comPort)

  port.setBaudRate(baudRate)
  port.setFlowControl(flowControl)
  port.setComPortParameters(baudRate, dataBits, stopBits, parity)
  port.setComPortTimeouts(timeoutMode, timeout, timeout)

  val isOpen = port.openPort()

  if(!isOpen) {
    error(s"Port $comPort could not opened. Use the following documentation for troubleshooting: https://github.com/Fazecast/jSerialComm/wiki/Troubleshooting")

    throw new Exception("Port could not be opened")
  }

  (reactive.streamSource(port.getInputStream), reactive.streamSink(port.getOutputStream))
Run Code Online (Sandbox Code Playgroud)

当我看到这种高CPU使用率时,我立即打了一个Profiler(VisualVM)对它说了以下内容: Profiler截图

在谷歌搜索Unsafe.park后,我找到了以下答案:https://stackoverflow.com/a/29414580/1122834 - 使用此信息我检查了上下文切换的数量,并且没有我的Power传感器应用程序,结果非常清晰关于问题的根本原因:

pi@dex:~ $ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id …
Run Code Online (Sandbox Code Playgroud)

multithreading scala cpu-usage context-switch akka

5
推荐指数
1
解决办法
1095
查看次数

Linux 内核中的上下文切换时间

在 Linux Kernel 中,当处理器上下文从一个线程切换到另一个线程时,寄存器的状态会保存到 PCB 中,并进行更多的簿记以确保可以再次加载确切的状态。

从内核内存中保存和加载寄存器的整个过程可能需要一些 CPU 周期。那么这个时间是属于用户 CPU / 系统 CPU 还是其他地方

linux multithreading context-switch linux-kernel context-switching

5
推荐指数
1
解决办法
1781
查看次数

Visual Studio(或任何其他工具)可以将地址解释为调用堆栈的开头(增强上下文)吗?

是否可以告诉 Visual Studio(或任何其他工具,甚至在任何其他主要操作系统上)将地址解释为调用堆栈的开头?


我想要实现的目标:我们有一个库,它使用boost's make_fcontext/jump_fcontext并将这些上下文存储到容器中,以便暂停一些调用以供以后处理。

我的问题是 - 是否可以以某种方式调试这些挂起的调用是什么?我想,我可以告诉调试器/工具:“这是这个地址,虽然它不明显,但它实际上指向一个调用堆栈,‘解析’它并像标准调用堆栈一样向我显示它”。

不知道理论上是否可行,因为我不知道boost::context细节,但听起来是可以实现的。

有人尝试过解决这个问题吗?

c++ debugging boost context-switch

5
推荐指数
1
解决办法
260
查看次数

找出Swift中发生上下文切换的时间

老实说,我不知道是否可以解决我的问题,但我想在Swift中捕获上下文切换时的情况。

我正在想象一个需要很长时间才能完成的功能,例如在远程服务器上执行写操作,并且我在考虑是否有办法了解何时(至少在哪一行)执行该任务的线程正在执行上下文切换,因为必须执行另一个等待很长时间的任务。

抱歉,如果您觉得这是一个愚蠢的问题,或者在尝试解释以上内容时我出错了

编辑:

我说的是调度程序自动请求的上下文切换。。因此,再次想像一下,我们处于这个长函数的中间,该函数执行大量操作,调度程序为此任务分配了几秒钟,例如10秒钟。为了使其完整。如果进程用完了时间并且没有结束任务,它将被挂起,例如线程将执行另一个进程的另一个任务。结束时,调度程序可能会考虑对挂起的作业进行另一次尝试,并且将从挂起的位置开始继续执行(因此将从PC寄存器中读取该值并继续进行)

context-switch grand-central-dispatch swift

5
推荐指数
1
解决办法
191
查看次数