在Linux内核中,为了存储进程的内存区域,Linux同时使用链表和红黑树。 find_vma是用于查找第一个内存区域的函数,该内存区域的vm_end字段大于通过红黑树传递的地址。但是,我发现它对find_vma()内的红黑树没有任何保护(如锁)。如果另一个线程调用rb_erase函数同时删除树上的某些元素怎么办?

最佳答案

是的,可以防止find_vma函数调用通过信号灯并发访问。
在调度程序中,函数还与信号量调用一起使用。

        2209         down_read(&mm->mmap_sem);
        2210         vma = find_vma(mm, start);
        ....
                     up_read(&mm->mmap_sem);



    mmap_sem is used to protect this function call which is a read-write semaphore.
    struct rw_semaphore mmap_sem; defined inside struct mm_struct.

关于linux - 内核中的红黑树不 protected 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33954040/

10-10 03:12