第一题 b10 c12 d120
第二题
void func(char src[100])
{
char str[]="Hello";
char *p=str;
int n=10;
void *buf=malloc(100);
printf("%d,%d,%d,%d,%d",sizeof(src),sizeof(str),sizeof(p),sizeof(n),sizeof(buf));
}
4 6 4 4 4
第三题
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
第四题 见https://blog.csdn.net/rayufo/article/details/85533559
第五题 见https://blog.csdn.net/xiven/article/details/4345199
正确答案:
(1)P(S1) (2)V(S2) (3)P(S2) (4)V(S1)
解析:本题考查的是并发系统的同步与互斥控制。
在并发系统中,同时存在的多个进程在执行速度上是相对独立的,它们以各自的运行速度向前推进。但是,由于多个并发进程或者共享系统资源,或者合作完成某项任务,所以它们之间常常存在着相互制约或彼此依赖的关系,进程之间的这种制约和依赖关系可以归结为两种基本形式:同步和互斥。
一般来说,一个进程相对于另一个进程的运行速度是不确定的,也就是说进程是在异步环境下运行的,每个进程都有各自独立的、不可预知的速度向前推进。但是相互合作的进程需要在某些确定点上协调它们的工作,当一个进程到达了这些点后,除非另一进程已经完成了某些操作,否则就不得不停下来等待这些操作结束。这就是进程间的同步。
在多道程序系统中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用,称为临界资源(critical resource,CR),如打印机、公共变量、内存工作区、表格等。临界区(critical section,CS)是进程中对临界资源实施操作的那段程序。
在多道程序系统中,一般都使用P、V操作原语通过信号量实现进程的同步和互斥。信号量是一种特殊的变量,它具有以下特性:
▲ 信号量是一个整型变量。
▲ 每一个信号量表示一种系统资源的状况,其值表示资源当前可用的数量。
▲ 每一个信号量都对应一个空或非空的等待队列,该队列就是信号量所表示的资源的等待队列。
▲ 对信号量只能实施P、V操作,只有P、V操作才能改变其值。
P操作的功能是:当进程执行P操作时,首先将信号量S减一,其结果为:若 S≥0,则该进程继续运行;若S<0,则阻塞该进程,并把它插入道信号量S的等待队列中。
V操作的功能是:当进程执行V操作时,首先将信号量S加1,其结果是:若S>0,则该进程继续执行;如果S≤o,则释放S信号量等待队列中队首的等待进程,解除其阻塞状态,而调用V操作的当前进程继续执行。
P、V操作是一对操作,若有对信号量的P操作,必定有对该信号量的V操作,这样才能保证资源被合理地分配和释放。
问题1:缓冲区BUFFER是临界资源,信号量S1表示缓冲区中空闲单元的数目,初值为N,信号量S2表示缓冲区中消息的数目,初值为0。
显然,发送进程海产生一条消息,将消耗一个空闲的缓冲区单元,所以将消息送入缓冲区时应先执行一个P(S1),写入消息后执行一个V(S2)。当接收进程执行时,若缓冲区中有消息,则可读取,然后将释放一个空闲单元,所以接收进程进入其临界区后先执行一个P(S2),读取消息后执行一个V(S1)。