问题标签 [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 投票
4 回答
1288 浏览

winapi - Win32:代码块的原子执行

我有两个系统调用 GetSystemTime() 和 GetThreadTimes() 我需要计算给定 Win32 线程的 CPU 利用率。

为了准确起见,我需要确保 GetSystemTime() 和 GetThreadTimes() 都是原子执行的;即在调用GetSystemTime() 和GetThreadTimes() 之间不应有上下文切换。

原因是偶尔我会得到超过 100% 的百分比(约 500 分之一)。

如何确保 2 个函数调用的原子执行?

谢谢,萨钦

0 投票
4 回答
231 浏览

c# - 创建新线程或获得更多线程工作

我有一个正在创建的程序(在 C# 中),我看到了两种方法..

1) 等待任意数量的 X 线程完成的作业管理器,完成后它会获得下一个工作块并创建一个新线程并将该块交给它

或者

2)我们创建X个线程来启动,给它们每个工作块,当一个线程完成一个块时,它会要求作业管理器做更多的工作。如果没有更多的工作,它会睡觉,然后再次询问,睡眠时间会越来越长。

该程序将运行并完成,但我可以看到它变成了一项不断寻找更多工作的服务。

每个块将包含许多数据 id,调用数据库以获取一些信息或对数据 id 执行操作,然后将数据 id 上的信息写入数据库。

0 投票
4 回答
13609 浏览

multithreading - 上下文切换中保存了什么?

在两个线程之间的上下文切换中究竟保存和恢复了什么

  • 在同一个过程中
  • 两个进程之间
0 投票
1 回答
293 浏览

c - GCC:在每条指令之后强制调用函数(用于多线程测试)?

我正在尝试在我的程序中测试一个相当线程敏感的区域,并且想知道是否有一种方法可以强制 gcc 在它发出的每条指令之后插入一个调用,以便我可以手动让步到另一个线程?

谢谢,罗伯特

0 投票
5 回答
3025 浏览

c++ - C++上下文切换和互斥问题

好的..这里是这个问题的一些背景。我有一些我试图用互斥锁保护的“关键”代码。它是这样的

互斥锁()

// 关键代码 // 一些文件 IO

互斥锁()。

现在的问题是我的程序似乎因此而“卡住”了。让我用一个例子来解释。

Thread_1 进来;然后转到 Mutex.Lock() 并开始执行关键代码。在关键代码中;它需要做一些文件 IO。现在在这一点上;我相信会发生“上下文切换”并且 Thread_2 进入并阻塞 Mutex.Lock() (因为 Thread_1 有锁)。一切似乎都很好,但就我而言;程序在这里“挂起”。我唯一能想到的是,不知何故 Thread_2 一直阻塞并且不会切换回 Thread_1?

更多信息:在 linux 上使用 pthread_mutex_init 和 pthread_mutex_lock。

0 投票
6 回答
37879 浏览

c - 编写一个 C 程序来测量 Linux 操作系统中上下文切换所花费的时间

我们可以编写 ac 程序来找出在 Linux 中上下文切换所花费的时间吗?有的话可以分享一下代码吗?谢谢

0 投票
3 回答
3305 浏览

performance - 计算每个线程的上下文切换

有没有办法查看每个线程生成多少上下文切换?(如果可能,进出)要么在 X/s 中,要么让它运行并在一段时间后提供聚合数据。(在linux或windows上)

我发现只有工具可以为整个操作系统或每个进程提供聚合的上下文切换数。

我的程序进行了许多上下文切换(50k/s),可能很多都没有必要,但我不确定从哪里开始优化,其中大部分发生在哪里。

0 投票
3 回答
8430 浏览

performance - 上下文切换有多贵?实现手动任务切换比依赖操作系统线程更好吗?

想象一下,我有两个(三个、四个,等等)必须并行运行的任务。现在,执行此操作的简单方法是创建单独的线程并忘记它。但是在一个普通的老式单核 CPU 上,这意味着很多上下文切换——我们都知道上下文切换很大、很糟糕、很慢,而且通常只是邪恶的。应该避免吧?

在那一点上,如果我是从头开始编写软件,我可以加倍努力并实现我自己的任务切换。将每个任务分成几部分,保存中间的状态,然后在单个线程中切换它们。或者,如果我检测到有多个 CPU 内核,我可以将每个任务分配给一个单独的线程,一切都会好起来的。

第二种解决方案确实具有适应可用 CPU 内核数量的优势,但是手动任务切换真的会比 OS 内核中的更快吗?特别是如果我试图用 aTaskManager和 anITask等使整个事情通用?

澄清:我是一名 Windows 开发人员,所以我主要对这个操作系统的答案感兴趣,但最有趣的是找出其他操作系统。当您写下您的答案时,请说明它适用于哪个操作系统。

更多说明:好的,所以这不是在特定应用程序的上下文中。这确实是一个普遍的问题,是我对可扩展性的思考的结果。如果我希望我的应用程序能够扩展并有效地利用未来的 CPU(甚至是今天的不同 CPU),我必须让它成为多线程的。但是有多少线程?如果我创建恒定数量的线程,那么程序将在所有内核数不同的 CPU 上执行次优。

理想情况下,线程数将在运行时确定,但很少有任务可以在运行时真正拆分为任意数量的部分。然而,许多任务可以在设计时拆分为相当大的恒定数量的线程。因此,例如,如果我的程序可以产生 32 个线程,那么它已经使用了多达 32 核 CPU 的所有内核,这在未来还很遥远(我认为)。但是在一个简单的单核或双核 CPU 上,这将意味着大量的上下文切换,这会减慢速度。

因此,我对手动任务切换的想法。这样一来,可以创建 32 个“虚拟”线程,这些线程将映射到尽可能多的真实线程,并且“上下文切换”将手动完成。问题只是 - 我的手动“上下文切换”的开销会小于操作系统上下文切换的开销吗?

自然,所有这些都适用于受 CPU 限制的进程,例如游戏。对于您的普通 CRUD 应用程序,这几乎没有价值。这样的应用程序最好使用一个线程(最多两个)。

0 投票
1 回答
3003 浏览

linux - 监控 pthread 上下文切换

我想监视多线程 pthread 应用程序中的上下文切换行为。

在其他 RTOS(Micro C OS)中,我已经能够为应用程序中的每个线程注册一个上下文切换回调,然后记录(或切换 gpio)并实时观察线程上下文切换。对于调试多线程的实时行为和交互来说,这是一个很有价值的工具。

我当前的环境是使用 pthread api 的嵌入式 linux。有没有办法监控每个上下文切换?

0 投票
6 回答
1221 浏览

c++ - 我的线程可以帮助操作系统决定何时将其上下文切换出去吗?

我正在使用 C++ 在 Linux 上开发一个线程应用程序,它试图实时,对心跳进行操作,或者尽可能接近它。

在实践中,我发现操作系统正在交换我的线程,并在它被切换时导致高达十分之一秒的延迟,从而导致心跳不规则。

有没有办法我的线程可以提示操作系统现在是上下文切换它的好时机?我可以在执行心跳后立即进行此调用,从而最大限度地减少由于不合时宜的上下文切换造成的延迟。