- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在探索MONITOR
指令(或等效的内在函数_mm_monitor
)的用法。尽管我找到了描述它们的文献,但是我找不到有关如何使用它的任何具体示例/样本。
任何人都可以分享在驾驶员中如何使用此指令/本征的示例吗?本质上,我想用它来监视内存范围。
最佳答案
monitor
指令使用RAX/EAX/AX
中指定的地址武装地址监视硬件。
监控器的状态由mwait
指令使用。
使用的有效地址大小(16位,32位或64位)取决于编码指令的有效地址大小(即可以用67h
前缀覆盖,默认情况下与代码大小相同)。rax/eax/ax
中给出的地址是逻辑地址的偏移部分,将从该逻辑地址中计算用于武装监视器的线性地址。
细分部分默认为ds
,可以使用细分覆盖前缀来更改细分。
作为用于监视器的线性地址,分页不会影响监视。
CPUID.01H:ECX.MONITOR [bit 3] 1位指示monitor
(和mwait
)指令的可用性。
这是一个特权说明,但英特尔声称:
该指令有条件地以大于0的级别提供。
建议的检测这种情况的方法是尝试执行monitor
并处理最终的#UD异常(以自定义方式向OS报告给Userland程序)。
监视的地址范围必须是可写回缓存的。
由于涉及高速缓存和高速缓存一致性子系统,因此以最小和最大大小给出了地址范围的大小。
CPUID.01H:EAX [bit 15:0]给出最小范围大小。这是由硬件监视器监视的区域的长度。
但是,高速缓存一致性流量可能会与较大的“块”(行)一起工作,并且如果监视区域中包含后者,则与受监视区域相邻的写操作仍将触发它。
这会导致最大范围大小,可以在CPUID.01H:EBX [bit 15:0]中找到它。
要正确使用monitor
,请确保所监视的数据结构适合最小范围大小,但还要确保没有代理在其旁边的地址中写入最大范围大小的数据。
例如,如果最小范围为8个字节,最大范围为16个字节,请确保观察的结构适合8个字节,但再填充8个字节以达到总计16个字节,以便从第8个字节开始写入到第16个字节。
在单个群集系统中,以上两个值相等。我的都是64字节。
BIOS负责报告多群集系统中IA32_MONITOR_FILTER_LINE_SIZE
中的高速缓存一致性行大小。
出于指令订购和访问权的目的,monitor
是一种负载。monitor
允许程序员指定提示和扩展名。
扩展名在ecx
中指定,而提示则在edx
中指定。
不支持的扩展引发#GP异常,不支持的提示将被忽略。
我不知道monitor
的任何扩展名或提示,英特尔手册报告
对于奔腾4
处理器(系列15,模型3), undefined 任何扩展名或提示。
我认为这条线通常是正确的,只是其中包含了过时的处理器模型。
此外,monitor
的伪代码报告为#GP If ECX ≠ 0.
武装监视器而不检查其状态(使用mwait
)不会造成任何伤害。
内在函数是void _mm_monitor(void const *p, unsigned extensions,unsigned hints)
。
监视器布防后,可以由不同条件触发:
mwait
对其进行测试。
mwait
进入实现定义的低功耗状态,直到监视器处于触发状态。
mwait
是
nop
,否则它将使处理器停止执行指令,直到触发监视器为止。
mwait
扩展名和提示。
ecx
中设置,提示在
eax
中。
void _mm_mwait(unsigned extensions, unsigned hints)
。
monitor
/
mwait
机制来帮助线程之间的同步,由于触发条件包括频繁发生的事件,因此它不太适合监视内存范围的访问。
mwait
之后,始终必须检查是否写入了监视范围。
monitor
/ mwait
对。 mwait
,将观察到的结构值与1(发生写入)进行比较,如果不相等,则执行跳转回2。struct MonitoredType
{
int (*event)(struct MonitoredType const* m); /*Return 0 to keep monitoring*/
struct AnyType data; /*Less, in size, than MIN_MONITOR_RANGE*/
char padding[MAX_MONITOR_RANGE - sizeof(AnyType)];
};
void wait_for_write(struct MonitoredType const* m)
{
/* This may miss a write if it happens before MONITOR, beware of race conditions if necessary */
do
{
_mm_monitor(&m->data, 0, 0);
_mm_mwait(0, 0);
} while ( ! m->event(m));
}
mwait
的退出条件是写操作,而不是其他事件之一。event
的原因。cpuid
设置为01h的情况下执行eax
,然后测试ecx
的第3位。请注意,IA32_MISC_ENABLE
允许操作系统或固件禁用monitor/mwait
。
关于x86 - 驱动程序将如何使用MONITOR指令(_mm_monitor内部函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44994106/
我是 iOS 开发新手。我正在解决的是如何在 iPhone 中运行我的应用程序时获取有关该应用程序的信息。 例如:当我在 Android 中开发时,我连接手机(使用净化模式)并打开 Android M
我仍然不确定这两个调用之间的区别。来自 MSDN, Monitor.Enter(Object) 获取指定对象的独占锁。 Monitor.Wait(Object) 释放对象上的锁并阻塞当前线程,直到它重
我是 GCP 的新手并且来自 Azure 背景。在 GCP 端是否有等效的“Azure Application Insights”用于监控应用程序? 让我用一个例子更清楚地解释我的用例:如果我有一个基
这是说明问题的最小代码: StringBuilder input = new StringBuilder(); void ToUpper() { lock (input) {
我在 ASP.NET 中有一个生产者-消费者场景。我设计了一个Producer 类,一个Consumer 类和一个用于保存共享对象并负责Producer 和Consumer 之间通信的类,我们称它为M
是否可以检测是否是同一个线程试图释放锁?我们在代码中有很多地方看起来像: try { try { if(!Monitor.TryEnter(obj, 2000))
我对并发编程有点陌生,正在尝试了解使用 Monitor.Pulse 和 Monitor.Wait 的好处。 MSDN 的例子如下: class MonitorSample { const in
如果您想在退出和清理对象时阻止执行某些代码块,是否可以使用锁来阻止执行? Monitor.TryEnter(cleanupLock, ref acquiredLock); TryEnter 可用于确保
Monitor.Enter 和 Monitor.Exit 设计为从同一线程调用。但是,如果我需要在与获得的线程不同的线程中释放锁怎么办? 例如:有共享资源和使用该资源的异步操作。该操作以 BeginO
Monitor.PulseAll 通知队列中的所有等待线程。 Monitor.Pulse 通知等待队列中的一个线程。 (下一个等待线程) 只有下一个线程(一个线程)才能获取锁。那有什么区别呢? 什么时
我正在尝试在我的 terraform 代码库中集成对 sshd 进程的 Datadog 监视器检查,但我收到 datadog_monitor.host_is_up2: error updating m
这里的问题是:如果获取对象独占锁的线程(例如通过使用 Monitor.Enter)终止,是否会神奇地释放该对象的独占锁?如果那是真的,那么假设我们从另一个线程调用 Monitor.Exit - 因为我
我正在研究 .NET 中的 Monitor 类,所以我找到了一段似乎可以正常工作的代码,但是当我将它循环一段时间时,它会抛出 OutOfMemoryException。 我在具有 8 GB RAM 的
ECMA-335 规范规定如下: *获取锁(System.Threading.Monitor.Enter 或进入同步方法)应隐式执行 volatile 读取操作,并释放锁(System.Threadi
我在 dll 中使用 OmniThreadLibrary 2.09,主应用程序和 dll 使用相同的 SimpleShareMem 内存管理器。 我用以下代码创建了自己的监视器: FMonitor
我正在使用 R 包 monitoR并收到一条我无法理解的错误消息。 我正在尝试使用 dbUploadTemplate 命令将关联模板列表(“bithTemps”)上传到 MySQL 数据库(“noh”
我想我遗漏了一些关于 Monitor.Enter 和 Monitor.TryEnter 正确行为的信息。这是我编写的一段代码,用于将问题与其余代码分开: object lockObj = new ob
我正在尝试实现一个多线程库,该库将使用线程池同时运行任务。基本上它会从它收到的收集参数中将任务添加到线程池,然后等待直到正在处理的最后一个任务发送脉冲信号。我在早期的测试中取得了成功,但是当我想测试处
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
根据语言规范,lock(obj) statement; 会被编译为: object lockObj = obj; // (the langspec doesn't mention this var,
我是一名优秀的程序员,十分优秀!