为什么Dalvik Monitor在8字节边界上对齐

时间:2013-09-26 08:06:40

标签: android c++ monitor dalvik

<code root>/dalvik/vm/Sync.cpp中的

,有一个struct Monitor

struct Monitor {
    Thread*     owner;          /* which thread currently owns the lock? */
    int         lockCount;      /* owner's recursive lock depth */
    Object*     obj;            /* what object are we part of [debug only] */

    Thread*     waitSet;    /* threads currently waiting on this monitor */

    pthread_mutex_t lock;

    Monitor*    next;

    /*
     * Who last acquired this monitor, when lock sampling is enabled.
     * Even when enabled, ownerMethod may be NULL.
     */
    const Method* ownerMethod;
    u4 ownerPc;
};

我无法理解为什么Monitor与8个字节对齐。我认为它应该对齐4个字节,因为其中的所有成员(即指针,intpthread_mutex_t)的长度为4个字节。

1 个答案:

答案 0 :(得分:3)

问题没有明确显示,但是通过8字节对齐,您可能意味着code的这一部分,Misaligned monitor检查:

Monitor* dvmCreateMonitor(Object* obj)
{
    Monitor* mon;
    mon = (Monitor*) calloc(1, sizeof(Monitor));
    if (mon == NULL) {
        ALOGE("Unable to allocate monitor");
        dvmAbort();
    }
    if (((u4)mon & 7) != 0) {
        ALOGE("Misaligned monitor: %p", mon);
        dvmAbort();
    }

原因是Dalvik使用薄锁定。锁是对象的32位值,底部3位用于编码锁状态:一位用于瘦/胖锁状态,两位用于散列状态。指向Monitor本身的指针只剩下29位。

来自同一个source

  

锁定值本身存储在Object.lock中。 LSB的   锁定其状态。清除后,锁定在“薄”   state及其位的格式如下:

[31 ---- 19] [18 ---- 3] [2 ---- 1] [0]
 lock count   thread id  hash state  0
  

设置后,锁定处于“胖”状态并且其位被格式化   如下:

 [31 ---- 3] [2 ---- 1] [0]
   pointer   hash state  1

供参考,以下是描述精简锁定的文章:Thin Locks: Featherweight Synchronization for Java

在评论中,您询问如何完成对齐。 C标准只需要分配器返回一个可以在任何类型的赋值中使用的地址。从C99§7.20.3(内存管理功能):

  

如果分配成功,则返回指针,以便将其分配给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空格为明确解除分配)。

默认情况下,32位ARM系统上的malloc/calloc/realloc返回8字节对齐的块。我相信Misaligned monitor检查就像防御代码一样快速失败,以防分配器被替换为不返回8字节对齐块的版本。