标签: context-switch

线程上下文切换Vs. 进程上下文切换

谁能告诉我在这两种情况下究竟做了什么?每个人的主要成本是多少?

multithreading process context-switch

112
推荐指数
3
解决办法
8万
查看次数

上下文切换内部

在这个问题的帮助下,我想学习并填补我的知识空白.

因此,用户正在运行一个线程(内核级),它现在调用yield(我假设的系统调用).调度程序现在必须将当前线程的上下文保存在TCB中(存储在内核中的某个地方)并选择另一个线程来运行并加载其上下文并跳转到它CS:EIP.为了缩小范围,我正在开发基于x86架构的Linux.现在,我想了解详细信息:

所以,首先我们有一个系统调用:

1)包装函数yield将把系统调用参数推送到堆栈.按下返回地址并产生一个中断,系统调用号码被推到某个寄存器上(比方说EAX).

2)中断将CPU模式从用户更改为内核并跳转到中断向量表并从那里到内核中的实际系统调用.

3)我猜调度程序现在被调用,现在它必须保存TCB中的当前状态.这是我的困境.因为,调度器将使用内核堆栈,而不是用于执行其操作(这意味着该用户堆栈SSSP必须被改变),它是如何存储的用户的状态,而不会在该过程修改任何寄存器.我在论坛上看到有关于保存状态的特殊硬件指令,但是调度程序如何访问它们以及谁运行这些指令以及何时执行?

4)调度程序现在将状态存储到TCB中并加载另一个TCB.

5)当调度程序运行原始线程时,控件返回到包装器函数,该函数清除堆栈并恢复线程.

附带问题:调度程序是否作为仅内核线程(即只能运行内核代码的线程)运行?每个内核线程或每个进程都有一个单独的内核堆栈吗?

kernel scheduler context-switch linux-kernel

63
推荐指数
3
解决办法
3万
查看次数

最简单的工具来测量Linux中的C程序缓存命中/未命中和cpu时间?

我正在用C编写一个小程序,我想测量它的性能.

我想知道它在处理器中运行了多少时间以及它有多少缓存命中+未命中.有关上下文切换和内存使用的信息也很好.

该程序执行时间不到一秒.

我喜欢/ proc/[pid]/stat的信息,但我不知道如何在程序死亡/被杀之后看到它.

有任何想法吗?

编辑:我认为Valgrind增加了很多开销.这就是为什么我想要一个简单的工具,比如/ proc/[pid]/stat,它总是在那里.

performance measurement context-switch cpu-cache memcache-stats

49
推荐指数
4
解决办法
4万
查看次数

上下文切换中的步骤

我被要求描述两个不同进程之间的上下文切换(1)所涉及的步骤,以及(2)同一进程中两个不同线程之间的步骤.

  1. 在上下文切换期间,内核将在其PCB中保存旧进程的上下文,然后加载计划运行的新进程的已保存上下文.
  2. 操作系统可以调度同一进程中两个不同线程之间的上下文切换,使它们看起来并行执行,因此通常比两个不同进程之间的上下文切换更快.

这太普遍了,或者你会加入什么来解释这个过程更清楚?

multithreading process context-switch

32
推荐指数
3
解决办法
3万
查看次数

来自linux内核的schedule()+ switch_to()函数如何实际工作?

我试图了解linux内核中的调度过程是如何工作的.我的问题不是调度算法.它关于功能schedule()switch_to()工作方式.

我会试着解释一下.我看到了:

当进程耗尽时间片时,标志need_resched由设置scheduler_tick().内核检查标志,看到它已设置,并调用schedule()(与问题1相关)切换到新进程.此标志是应该尽快调用计划的消息,因为另一个进程应该运行.返回用户空间或从中断返回后,将need_resched检查该标志.如果已设置,则内核会在继续之前调用调度程序.

查看内核源代码(linux-2.6.10 - "Linux内核开发,第二版"所依据的版本),我还看到一些代码可以自动调用该schedule()函数,让另一个进程有权运行.我看到该函数switch_to()是实际进行上下文切换的函数.我查看了一些与架构相关的代码,试图了解switch_to()实际上在做什么.

