谁能告诉我在这两种情况下究竟做了什么?每个人的主要成本是多少?
在这个问题的帮助下,我想学习并填补我的知识空白.
因此,用户正在运行一个线程(内核级),它现在调用yield(我假设的系统调用).调度程序现在必须将当前线程的上下文保存在TCB中(存储在内核中的某个地方)并选择另一个线程来运行并加载其上下文并跳转到它CS:EIP.为了缩小范围,我正在开发基于x86架构的Linux.现在,我想了解详细信息:
所以,首先我们有一个系统调用:
1)包装函数yield将把系统调用参数推送到堆栈.按下返回地址并产生一个中断,系统调用号码被推到某个寄存器上(比方说EAX).
2)中断将CPU模式从用户更改为内核并跳转到中断向量表并从那里到内核中的实际系统调用.
3)我猜调度程序现在被调用,现在它必须保存TCB中的当前状态.这是我的困境.因为,调度器将使用内核堆栈,而不是用于执行其操作(这意味着该用户堆栈SS和SP必须被改变),它是如何存储的用户的状态,而不会在该过程修改任何寄存器.我在论坛上看到有关于保存状态的特殊硬件指令,但是调度程序如何访问它们以及谁运行这些指令以及何时执行?
4)调度程序现在将状态存储到TCB中并加载另一个TCB.
5)当调度程序运行原始线程时,控件返回到包装器函数,该函数清除堆栈并恢复线程.
附带问题:调度程序是否作为仅内核线程(即只能运行内核代码的线程)运行?每个内核线程或每个进程都有一个单独的内核堆栈吗?
我正在用C编写一个小程序,我想测量它的性能.
我想知道它在处理器中运行了多少时间以及它有多少缓存命中+未命中.有关上下文切换和内存使用的信息也很好.
该程序执行时间不到一秒.
我喜欢/ proc/[pid]/stat的信息,但我不知道如何在程序死亡/被杀之后看到它.
有任何想法吗?
编辑:我认为Valgrind增加了很多开销.这就是为什么我想要一个简单的工具,比如/ proc/[pid]/stat,它总是在那里.
performance measurement context-switch cpu-cache memcache-stats
我被要求描述两个不同进程之间的上下文切换(1)所涉及的步骤,以及(2)同一进程中两个不同线程之间的步骤.
这太普遍了,或者你会加入什么来解释这个过程更清楚?
我试图了解linux内核中的调度过程是如何工作的.我的问题不是调度算法.它关于功能schedule()和switch_to()工作方式.
我会试着解释一下.我看到了:
当进程耗尽时间片时,标志need_resched由设置scheduler_tick().内核检查标志,看到它已设置,并调用schedule()(与问题1相关)切换到新进程.此标志是应该尽快调用计划的消息,因为另一个进程应该运行.返回用户空间或从中断返回后,将need_resched检查该标志.如果已设置,则内核会在继续之前调用调度程序.
查看内核源代码(linux-2.6.10 - "Linux内核开发,第二版"所依据的版本),我还看到一些代码可以自动调用该schedule()函数,让另一个进程有权运行.我看到该函数switch_to()是实际进行上下文切换的函数.我查看了一些与架构相关的代码,试图了解switch_to()实际上在做什么.
这种行为提出了一些我无法找到答案的问题:
当switch_to()完成,什么是当前正在运行的进程?这个过程叫schedule()什么?或者下一个过程,那个被选中运行的过程?
当schedule()被中断调用时,所选的进程在中断处理完成后开始运行(在某种RTE之后)?还是在那之前呢?
如果schedule()无法从中断调用该函数,那么何时是标志need_resched设置?
当定时器中断处理程序工作时,正在使用什么堆栈?
我不知道我是否能说清楚自己.如果我不能,我希望我可以在一些答案(或问题)之后做到这一点.我已经看过几个试图了解这个过程的消息来源.我有一本书"Linux Kernel Development,sec ed",我也在使用它.我对MIP和H8300架构有所了解,如果有帮助可以解释一下.
我们可以编写ac程序来找出在Linux中进行上下文切换所花费的时间吗?如果你有代码,请你分享代码吗?谢谢
最初我认为上下文切换的开销是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
关于Linux上相同进程的线程之间的上下文切换成本是否有任何好的经验数据(x86和x86_64,主要是感兴趣的)?我说的是一个线程在自动或非自愿地进入睡眠状态之前在用户空间中执行的最后一个指令之间的周期数或纳秒数,以及在同一个CPU /核心唤醒后执行相同进程的不同线程的第一条指令.
我编写了一个快速测试程序,它不断执行rdtsc分配给同一个cpu/core的2个线程,将结果存储在volatile变量中,并与其姐妹线程的相应volatile变量进行比较.第一次检测到姐妹线程值的变化时,它会打印差异,然后返回循环.我在Atom D510 cpu上以这种方式获得了大约8900/9600个周期的最小/中值计数.这个程序看起来是否合理,数字看起来是否可信?
我的目标是估计在现代系统上,每个连接线程的服务器模型是否可以与选择型多路复用竞争甚至优于选择类型的多路复用.这似乎在理论上可行,因为从FD执行IO的过渡X金融衍生工具Y涉及仅仅会在一个线程睡眠,而在另一个醒来,而不是多个系统调用,但它是依赖于上下文切换的开销.
在两个线程之间的上下文切换中准确保存和恢复的内容
我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.
我想探索的一件事是多任务背后的机制.据我了解,它是这样的:
因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).
但是,设置描述符表的方式似乎是这样的:
outb以及什么不是)以初始化它.lidt.但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?
context-switch ×10
linux ×3
c ×2
kernel ×2
linux-kernel ×2
performance ×2
process ×2
cpu-cache ×1
measurement ×1
memory ×1
osdev ×1
posix ×1
pthreads ×1
scheduler ×1
x86 ×1