问答题
[问题1](6分)
执行[程序1]后,没有能够实现两个变量值的交换,为什么?请修改上述函数,实现两个变量值的交换,要求函数无返回值,形式为:void swap(…)。请将答案填写在答题纸中对应的栏目。
【正确答案】 两个变量不能交换值的原因:
因为函数是传值的,函数形参值的交换,并不影响到实参的值的变化。
正确的函数编写如下(下面只是范例,变量名称不作要求):

【答案解析】试题五分析
本题考查嵌入式C/C++语言编程基础知识。
[问题1]
函数swap采用值传递,虽然将形参n1和n2交换了,但是并不影响到实参,所以执行[程序1]后,实参变量并没有完成数据交换。将值传递改成指针传递就可以了。
对应的swap函数应修改如下:

问答题
[问题2](3分)
请问[程序2]运行结果是什么?
【正确答案】 第一次输出:fun(5)=5
第二次输出:fun(7)=13
第三次输出:fun(9)=34
【答案解析】 当n=5时,初始:f0=0, f1=1;
for循环计算如下:
i=2: f=0+1=1; f0=1; f1=1;
i=3: f=1+1=2; f0=1; f1=2;
i=4: f=1+2=3; f0=2; f1=3;
i=5: f=2+3=5; f0=3; f1=5;
所以,调用fun(5),得到返回值5;
同理,可计算出fun(7)=13; fun(9)=34。
问答题
[问题3](6分)
请简述什么是临界资源?什么是临界区?
请完成[程序3]和[程序4]的形式化定义,将应填入____(n)____处的内容写在答题纸的对应栏中。
【正确答案】 临界资源:一次只能使一个进程访问的资源称为临界资源。
临界区:进程中访问临界资源的那段代码称为临界区。
(1) S--
(2) S<0
(3) S++
(4) S<=0
【答案解析】 在多道程序系统中,进程是并发执行的,这些进程之间存在着不同的相互制约关系。进程之间的这种制约关系来源于并发进程的合作以及对资源的共享。
进程在运行过程中,一般会与其它进程共享资源,而有些资源的使用具有排他性。系统中的多个进程可以共享系统的各种资源,然而其中许多资源一次只能为一个进程所使用,通常把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机、绘图机等。除物理设备外,还有许多变量、数据等都可由若干进程所共享,它们也属于临界资源。
进程中访问临界资源的那段代码称为临界区,也称为临界段。
访问临界资源应遵循如下原则:
①空闲让进(或有空即进):当没有进程处于临界区时,可以允许一个请求进入临界区的进程立即进入自己的临界区;
②忙则等待(或无空则等):当已有进程进入其临界区时,其它试图进入临界区的进程必须等待;
③有限等待:对要求访问临界资源的进程,应保证能在有限时间内进入自己的临界区;
④让权等待:当进程不能进入自己的临界区时,应释放处理机。
信号量是荷兰著名的计算机科学家Dijkstra于1965年提出的一个同步机制,其基本思想是在多个相互合作的进程之间使用简单的信号来同步。
在操作系统中,信号量是表示资源的实体,除信号量的初值外,信号量的值仅能由P操作(又称Wait操作)和V操作(又称Signal操作)改变。
设S为一个信号量,P(S)执行时主要完成:先执行S=S-1;若S≥0则进程继续运行;若S<0则阻塞改进程,并将它插入该信号量的等待队列中。
V(S)执行时主要完成:先执行S=S+1;若S>0则进程继续执行;若S≤0则从该信号量等待队列中移出第一个进程,使其变为就绪状态并插入就绪队列,然后再返回原进程继续执行。
P、V操作的形式化描述如下:
