【问题标题】:OS crahes when using read/write locks使用读/写锁时操作系统崩溃
【发布时间】:2012-08-02 20:38:36
【问题描述】:

操作系统:Oracle VM Virtual Box 上的 FreeBSD 8.2

我正在尝试测试尝试获取读锁的进程是否会被阻塞,直到它能够获取它。在进程#1 中初始化rw_lock 并将锁作为写入者锁定后,我创建了第二个进程,它尝试使用阻塞rw_rlock() 作为读取者获取锁。我想要的是让进程#2 被阻塞,直到进程#1 释放写锁,所以我试图使用暂停来确保进程#2 有足够的时间来安排。但是,在这种情况下,同样的暂停会以某种方式使系统崩溃,因为如果将其删除,则程序运行良好。如果我用进程#1 中的繁忙循环替换暂停,则进程#2 直到进程#1 完成才被安排,因此它破坏了测试的重点。 DELAY() 也不允许安排进程#2。任何指针将不胜感激。

过程#1:

static void test_rw_rlock(void)
{ 
    const int seconds = 1;
    rw_init(pResourceLock, "RWLock");
    rw_wlock(pResourceLock);
    kproc_create(&use_rw_rlock, NULL, NULL, 0, 0, "use_rw_rlock()");
    pause("---", hz * seconds);
    rw_wunlock(pResourceLock);
    rw_destroy(pResourceLock);
}

过程#2:

static void use_rw_rlock(void* arg)
{
    rw_rlock(pResourceLock);
    rw_unlock(pResourceLock);
    kproc_exit(0);
}

【问题讨论】:

  • 信号量不考虑吗? (POSIX 或 Sys V)
  • 我必须使用 rwlock,因为我正在使用的代码使用它
  • 只是想一想,如果你fork()在输入锁码之前暂停,你还会崩溃吗?
  • 您确定您的进程共享相同的地址空间吗?
  • @TJD:来自 kproc 的手册页“新进程与进程 0(交换进程)共享其地址空间,并且仅在内核模式下运行。”所以他们应该共享地址空间。如果我在新进程中增加一个变量,则更改会反映在前一个进程中。

标签: c unix process scheduling freebsd


【解决方案1】:

睡觉时持有 rw 锁是禁忌。

【讨论】:

  • 有没有办法让进程#2 在进程#1 持有rw 锁而不休眠的情况下执行?
  • 您的代码有两个问题:kproc_create 以及 pause 可以/将休眠。通常,更好的方法是在新进程启动后获得一个锁。但是,如果您实际描述您想要实现的目标,这可能会有所帮助。
  • 我正在尝试在 vxWorks 中实现与 FreeBSD rwlock 相同的功能,因此重点是验证 vxWorks 中 rwlock 包装器的行为是否仍然相同。这就是为什么我希望进程#2 尝试获取进程#1 持有的锁
  • 同步启动最好使用信号量,然后使用 rw lock 进行实际测试。进程 1(驱动进程)获得 rw 锁,然后发布信号量。另一个进程尝试先获取信号量,然后再获取 rw 锁。
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多