有没有办法确定何时在不使用分析器的情况下进行上下文切换?我编写了一个C程序来监视程序中不同进程完成执行所花费的时间.我也想显示进程/线程上下文切换.切换发生的时间和来自的时间prev_id -> curr_id.这3个信息会有所帮助.
我正在阅读并阅读如果我在.Net中使用Tasks而不是Threads,他们就不会受到Threads有问题的Context Switch的影响.
然而,阅读我也注意到,无论如何,任务只是在封面下使用线程.
所以我有点困惑,任何澄清都表示赞赏.
我正在Azure上运行Service Bus,每秒大约需要10-100条消息.
最近我转而使用.net 4.5并且所有兴奋重构的所有代码都在每行中至少有两次'async'和'await ',以确保它'正确'完成':)
现在我想知道它实际上是好还是坏.如果你能看一下代码片段,请告诉我你的想法.我特别担心,如果线程上下文切换没有给我带来更多的悲伤而不是从所有的异步中获益......(看看!dumpheap肯定是一个因素)
只是一些描述 - 我将发布2个方法 - 一个在ConcurrentQueue上执行while循环,等待新消息和另一个一次发送一个消息的方法.我也正在使用Transient Fault Handling块,正如Azure博士所规定的那样.
发送循环(从头开始,等待新消息):
private async void SendingLoop()
{
try
{
await this.RecreateMessageFactory();
this.loopSemaphore.Reset();
Buffer<SendMessage> message = null;
while (true)
{
if (this.cancel.Token.IsCancellationRequested)
{
break;
}
this.semaphore.WaitOne();
if (this.cancel.Token.IsCancellationRequested)
{
break;
}
while (this.queue.TryDequeue(out message))
{
try
{
using (message)
{
//only take send the latest message
if (!this.queue.IsEmpty)
{
this.Log.Debug("Skipping qeued message, Topic: " + message.Value.Topic);
continue;
} …Run Code Online (Sandbox Code Playgroud) MediaRecorder.start()需要很长时间.方法分析表明'上下文切换' - 包含实时是100%,大约需要1510毫秒.有可能以某种方式减少它吗?我需要它尽可能快.
有很多方法可以衡量CPU上下文切换开销.它似乎没有多少资源来衡量GPU上下文切换开销.CPU上下文切换和GPU是完全不同的.
GPU调度基于warp调度.为了计算GPU上下文切换的开销,我需要知道在没有上下文切换的情况下使用上下文切换和warp的warp的时间,并进行减法以获得开销.
我对如何用上下文切换测量扭曲时间感到困惑?有没有人有一些想法来衡量?
我想一个接一个地运行两个函数来访问第三个函数,条件是当第一个使用第三个函数时,第二个函数应该等待.在访问第三个函数的第一个时间段之后应该能够使用第三个函数.
这个概念听起来像是使用上下文切换实现循环调度.我从理论上讲这个,但我想实际应用它.我怎样才能实现这一点并进行上下文切换?有人能为我提供一个例子吗?还有其他方法可以实现这一目标吗?
编辑:其实我在谷歌地图上绘制标记,使用gmap.net .i为两个标记创建了两个线程函数.他们将从两个单独的文件中获取所需的数据.将其转换为lat long并在map上绘图.这种方法我创建了两个具有相同功能的重复功能.但我想它不是一个好的编程方式,所以想要使用一个常用函数来绘制和从文件中获取数据进行转换.
所以当一个线程正在访问公共函数时,另一个应该等待.once首先释放一个函数或者它的时间段来处理该函数超过它应该执行上下文切换而第二个线程应该访问公共函数.这就是我想要实现的目标.如果我应该修改我的方法,请告诉我.

我正在研究C编程中的上下文切换,并在Internet上找到了以下示例代码.我试图弄清楚是否只有makecontext()函数可以触发一个做某事的函数.的其他功能,例如setcontext(),getcontext()和swapcontext()用于设置的上下文.
该makecontext()直到改变致力于其附加的功能和它的参数(一个或多个)的情况下,确实功能棒的背景下所有的时间?
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ucontext.h>
4 #define MEM 64000
5
6 ucontext_t T1, T2, Main;
7 ucontext_t a;
8
9 int fn1()
10 {
11 printf("this is from 1\n");
12 setcontext(&Main);
13 }
14
15 void fn2()
16 {
17 printf("this is from 2\n");
18 setcontext(&a);
19 printf("finished 1\n");
20 }
21
22 void start()
23 {
24 getcontext(&a);
25 a.uc_link=0;
26 a.uc_stack.ss_sp=malloc(MEM);
27 …Run Code Online (Sandbox Code Playgroud) 引用操作系统中的以下段落:三个简单的部分,
请注意,在此协议期间会发生两种类型的寄存器保存/恢复。第一个是定时器中断发生时;在这种情况下,正在运行的进程的用户寄存器由硬件使用该进程的内核堆栈隐式保存。第二个是当操作系统决定从A切换到B时;在这种情况下, 内核寄存器由软件(即操作系统)显式保存,但这次保存在进程的进程结构中的内存中。
阅读有关上下文切换的其他文献,我了解到定时器中断会将 cpu 置于内核模式,然后将进程上下文保存到内核堆栈中。
为什么作者在谈论多上下文保存时强调硬件/软件?
我知道这里对这个问题有一个解释。但我对一些点有点困惑-:
令i有属于进程P1的线程T(1-a)和T(1-b)以及属于进程P2的线程T(2-a)和T(2-b)。
现在我的问题是——
这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权移交给操作系统内核来执行上下文切换(我主要讨论线程上下文切换)。
如果T(1-a)和T(1-b)是用户级线程,内核将无法区分T(1-a)和T(1-b),那么上下文切换将如何完成?
成本/交易不会与进程上下文切换相同吗,因为不仅虚拟内存空间发生变化,而且 TLB 也被刷新?
multithreading computer-science operating-system context-switch
当我调用如下函数时
void main(void){
Function();
}
Run Code Online (Sandbox Code Playgroud)
它是否被视为上下文切换,因为我在转到函数之前保存了寄存器?
context-switch ×10
c ×3
c# ×2
.net ×1
android ×1
asynchronous ×1
c++ ×1
cuda ×1
function ×1
gpu ×1
linux ×1
oprofile ×1
overhead ×1
profiler ×1
round-robin ×1
servicebus ×1
task ×1
ucontext ×1