1.[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)
2.Synchronizeçå®ç°åç
3.深入理解多线程(四)—— Moniter的实现原理
[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)
在探讨UVM(Universal Verification Methodology)中的浅拷贝(shallow copy)与深拷贝(deep copy)之前,我们先对相关概念进行简要介绍,以便于理解以下讨论。浅拷贝和深拷贝是对象编程领域中基本概念,不仅限于系统Verilog(SV)和UVM(Universal Verification Methodology)。
浅拷贝:这一概念涉及的港股 App 源码是拷贝对象的指针,即浅拷贝只复制指向对象内存空间的指针,使得目标对象与源对象共享同一内存空间。浅拷贝的局限性在于当内存空间被销毁时,所有指向该空间的指针必须重新定义,否则会导致野指针错误。
深拷贝:与此相反,博客c 源码下载深拷贝确保源对象和拷贝对象完全独立,两者之间互不影响,包括内存空间内容也被复制一份。例如,基本类型如Int、Double,以及结构体(struct)、枚举(Enum)会自动执行深拷贝,而类类型的对象则需区分浅拷贝与深拷贝。
在UVM中,`uvm_object`类提供了`copy`与`clone`函数来实现对象的免费暗雷源码拷贝。
`copy`函数为非虚拟、无返回值的函数,不能被重写,但`do_copy`函数为虚拟函数,可以通过重写`do_copy`函数实现对`copy`函数的间接重写。调用`copy`函数前,目标对象需先创建,以实现源对象内部对象的深拷贝赋值,而不会对目标对象本身分配空间。
`clone`函数为虚拟函数,返回`uvm_object`类型,cmd荒野行动源码可以被重写。由于返回值类型限制,`clone`只能通过`$cast`来实现目标对象类型的转换,而不能直接赋值。`clone`函数返回一个指向源对象类型的`uvm_object`句柄,因此目标对象类型必须与源对象一致(通过`$cast`检查),以确保成功执行`clone`操作,且目标对象不需要事先分配空间,因为`clone`会自动分配新空间。
`copy`函数的实现中,除了`do_copy`之外的jspmvc架构网站源码第行的`__m_uvm_field_automation(rhs, UVM_COPY, "")`完成了在`field_automation`中的配置实现。如果未重写`do_copy`函数,则所有拷贝行为依赖于`__m_uvm_field_automation`函数。
`uvm_object_defines.svh`文件在第行实现了将`copy`传入参数转换为局部变量`local_data__`,该变量类型为通过`uvm_object_untils_begin`传入的参数类型。`local_data__`在后续的`uvm_field_automation`宏中根据传入的标志位进行相应操作,以`uvm_field_object`为例。
在`uvm_field_object`中,关于`UVM_COPY`的具体操作表明,调用`copy`的源对象不能为空。如果`FLAG&UVM_NOCOPY`位为1,则直接结束代码执行。如果`FLAG&UVM_REFERENCE`位为1,或者`local_data__.ARG == null`,则将目标对象的`ARG`对象句柄指向源对象的`ARG`句柄。这种做法对于未分配空间的对象赋值,以避免错误。`UVM_REFERENCE`的应用场景主要针对`uvm_component`类型的对象注册,确保在进行`copy`和`clone`时执行浅拷贝,避免深拷贝导致的问题。
`uvm_component`类型在`copy`时默认执行深拷贝,而`UVM_REFERENCE`标志位则实现浅拷贝。例如,在`apb_env`中,`bus_monitor`和`bus_collector`被例化为`master`中的`monitor`和`collector`,同时`cfg`对象也传递给`master`。通过`field_automation`的修改,可以观察到`uvm_top`在打印树型结构时,`apb_monitor`和`cfg`对象的打印信息。
总结而言,UVM中的默认拷贝/克隆操作为深拷贝,`UVM_REFERENCE`标志位用于实现浅拷贝。理解这些概念对于在UVM中进行对象拷贝时避免错误至关重要。
Synchronizeçå®ç°åç
Java对象å¨JVMä¸çç»æå¦ä¸ï¼java对象å æ¬ï¼
对象é½å¨/ä½æºå¨ä¸æ¯ä¸ªé¨ååå«æ¯/ä½ï¼Class Pointerå¨ä½æºå¨é»è®¤å¼å¯æéå缩ï¼åªå ç¨ä½ã
对象å é使ç¨çæ¯Mark Wordå段ï¼å¦ä¸æ¯ä½çMark Word
éè¿ synchronize å ³é®åç»å¯¹è±¡å éçè¿ç¨å¦ä¸ï¼
JVMå¼å ¥ååéæ¯ä¸ºäºå¨æ å¤çº¿ç¨ç«äºçæ åµä¸å°½éåå°ä¸å¿ è¦çè½»é级éæ§è¡è·¯å¾ï¼å 为轻é级éçè·ååéæ¾ä¾èµå¤æ¬¡CASååæ令ï¼èååéåªéè¦å¨ç½®æ¢ ThreadID çæ¶åä¾èµä¸æ¬¡CASååæ令ï¼ä¸æ¦åºç°å¤çº¿ç¨ç«äºçæ åµå°±å¿ é¡»æ¤éååéï¼ã
ååéåªæéå°å ¶ä»çº¿ç¨å°è¯ç«äºååéæ¶ï¼ææååéç线ç¨æä¼éæ¾éï¼çº¿ç¨ä¸ä¼ä¸»å¨å»éæ¾ååéãååéçæ¤éï¼éè¦çå¾ å ¨å±å®å ¨ç¹ï¼å¨è¿ä¸ªæ¶é´ç¹ä¸æ²¡æåèç æ£å¨æ§è¡ï¼ï¼å®ä¼é¦å æåæ¥æååéç线ç¨ï¼å¤æé对象æ¯å¦å¤äºè¢«éå®ç¶æï¼æ¤éååéåæ¢å¤å°æªéå®ï¼æ å¿ä½ä¸ºââï¼æè½»é级éï¼æ å¿ä½ä¸ºââï¼çç¶æã
è½»é级éæéåºçåºæ¯æ¯çº¿ç¨äº¤æ¿æ§è¡åæ¥åçæ åµï¼å¦æåå¨åä¸æ¶é´è®¿é®åä¸éçæ åµï¼å°±ä¼å¯¼è´è½»é级éè¨è为éé级éã
synchronizeçå®ç°è¿ç¨ï¼
注æï¼lockåç¼æ令çåè½ï¼Synchronizeï¼ volatileï¼CMSé½æ¯ä½¿ç¨è¿ä¸ªå®ç°
å½éè¨èæéé级éçæ¶åï¼å¨JVMä¸å½åéå¯¹è±¡å ³èçObjectMonitor对象ã
ObjectMonitor对象çæ°æ®ç»æå¦ä¸ï¼
EntryListæ¯ä¸ä¸ªåè¿å åºçååé¾è¡¨ï¼AQSï¼ReentrantLockï¼æ¯ä¸ä¸ªå è¿å åºçååé¾è¡¨ã
ObjectMoniterçæµç¨ï¼
注æï¼
Synchronizeåªæä¸ä¸ªWaitSetï¼AQSå¯ä»¥å建å¤ä¸ªConditionéåï¼åè½åWaitset类似ï¼ã
synchronizeçå®ç°åç_ææ¯æµæ°´-CSDNå客_synchronize
深入理解多线程(四)—— Moniter的实现原理
深入理解多线程(四)—— Moniter的实现原理
在Java中,Monitor是实现线程同步的关键机制,源于操作系统中的管程概念。它是解决多线程共享资源并发问题的核心工具,确保在同一时刻只有一个线程能访问特定数据和代码,确保可见性和原子性。Monitor可以理解为一个特殊房间,由ObjectMonitor类在Java虚拟机(HotSpot)中实现,它维护了线程的访问控制和等待状态。
ObjectMonitor的数据结构包含了关键字段,如_owner(持有者线程)、_WaitSet(等待队列)和_EntryList(阻塞队列),以及计数器_recursions和_count。当线程获取锁时,会进入_EntryList,获得锁后进入_Owner区域并增加计数,反之,调用wait方法后线程进入_WaitSet等待,并减少计数。这些操作确保了锁的互斥性和条件变量的使用。
HotSpot虚拟机中的Moniter实现包括加锁(enter)和解锁(exit)操作,这些操作在JDK1.6之前是重量级的,因为涉及底层操作。为了提高效率,JDK1.6引入了轻量级锁等优化,后续的文章将深入探讨这些锁的类型和它们之间的关系,以提升线程间的共享数据和竞争问题的解决效率。