习题
-
什么是临界区?什么是竞争状态?什么是同步?
-
为什么要对共享队列加锁?
-
如何确定要保护的对象?
-
如何避免死锁?
-
内核中造成并发执行的原因是什么?
-
申明一个原子变量v,给其赋初值1,然后对其减1,并测试其结果。
-
申明一个锁定下半部的自旋锁,并给出如何使用它。
-
给出信号量的定义,并说明down()和up()的含义。
-
申明一个信号量,并给出如何使用它。
-
自旋锁和信号量各用在什么情况下。
-
分析给出的并发控制实例,上机调试,并对运行结果进行分析。
-
关于生产者和消费者问题,回答一下问题:
(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) 随着企业的扩大,产品需求的增大,厂家决定多建几个仓库。在仓库有空间的情况下,生产线可以继续生产产品放入仓库,直到仓库放满。在仓库有产品的情况下,代理商可以订购产品,直到仓库中没有产品。修改程序,使之适应“一个生产者,一个消费者,多个缓冲区”,“多个生产者,多个消费者,多个缓冲区”这两种情况。