Skip to content

Latest commit

 

History

History
49 lines (30 loc) · 2.24 KB

exercise7.md

File metadata and controls

49 lines (30 loc) · 2.24 KB

习题

  1. 什么是临界区?什么是竞争状态?什么是同步?

  2. 为什么要对共享队列加锁?

  3. 如何确定要保护的对象?

  4. 如何避免死锁?

  5. 内核中造成并发执行的原因是什么?

  6. 申明一个原子变量v,给其赋初值1,然后对其减1,并测试其结果。

  7. 申明一个锁定下半部的自旋锁,并给出如何使用它。

  8. 给出信号量的定义,并说明down()和up()的含义。

  9. 申明一个信号量,并给出如何使用它。

  10. 自旋锁和信号量各用在什么情况下。

  11. 分析给出的并发控制实例,上机调试,并对运行结果进行分析。

  12. 关于生产者和消费者问题,回答一下问题:

  (1) 在模块的插入函数procon_init中,为何要对信号量进行如下初始化:

    init_MUTEX(&sem_producer);

    init_MUTEX_LOCKED(&sem_consumer);

  可否将其改为:

    init_MUTEX_LOCKED(&sem_producer);

    init_MUTEX(&sem_consumer);

  为什么?

  (2) 在上述实例中,由于资金不足,牛奶生产厂家只有一条生产线。随着企业的发展壮大,客户需求日益增大,厂家决定投资多个生产线。上面的程序能否适应“多个生产者,一个消费者,一个公共缓冲区”这种情况?读者可去掉procon_init函数中注释的语句,重新编译并运行程序,看看程序执行结果是否正确。

  (3) 由于牛奶产品特别好,所以有多个代理商加入代理销售,上面的程序能否适应“多个生产者,多个消费者,一个公共缓冲区”这种情况?添加多个消费者线程,重新编译运行程序,查看结果是否正确。注意看消费者线程是否可以全部正确退出。

  (4) 随着企业的扩大,产品需求的增大,厂家决定多建几个仓库。在仓库有空间的情况下,生产线可以继续生产产品放入仓库,直到仓库放满。在仓库有产品的情况下,代理商可以订购产品,直到仓库中没有产品。修改程序,使之适应“一个生产者,一个消费者,多个缓冲区”,“多个生产者,多个消费者,多个缓冲区”这两种情况。