从我关于SO的另一个问题我发现它可能遵循简单的方法
void B()
{
if (_complete)
{
Console.WriteLine (_answer);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在if和console writeline之间发生上下文切换,可能会在不同的CPU上执行..这对我来说是新闻,所以我想知道现在什么时候单线程代码可以转换为另一个CPU以及为什么它可能在上面这么简单的情况下有意义?
这可能取决于操作系统,但一般来说,据我所知,当发生页面错误(所需的页面不在主内存中)时,操作系统将指示CPU从磁盘读取页面,我想知道操作系统是否分派到另一个处理磁盘 I/O 时?如果确实如此,那么上下文切换时将完全刷新 TLB,对吗?
operating-system context-switch virtual-memory tlb page-tables
我读过了:
进程切换是从一个进程到另一个进程的上下文切换。它涉及切换所有流程抽象和资源,以支持属于新流程的抽象和资源。最值得注意和最昂贵的是,这意味着切换存储器地址空间。这包括内存地址,映射,页表和内核资源,这是一个相对昂贵的操作。
也:
上下文是任何时间点的CPU寄存器和程序计数器的内容。
当内核(即操作系统的核心)针对CPU上的进程(包括线程)执行以下活动时,可以更详细地描述上下文切换:(1)暂停一个进程的进程并存储进程该进程在内存中某个位置的CPU状态(即上下文),(2)从内存中检索下一个进程的上下文,并将其恢复到CPU的寄存器中,(3)返回到程序计数器指示的位置(即,返回到中断该过程的代码行)以恢复该过程。
由于每个进程的VAS都是独立的,并且最大容量为4GB,如果进程进行上下文切换,进程的整个VAS是否会加载到CPU上下文中?
另外,由于每个进程都有单独的页表,因此如果进行上下文切换,该页表是否也被带入CPU上下文中?
如果否,那么为什么进程上下文切换比线程上下文切换慢(线程共享相同的VAS)?
linux multithreading context-switch linux-kernel multitasking
我有一个带有时钟中断的简单工作(32 位保护模式)内核。我可以看到这个中断正在工作,因为它多次打印 \xc2\xab\xc2\xa0clock\xc2\xa0\xc2\xbb 。我还可以看到这个中断将控制权交还给内核,因为它在几次时钟中断后在屏幕上打印 \xc2\xab\xc2\xa0Kernel has stop\xc2\xa0\xc2\xbb ,就像它应该的那样。中断与内核位于同一代码段中。
\n我没有设置任何 TSS,但它正在工作。我可以在这篇文章( https://web.archive.org/web/20160326062442/http://jamesmolloy.co.uk/tutorial_html/10.-User%20Mode.html )上读到,当发生中断时,CPU将查看选定的 TSS 段以更新寄存器。
\n如果我没有\xe2\x80\x99t 有这个 TSS ,它如何工作?是因为当中断发生时CPU仍然会自动推送EIP、CS、EFLAGS、EPS、SS并在iret上恢复它们吗?
\n如果我加载单个 TSS,该中断如何知道它应该使用该 TSS?使用ltr指令将在GDT内获取相应的tss段?
\n并不是真正相关,但是当使用硬件上下文切换并跳转到一个 TSS 时,它会在返回时自动跳转到上一个(没有下一个字段,所以 I\xe2\x80\x99m 有点丢失)tss 段吗?
\n这些问题我无法从我的学校课程、osdev 或这个论坛中真正得到明确的答案。
\n好的......这里有一些关于这个问题的背景知识.我有一些"关键"代码,我试图用互斥锁保护.它就是这样的
Mutex.Lock()
//关键代码//某个文件IO
Mutex.Unlock().
现在问题是我的程序似乎因此而"卡住".让我举个例子来解释一下.
Thread_1进来了; 并转到Mutex.Lock()并开始执行关键代码.在关键代码中; 它需要做一些文件IO.现在就在这一点上; 我相信'上下文切换'发生并且Thread_2进入并阻塞Mutex.Lock()(因为Thread_1具有锁定).一切似乎都很好,但就我而言; 程序'挂起'在这里..我唯一能想到的是,不知何故Thread_2一直保持阻塞,并且不会切换回Thread_1?
更多信息:在linux上使用pthread_mutex_init和pthread_mutex_lock.
我已经对进程之间的上下文切换问题感到困惑,给定了某个时间片的循环调度程序(这是unix/windows在基本意义上都使用的).
因此,假设我们在一台核心机器上运行了200个进程.如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求).话虽如此,我在图片中遗漏了什么?
此外,java和其他语言允许将正在运行的线程休眠例如100ms.我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?
据我了解,就绪的warp是可以在warp调度中执行的warp。等待扭曲正在等待获取或计算源操作数,因此无法执行。Warp 调度程序选择一个准备好的 warp 来执行“warp 调度”。
另一方面,当一个 warp 出现管道停顿或全局内存延迟较长时,另一个 warp 将被执行以隐藏延迟。这就是cuda中“warp上下文切换”的基本思想。
我的问题是:Cuda中的warp调度和warp上下文切换之间有什么关系。为了详细说明我的问题,下面是一个例子。
例如,当warp A 停止时,warp A 是等待获取全局内存的warp,一旦获取元素,warp A 将被调度或切换到就绪warp 池中。基于此,warp上下文切换是warp调度的一部分。这是对的吗?
任何人都可以提供有关 Cuda 中的 warp 上下文切换和 warp 调度的任何参考吗?英伟达似乎没有公开这些文件。
预先感谢您的回复。
.net ×1
c# ×1
c++ ×1
cuda ×1
gpu ×1
kernel ×1
linux ×1
linux-kernel ×1
multitasking ×1
mutex ×1
osdev ×1
page-tables ×1
process ×1
scheduling ×1
thread-sleep ×1
tlb ×1
x86 ×1