Как Blink-tree справляется с такой ситуацией?

При вставке в Blink-дерево он сохраняет путь от корневого узла к конечному узлу. И когда дочерний узел разделится, он распространит такие изменения на родительские узлы. Предположим, что при распространении исследуется корневой узел в потоке A, а текущая вставка проверяет стек (используемый для хранения пути) и обнаруживает, что нижний узел в стеке является «корневым». И «корень» тоже нужно расщепить. Это создаст новый корень.

Итак, что, если «корень» уже разделен другим потоком, и «корень» теперь не является настоящим корнем. Таким образом, создание нового корня, сделанного потоком А, неверно.

Как Blink-tree справляется с такой ситуацией?


person injoy    schedule 01.04.2013    source источник
comment
Что такое мигающее дерево?   -  person Oliver Charlesworth    schedule 02.04.2013
comment
@OliCharlesworth, см. cs.cornell.edu/courses/cs4411/2009sp/ блинк.pdf   -  person injoy    schedule 02.04.2013


Ответы (1)


Я не уверен, как авторы намеревались решить эту проблему (и я думаю, что это реально). Одна из возможностей состоит в том, чтобы добавить блок заголовка, содержащий высоту (глубину) дерева и адрес первого блока для каждой высоты над листьями. Если вы когда-нибудь выйдете за конец стека, вам нужно заблокировать этот блок и прочитать его, чтобы определить новый корень (или, точнее, первый блок на высоте выше высоты дерева в вашем стеке). Если он есть, разблокируйте блок заголовка и добавьте блок в стек, прежде чем продолжить. Если новый корень не существует, вы можете создать его и добавить в блок заголовка перед обратной записью индексного блока (после записи нового корня). Теоретически это могло произойти более одного раза, если корень несколько раз разделялся между фазами вверх и вниз. Блокируя блок заголовка перед его проверкой и перед добавлением нового корня, я думаю, вы можете сохранить инварианты упорядочения для предотвращения взаимоблокировок.

person DrC    schedule 02.04.2013