> For the complete documentation index, see [llms.txt](https://nankai.gitbook.io/ucore-os-on-risc-v64/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nankai.gitbook.io/ucore-os-on-risc-v64/lab7/lian-xi.md).

# 练习

## 练习1：说明不会出现死锁的原因

1. 证明/说明为什么我们给出的信号量实现的哲学家问题不会出现死锁。不必特别严谨，但要能说服你自己/助教？
2. 证明/说明为什么我们给出的条件变量实现的哲学家问题不会出现死锁。不必特别严谨，但要能说服你自己/助教？

## 练习2：设计方案

1. 给出为用户态进程/线程提供信号量机制的设计方案，并比较说明给内核级提供信号量机制的异同。
2. 给出为用户态进程/线程提供条件变量机制的设计方案，并比较说明给内核级提供条件变量机制的异同。

## 练习3：信号量实现条件变量

能否不基于信号量机制来完成条件变量？如果不能，请给出理由，如果能，请给出设计说明和具体实现。

## 练习4：禁用中断

kern/sync/sem.c的信号量实现中，出现了这样的暂时禁用中断的代码：

```c
static __noinline uint32_t __down(semaphore_t *sem, uint32_t wait_state) {
    bool intr_flag;
    local_intr_save(intr_flag);
    /*some code*/
    local_intr_restore(intr_flag);
}
```

我们其实从正确的框架里删除了两句`local_intr_restore(intr_flag)`和一句`local_intr_save(intr_flag);`，请你找出是哪里删掉了，并举出删掉之后不能正常工作的一种情况。
