当前位置: 首页 > 面试题库 >

Linux为什么不通过TSS使用硬件上下文切换?

陈业
2023-03-14
问题内容

我阅读了以下声明:

x86体系结构包括一种称为任务状态段(TSS)的特定段类型,用于存储硬件上下文。尽管Linux不使用硬件上下文切换,但是仍然被迫为系统中每个不同的CPU设置一个TSS。

我想知道:

  • Linux为什么不使用硬件支持进行上下文切换?
  • 硬件方法不是比软件方法快得多吗?
  • 是否有任何可以利用硬件上下文切换的操作系统?Windows是否使用它?

最后,一如既往,感谢您的耐心等待和回复。

- - - - - -添加 - - - - - - -

http://wiki.osdev.org/Context_Switching得到了一些解释。

像我一样困惑的人们可以看看它。8 ^)


问题答案:

x86 TSS对于硬件多任务处理非常慢,与软件任务切换相比几乎没有任何好处。(实际上,我认为手动完成击败了TSS很多次)

TSS的使用也很烦人且乏味,并且即使在x86-64上也不便于移植。Linux旨在于多种体系结构上工作,因此他们可能选择使用软件任务切换,因为它可以以与机器无关的方式编写。而且,软件任务切换为可完成的工作提供了更多功能,并且与TSS相比,通常更易于设置。

我相信Windows 3.1使用了TSS,但至少NT> 5内核没有使用。我不知道任何使用TSS的类Unix操作系统。

请注意,TSS 是强制性的。
操作系统要做的事情是创建一个(每个处理器)一个TSS条目,并且每当他们需要切换任务时,它们都只是改变了这个TSS。而且,通过软件任务切换在TSS中使用的唯一字段是ESP0SS0。这用于从环3代码到达环0进行中断。没有TSS,就不会有已知的Ring
0堆栈,这当然会导致GPF并最终导致三重故障。



 类似资料:
  • 问题内容: 似乎Hibernate开始在3.5.5版(我们从3.2.7升级)中使用数据类型,而不是使用的属性。 这是造成问题,因为在Oracle数据类型是一个古老的过时的数据类型(参见http://www.orafaq.com/wiki/LONG不应被使用),以及表不能具有一个以上的列作为数据类型。 有谁知道为什么改变了? 我尝试将Oracle 属性设置为true(如[Hibernate>CLOB

  • 本文向大家介绍什么是上下文切换?相关面试题,主要包含被问及什么是上下文切换?时的应答技巧和注意事项,需要的朋友参考一下 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文

  • 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。 概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时

  • 问题内容: 为什么通过硒切换到警报不稳定? 例如。 1.运行代码,一切顺利。一切顺利。但是,如果这段代码在几分钟内运行,则可能会出现错误。例如,没有元素可以单击。等等。 2.在一个站点上,有一个警报窗口。 所以我关闭了。但是他一直在工作。一切都好,然后是错误。 我写了,一切都按预期进行。 但是我认为这并不漂亮。 为什么一切都这么不稳定? 非常感谢你。 问题答案: 根据您的代码块,您需要解决以下两个

  • 在我们的应用程序中,我们需要实现以下场景: 从客户端发送请求 服务器处理请求并生成文件 服务器返回文件作为响应 客户端浏览器显示文件下载弹出对话框,允许用户下载文件 我们的应用程序是基于ajax的应用程序,因此发送ajax请求(如使用jquery.ajax()函数)将非常简单方便。 但是在googilng之后,事实证明文件下载只有在使用非ajax POST请求时才是可能的(就像在这个流行的SO线程

  • 我了解在lambda中捕获此(修改对象属性)的正确方法如下: 但我对我所看到的以下特点感到好奇: 我感到困惑(并希望得到回答)的奇怪之处在于,为什么以下方法有效: 以及为什么我无法通过引用明确捕获此内容: