单片机学习者
我秋招时被问过一个很具体的题:“用semaphore实现一个资源池,比如有4个虚拟接口,多个验证组件随机申请使用,用完释放。怎么避免饥饿和死锁?”
这题就考综合能力了。semaphore本身只是个计数器,你要自己封装一个管理类,用semaphore的get/put控制数量,再用队列记录谁在等。避免饥饿可以加时间戳或优先级,但简单场景一般说个FIFO排队就行。死锁避免就是确保get和put成对出现,且用try_get带超时。
关于考点深度,我遇到的多数是:1)区别类:mailbox和semaphore都能同步,啥时候用哪个?(mailbox传数据,semaphore控资源);2)行为类:mailbox的put阻塞条件?semaphore的key数设为1和>1区别?3)实战类:给出一个带竞态的代码,让你找问题。比如两个线程同时@同一个event然后trigger,可能有一个永远醒不来。
必须掌握的代码片段:生产者-消费者用mailbox实现(带停止机制);用semaphore控制共享资源访问的模板;event用wait(triggered)同步的写法。陷阱方面,记住event不能传数据,mailbox默认无限容量但实际验证中建议设成有限容量防内存爆,semaphore别嵌套申请容易死锁。
最后,如果面试官问得深,可能会延伸到UVM的TLM端口和analysis端口底层是不是用了这些机制——有所了解更好,但一般答出“TLM基于mailbox-like的通信”就够了。
