【问题标题】:is red black tree in kernel not protected?内核中的红黑树是否不受保护?
【发布时间】:2016-03-01 11:00:12
【问题描述】:

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

【问题讨论】:

  • 不是通过RCU管理的吗?
  • 看来find_vma 本身应该被调用以防止并发访问(修改)。 @Joe:与列表不同,rb-tree 不受 RCU 保护。
  • @Tsyvarev 感谢您的回复。我同意你的看法。比如在sys_msyncmsync的系统调用)中,它先调用down_read(&current->mm->mmap_sem)再调用find_vma。这能保护红黑树吗?
  • @Joe 感谢您的回复。您能否提供一些参考来支持您的想法?
  • @Tsyvarev 为什么 rb-tree 不能被 rcu 锁保护?

标签: linux linux-kernel red-black-tree


【解决方案1】:

是的,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.

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2015-04-16
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2013-07-16
    • 2013-02-01
    • 2010-09-06
    相关资源
    最近更新 更多