问答题
阅读以下说明和C语言代码,回答问题1至问题4,将解答填入对应栏内。
[说明]
有两个任务(编号分别为0和1)需要访问同一个共享资源,为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个任务访问该共享资源。代码一给出了一种实现方法。
[代码一]
1: int flag[2]; /* flag 数组,初始化为FALSE */
2: Enter_Critical_Section(int my_task_id, int other_task_id)
3: {
4: while (flag[other_task_id] == TRUE); /* 空循环语句 */
5: flag[my_task_id] = TRUE;
6: }
7: Exit_Critical_Section(int my_task_id, int other_task_id)
8: {
9: flag[my_task_id] = FALSE;
10: }
当一个任务要访问临界资源时,就可以调用代码一给出的这两个函数。代码二给出了任务0的一个例子。
[代码二]
Enter_Critical_Section(0,1);
…使用这个资源…
Exit_Critical_Section(0,1);
…做其他事情…
问答题
什么是临界资源(critical resource)?请用100字以内文字简要说明。
【正确答案】
【答案解析】在多道程序系统中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用。需要互斥访问的资源称为临界资源(critical resource),如打印机、共享变量和表格等。
问答题
代码一所示的方法能够实现共享资源的互斥访问吗?请用300字以内文字举例说明。
【正确答案】
【答案解析】代码一所示的方法不能实现资源的互斥访问。
例如,考虑如下的情形;
(1)初始化的时候,flag数组的两个元素值均为PALSE;
(2)任务0先执行,在执行while循环语句时,由于flag[1]=FALSE,所以顺利结束,不会被卡住,假设这个时候来了一个时钟中断,打断其运行:
(3)任务1去执行,在执行while循环语句时,由于flag[0]=FALSE,所以顺利结束,不会被卡住,然后就进入了临界区;
(4)后来当任务0再执行时,也进入了临界区,这样就同时有两个任务在临界区。
问答题
代码一采用了一种繁忙等待(busywaiting)的策略,这种策略的缺点是什么?请用100字以内的文字简要说明。
【正确答案】
【答案解析】缺点是会浪费大量的CPU时间。
简要说明:繁忙等待(busy waiting.)的基本思路是,当一个任务要进入临界区,首先需要检查是否允许它进入,若允许,则直接进入;否则,循环等待,使用一个循环语句不断执行测试指令,从而浪费了大量的CPU资源。