欢迎来到【抽签顺序php源码】【技术博客github源码】【apicloud侧边栏源码】objectmonitor源码-皮皮网网站!!!

皮皮网

【抽签顺序php源码】【技术博客github源码】【apicloud侧边栏源码】objectmonitor源码-皮皮网 扫描左侧二维码访问本站手机端

【抽签顺序php源码】【技术博客github源码】【apicloud侧边栏源码】objectmonitor源码

2024-12-24 03:06:00 来源:{typename type="name"/} 分类:{typename type="name"/}

1.[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)
2.Synchronize的实现原理
3.深入理解多线程(四)—— Moniter的实现原理

objectmonitor源码

[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)

       在探讨UVM(Universal Verification Methodology)中的浅拷贝(shallow copy)与深拷贝(deep copy)之前,我们先对相关概念进行简要介绍,以便于理解以下讨论。浅拷贝和深拷贝是对象编程领域中基本概念,不仅限于系统Verilog(SV)和UVM(Universal Verification Methodology)。

       浅拷贝:这一概念涉及的抽签顺序php源码是拷贝对象的指针,即浅拷贝只复制指向对象内存空间的指针,使得目标对象与源对象共享同一内存空间。浅拷贝的局限性在于当内存空间被销毁时,所有指向该空间的指针必须重新定义,否则会导致野指针错误。

       深拷贝:与此相反,技术博客github源码深拷贝确保源对象和拷贝对象完全独立,两者之间互不影响,包括内存空间内容也被复制一份。例如,基本类型如Int、Double,以及结构体(struct)、枚举(Enum)会自动执行深拷贝,而类类型的对象则需区分浅拷贝与深拷贝。

       在UVM中,`uvm_object`类提供了`copy`与`clone`函数来实现对象的apicloud侧边栏源码拷贝。

       `copy`函数为非虚拟、无返回值的函数,不能被重写,但`do_copy`函数为虚拟函数,可以通过重写`do_copy`函数实现对`copy`函数的间接重写。调用`copy`函数前,目标对象需先创建,以实现源对象内部对象的深拷贝赋值,而不会对目标对象本身分配空间。

       `clone`函数为虚拟函数,返回`uvm_object`类型,影视源码网页版可以被重写。由于返回值类型限制,`clone`只能通过`$cast`来实现目标对象类型的转换,而不能直接赋值。`clone`函数返回一个指向源对象类型的`uvm_object`句柄,因此目标对象类型必须与源对象一致(通过`$cast`检查),以确保成功执行`clone`操作,且目标对象不需要事先分配空间,因为`clone`会自动分配新空间。

       `copy`函数的实现中,除了`do_copy`之外的网站QQ分享源码第行的`__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引入了轻量级锁等优化,后续的文章将深入探讨这些锁的类型和它们之间的关系,以提升线程间的共享数据和竞争问题的解决效率。