这个问题被作为半导体公司技术面试的起点。我想没有正确的答案 - 这个开放式问题的目的是衡量工程师的深度和舒适度。问题: - 设计一个监控地址的API,并在地址包含特定值时返回: -
void reach_target_value(volatile int* addr, int value);
我天真的解决方案是这样的: -
void reach_target_value(volatile int* addr, int value)
{
while(*addr != value)
{
//Do nothing - spin in a tight loop
}
}
现在显然在多处理/多线程环境中,如果在执行进程/线程被上下文切换时地址恰好达到目标值,则可能会错过返回。在这种情况下,如何增强代码以确保它在多线程环境中运行良好,其中多个线程将监视具有不同目标值的相同地址?感谢您的阅读 - 感谢您的建议 - 代码 - 指针!
答案 0 :(得分:5)
这是一个可以(正如您所假设的)以最广泛的方式回答的问题。这个面试问题的关键不在于你的答案(你得到的先决条件,你无论如何都无法回答) - 而是你的澄清问题,你是否有方法和技巧来通过越来越详细的问题包围问题来追查问题
可能的答案范围从您的"天真"忙等待方法,这可以是一个完全有效的解决方案,例如,等待中断的AVR Tiny,并且绝对没有别的事可做,而不是使用计时器任务经常监视使用{{1}的更改在嵌入式Linux系统上观看变量"在硬件中"一旦某些代码写入该内存,就会收到一个信号(还有很多其他方法可以解决问题)。
"正确的方式"做事情取决于你的面试官实际期望你提出的大量先决条件,(并且没有答案,没有可能的答案),如
mprotect
的页面错误?相关:我们是否有任何可以帮助我们的硬件,如MMU或硬件观察点支持?而且,总结一下:面试官肯定不会期待看到代码 - 他们希望听到你的澄清问题和你在问题上的能力,最终提出一个可行的解决方案(显然很简单) )问题。我实际上觉得这是一个非常好的面试问题。
答案 1 :(得分:3)
我认为在循环中重复检查不是一个好的设计。
实际上,这个问题与以下问题具有相同的技术要点: Watch a memory location/install 'data breakpoint' from code?
当您检测到内存更改时,是检查值并确定是否返回的时间。