这种行为提出了一些我无法找到答案的问题:

  1. switch_to()完成,什么是当前正在运行的进程?这个过程叫schedule()什么?或者下一个过程,那个被选中运行的过程?

  2. schedule()被中断调用时,所选的进程在中断处理完成后开始运行(在某种RTE之后)?还是在那之前呢?

  3. 如果schedule()无法从中断调用该函数,那么何时是标志need_resched设置?

  4. 当定时器中断处理程序工作时,正在使用什么堆栈?

我不知道我是否能说清楚自己.如果我不能,我希望我可以在一些答案(或问题)之后做到这一点.我已经看过几个试图了解这个过程的消息来源.我有一本书"Linux Kernel Development,sec ed",我也在使用它.我对MIP和H8300架构有所了解,如果有帮助可以解释一下.

context-switch linux-kernel

28
推荐指数
1
解决办法
1万
查看次数

编写一个C程序来测量Linux OS中上下文切换所花费的时间

我们可以编写ac程序来找出在Linux中进行上下文切换所花费的时间吗?如果你有代码,请你分享代码吗?谢谢

c linux context-switch

27
推荐指数
4
解决办法
3万
查看次数

上下文切换的开销是多少?

最初我认为上下文切换的开销是TLB被刷新.但是我刚刚在维基百科上看到:

http://en.wikipedia.org/wiki/Translation_lookaside_buffer

2008年,英特尔(Nehalem)[18]和AMD(SVM)[19]都引入了标签作为TLB条目的一部分,以及在查找期间检查标签的专用硬件.即使这些没有得到充分利用,但可以设想,将来这些标签将识别每个TLB条目所属的地址空间.因此,上下文切换不会导致刷新TLB - 而只是将当前地址空间的标记更改为新任务的地址空间的标记.

以上是否确认较新的Intel CPU TLB不会在上下文切换时刷新?

这是否意味着现在在上下文切换中没有真正的开销?

(我试图理解上下文切换的性能损失)

linux virtualization performance operating-system context-switch

24
推荐指数
3
解决办法
3万
查看次数

在Linux上,同一进程的线程之间的上下文切换成本

关于Linux上相同进程的线程之间的上下文切换成本是否有任何好的经验数据(x86和x86_64,主要是感兴趣的)?我说的是一个线程在自动或非自愿地进入睡眠状态之前在用户空间中执行的最后一个指令之间的周期数或纳秒数,以及在同一个CPU /核心唤醒后执行相同进程的不同线程的第一条指令.

我编写了一个快速测试程序,它不断执行rdtsc分配给同一个cpu/core的2个线程,将结果存储在volatile变量中,并与其姐妹线程的相应volatile变量进行比较.第一次检测到姐妹线程值的变化时,它会打印差异,然后返回循环.我在Atom D510 cpu上以这种方式获得了大约8900/9600个周期的最小/中值计数.这个程序看起来是否合理,数字看起来是否可信?

我的目标是估计在现代系统上,每个连接线程的服务器模型是否可以与选择型多路复用竞争甚至优于选择类型的多路复用.这似乎在理论上可行,因为从FD执行IO的过渡X金融衍生工具Y涉及仅仅会在一个线程睡眠,而在另一个醒来,而不是多个系统调用,但它是依赖于上下文切换的开销.

c linux posix pthreads context-switch

18
推荐指数
1
解决办法
6987
查看次数

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

在两个线程之间的上下文切换中准确保存和恢复的内容

  • 在同一过程中
  • 两个进程之间

memory multithreading context-switch

13
推荐指数
1
解决办法
1万
查看次数

(编写内核)如何修改中断描述符表?

我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.

我想探索的一件事是多任务背后的机制.据我了解,它是这样的:

  1. 内核初始化中断描述符表,以便定期发出中断(例如毫秒)并调用内核中定义的例程.
  2. 调用例程时,它可以决定将代码/数据段和堆栈指针设置为另一个程序上下文的指针,即"上下文切换".

因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).

但是,设置描述符表的方式似乎是这样的:

  1. 将一些数据发送到PIC(outb以及什么不是)以初始化它.
  2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数可以作为信号处理程序.
  3. 用表加载表lidt.

但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?

x86 kernel osdev context-switch interrupt-handling

13
推荐指数
1
解决办法
2583
查看次数