- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据一些操作系统教科书,为了更快的上下文切换,人们在TLB标签字段中为每个进程添加ASID,因此我们不需要在上下文切换中刷新整个TLB。
我听说一些 ARM 处理器和 MIPS 处理器在 TLB 中确实有 ASID。但我不确定 Intel x86 处理器是否有 ASID。
同时,似乎 ASID 通常比 PID(32 位)具有更少的位(例如 8 位)。那么,如果内存中的进程比上面提到的 8 位 ASID 情况下的 2^8 多,系统如何处理“ASID 溢出”?
最佳答案
英特尔将 ASID 称为进程上下文标识符 (PCID)。在所有支持 PCID 的 Intel 处理器上,PCID 的大小都是 12 位。它们构成了 CR3 寄存器的位 11:0。默认情况下,在处理器重置时,CR4.PCIDE(CR4 的第 17 位)被清除并且 CR3.PCID 为零,因此如果操作系统想要使用 PCID,它必须首先设置 CR4.PCIDE 以启用该功能。仅当设置了 CR4.PCIDE 时才允许写入大于零的 PCID 值。也就是说,当设置 CR4.PCIDE 时,也可以向 CR3.PCID 写入零。因此,可以同时使用的最大 PCID 数为 2^12 = 4096。
我将讨论 Linux 内核如何分配 PCID。 Linux 内核本身实际上使用术语 ASID,甚至对于 Intel 处理器也是如此,因此我也将使用这个术语。
一般来说,管理ASID空间的方法真的有很多种,例如:
struct tlb_context {
u64 ctx_id;
u64 tlb_gen;
};
struct tlb_state {
.
.
.
u16 next_asid;
struct tlb_context ctxs[TLB_NR_DYN_ASIDS];
};
DECLARE_PER_CPU_SHARED_ALIGNED(struct tlb_state, cpu_tlbstate);
TLB_NR_DYN_ASIDS
)。这些值存储在 next_asid
字段中,并用作 ctxs
数组的索引。 TLB_NR_DYN_ASIDS
+ 1)。这些值实际上存储在 CR3.PCID 中。 TLB_NR_DYN_ASIDS
+ 1)。这些值实际上存储在 CR3.PCID 中。 ctxs
数组,请耐心等待。
choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush);
next
指向调度程序选择恢复的线程所属进程的内存描述符。这个对象包含很多东西。但是我们在这里关心的一件事是
ctx_id
,它是一个 64 位值,每个现有进程都是唯一的。
next_tlb_gen
用于确定是否需要 TLB 失效,我将在稍后讨论。该函数返回
new_asid
保存分配给进程的 ASID 和
need_flush
表示是否需要 TLB 失效。函数的返回类型是
void
。
static void choose_new_asid(struct mm_struct *next, u64 next_tlb_gen,
u16 *new_asid, bool *need_flush)
{
u16 asid;
if (!static_cpu_has(X86_FEATURE_PCID)) {
*new_asid = 0;
*need_flush = true;
return;
}
if (this_cpu_read(cpu_tlbstate.invalidate_other))
clear_asid_other();
for (asid = 0; asid < TLB_NR_DYN_ASIDS; asid++) {
if (this_cpu_read(cpu_tlbstate.ctxs[asid].ctx_id) !=
next->context.ctx_id)
continue;
*new_asid = asid;
*need_flush = (this_cpu_read(cpu_tlbstate.ctxs[asid].tlb_gen) <
next_tlb_gen);
return;
}
/*
* We don't currently own an ASID slot on this CPU.
* Allocate a slot.
*/
*new_asid = this_cpu_add_return(cpu_tlbstate.next_asid, 1) - 1;
if (*new_asid >= TLB_NR_DYN_ASIDS) {
*new_asid = 0;
this_cpu_write(cpu_tlbstate.next_asid, 1);
}
*need_flush = true;
}
invalidate_other
检查,因为它不相关。接下来,循环遍历所有 6 个规范的 ASID,并将它们用作
ctxs
的索引。上下文标识符为
cpu_tlbstate.ctxs[asid].ctx_id
的进程当前被分配了 ASID 值
asid
。所以循环检查进程是否仍然有分配给它的 ASID。在这种情况下,使用相同的 ASID 并根据
need_flush
更新
next_tlb_gen
。即使 ASID 未被回收,我们也可能需要刷新与 ASID 关联的 TLB 条目的原因是由于惰性 TLB 失效机制,这超出了您的问题范围。
this_cpu_add_return
的调用只是将
next_asid
中的值加 1。这给了我们一个 kPCID 值。然后减去 1,我们得到规范的 ASID。如果我们已经超过了最大规范 ASID 值 (
TLB_NR_DYN_ASIDS
),那么我们将回绕到规范 ASID 0 并将相应的 kPCID(即 1)写入
next_asid
。发生这种情况时,意味着其他一些进程被分配了相同的规范 ASID,因此我们肯定希望刷新与核心上的该 ASID 关联的 TLB 条目。然后当
choose_new_asid
返回到
switch_mm_irqs_off
时,
ctxs
数组和 CR3 会相应地更新。写入 CR3 将使内核自动刷新与该 ASID 关联的 TLB 条目。如果其 ASID 被重新分配给另一个进程的进程仍然存在,那么下一次它的一个线程运行时,它将在该核心上分配一个新的 ASID。整个过程发生在每个内核上。否则,如果该进程死了,那么在 future 的某个时刻,它的 ASID 将被回收。
tlb_state
类型的大小小到足以容纳两个 64 字节缓存行。通常,在 Linux 系统上可能有数十个进程同时处于事件状态。然而,它们中的大多数通常处于休眠状态。因此 Linux 管理 ASID 空间的方式实际上非常有效。尽管看到有关
TLB_NR_DYN_ASIDS
的值对性能影响的实验评估会很有趣。但我不知道有任何此类已发表的研究。
关于x86 - 英特尔处理器的 TLB ASID 标签中有多少位?以及如何处理 'ASID overflow' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52813239/
我一直在使用各种技术来尝试解决我遇到的这个问题。我正在创建另一个关于自助的实践网站(即无意发布)。我正在尝试放置一个侧边栏,其中包含历史上人们的名言。但是我的旁边元素(边栏)不会出现在主要内容旁边。
根据一些操作系统教科书,为了更快的上下文切换,人们在TLB标签字段中为每个进程添加ASID,因此我们不需要在上下文切换中刷新整个TLB。 我听说一些 ARM 处理器和 MIPS 处理器在 TLB 中确
我的布局如下所示: https://imgur.com/Nc2QuRv 在 aside 里面有一个 div,我希望它相对于 aside 的边框对齐。但是,如果我设置任何边距或填充,整个旁边会相对于其上
过去几天我一直在想这个问题,我想我应该在这个网站上注册,因为我正在寻找的大部分答案都来自这里。但是,我找不到这个答案。 我只是想知道将 nav 标签嵌套在 aside 标签中在语义上是否正确?我是来自
所以我有一个 Article 标签,它基本上由一个超链接、一个图像、一个按钮和一个旁白组成。 图像是内联渲染图像,旁边是堆叠的。为了能够做到这一点,这就是我正在做的: Title
所以,顺便说一下,请看这里我的意思:http://ejfox.github.io/sStory/ 一篇文章,2 个 css 列,在第一列中我有带有文字和图片的文章,在第二列中我放置了元素。这些旁白元素
This image显示我的问题。 aside 元素在文章旁边有一个完美的空间。我想把它放在那里,但我不想使用相对位置,我只想使用 float 标签。 我的理解是,所有内容都应该是一个 inline-
我有以下 html5 代码。我希望文本 Business Ads 的样式为斜体且颜色为黄色。但它是红色的。 只能将某些样式应用到 aside 元素吗? CSS: aside h4 { fon
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
使用 时HTML 5 中的标记,我们是否需要添加 float:right (或 left )它的属性?因为大多数时候,它被用作侧边栏,我想。 这是个基本问题,但我只想找出正确的使用方法。 最佳答案
我可以使用多个 第二个侧边栏的标签? 例子: (FIRST) (SECOND) [or ?] 最佳答案 您可以 .尝试将其粘贴到 w3c 验证器的“直接输入”部分以供证明。您需要它是一个完整的
我目前正在学习 A Silberschatz、P Galvin、G Gagne 的操作系统。 我正在研究内存管理策略,以及他们介绍翻译后备缓冲区 (TLB) 的部分。 Some TLBs store
这个问题在这里已经有了答案: How to set a percentage height value in HTML/CSS (7 个答案) CSS - Equal Height Columns?
正如我的标题所述,我有一个网站,我试图将其基本上分为三栏。左边的第一列将包含 栏,最大的列将是包含段落、图像等的中心内容区域... 然后对于最右边的列,我需要它是一个 元素,它与其他列的高度相同,并且
我不明白为什么 body wrap 元素不能正常工作。 我不想添加额外的 div 并将其保留在该公式中。 有什么想法吗? 代码: body { backgr
我有一个带有 DIV 和 Aside 的网页,在 DIV 中我有一个带有动态分页的列表,一切都很好,除了在小型设备中 Aside 掩盖了分页,我看不到第 2 页和第 3 页....DIV ....
我左边的第一个边工作得很好,但是,我右边的第二个边被压低了。如何让它像#aside1 和 Section 一样位于顶部?我从以前的工作任务中复制了这段代码。我错过了隐藏在编码中的东西吗?如果您需要查看
我在 Joomla 中建立了一个站点 Here's the site使用自定义网格响应模板。目前我有一个非常基本的布局......页眉 - 部分 - 旁边 - 页脚。 然而,页脚似乎上升到 aside
对于一项学校作业,我需要在我的 HTML 列表中有一个“aside”标签。我为此选择了一张图片,但现在该图片位于网站其余部分的上方。我希望它居中。我的洞网站是居中的,所以我在两边都有一个白色的垂直空间
基本上,我正在尝试制作一个包含 3 个部分的页面 - 一个 aside 元素、一个 div 元素(用于动画但不相关)和一个页脚。我希望它的布局方式是页面左上角的 aside 元素,以及其下方的黑色 d
我是一名优秀的程序员,十分优秀!