【问题标题】:Which is Faster, Fine-grained or Coarse-grained?哪个更快,细粒度或粗粒度?
【发布时间】:2020-05-03 13:57:17
【问题描述】:

我现在大二学习操作系统。 我想通过实现二叉搜索树和使用互斥锁来比较细粒度和粗粒度。 锁定和解锁用于节点插入和删除功能,并打印执行时间。 我认为细粒度会更快。但是,即使我更改数字,粗粒度也会更快。 有没有人可以解释一下?我写错代码了吗?

Result Page

Result Page 2

int lab2_node_insert_fg(lab2_tree *tree, lab2_node *new_node){
if (tree->root == NULL) {
    tree->root = new_node;
    return LAB2_ERROR;
}   
if (search_key(tree,new_node->key)) {
    return LAB2_ERROR;
}   
lab2_node* cur = tree->root;
while (1) {
    if (cur->key < new_node->key) {
        if (cur->right == NULL) {
            pthread_mutex_lock(&lock); // LOCK
            cur->right = new_node;
            pthread_mutex_unlock(&lock); // UNLOCK
            return LAB2_SUCCESS;
        }
        cur = cur->right;
    }
    else {
        if (cur->left == NULL) {
            pthread_mutex_lock(&lock); // LOCK
            cur->left = new_node;
            pthread_mutex_unlock(&lock); // UNLOCK
            return LAB2_SUCCESS;
        }
        cur = cur->left;
    }
}   

}

int lab2_node_insert_cg(lab2_tree *tree, lab2_node *new_node){
pthread_mutex_lock(&lock); // LOCK
if (tree->root == NULL) {
    tree->root = new_node;
    pthread_mutex_unlock(&lock); // UNLOCK
    return LAB2_ERROR;
}   
if (search_key(tree,new_node->key)) {
    pthread_mutex_unlock(&lock); // UNLOCK
    return LAB2_ERROR;
}   
lab2_node* cur = tree->root;
while (1) {
    if (cur->key < new_node->key) {
        if (cur->right == NULL) {
            cur->right = new_node;
            pthread_mutex_unlock(&lock); // UNLOCK
            return LAB2_SUCCESS;
        }
        cur = cur->right;
    }
    else {
        if (cur->left == NULL) {
            cur->left = new_node;
            pthread_mutex_unlock(&lock); // UNLOCK
            return LAB2_SUCCESS;
        }
        cur = cur->left;
    }
}   

}

【问题讨论】:

  • 不看代码说不出口。细粒度允许更多的并发性,但具有更高的开销。权衡是否有意义完全取决于您的工作量。
  • 我将在这里添加我的代码!
  • 一个 sn-p 如何比另一个更细粒度?它们似乎都只使用一个全局(或每棵树)锁。
  • 我一定是误会了。我刚刚意识到两者都使用一个锁。非常感谢您的建议!

标签: locking binary-search-tree mutex


【解决方案1】:

我假设第一个 sn-p 应该代表细粒度版本,另一个是粗粒度版本。

“细粒度”版本缺少用于创建根节点的锁。此外,您持有分配新节点的锁,您不这样做是为了条件。在迭代树时,在存在并发删除的情况下一次锁定一个节点是不够的。所有这些都是并发问题。

通常,细粒度和粗粒度锁定之间的区别不是锁定部分的“大小”(您使用锁定覆盖的代码量),而是指与数据结构相关的锁定粒度自己。

因此,一种方法是为整个树设置一个锁 - 粗粒度锁。另一种方法是在较低级别(例如每个节点)引入锁,以消除并行运行的两个操作在不同树节点上操作时的锁争用。这类似于数据库空间中表锁和行级锁的区别。

细粒度版本的一种方法是使用每个节点的锁并使用所谓的“hand-over-hand”锁定。对于插入操作,您必须锁定当前节点,直到您在下降时识别并锁定下一个节点。

做更多的研究,相应地改变你的实现并重新测试。

一般来说,如果访问模式往往会遇到不同的锁,那么细粒度的锁定可以带来更具可扩展性的实现。如果大多数情况下不是这种情况,那么粗粒度版本的性能可能会一样好或稍好一些,因为可以在整个操作过程中保持一个锁,而不必获取不同的锁,其中大多数锁会再次导致锁争用。与往常一样,这取决于实际的使用模式。

【讨论】:

  • 我认为我提到的示例中两者之间的区别在于大小。我一定是误会了。感谢您的解释,我可以理解这个概念。感谢您的详细解释!
  • 不客气!如果答案有帮助,请考虑正式接受。
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2014-11-29
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多