1.操作系统为了解决进程间合作和资源共享所带来的同步与互斥问题,通常采用的一种方法是使用 (1) 。若在系统中有若干个互斥资源R,6个并发进程,每个进程都需要5个资源R,那么使系统不发生死锁的资源R的最少数目为 (2)
操作系统的重要功能是解决进程间的同步与互斥问题。解决的办法主要有加锁法、信号量机制、管程机制等。信号量是由一个整型变量和一个等待队列构成的,对这个整型变量除了做初始化外,只能实施P-V操作,即P操作和V操作。P-V操作是原子操作,不可分割使用,必须成对出现,属于低级的进程通信原语。故(1)为信号量。
进程互斥就是为了保护共享资源(如公共变量等)不被多个进程同时访问,就要阻止这些进程同时执行访问这些资源的代码段,这些代码段称为临界区,这些资源称为临界资源;进程互斥不允许两个以上共享临界资源的并发进程同时进入临界区。
当若干个进程互相竞争对方已占有的资源,无限期地等待,不能向前推进时,会造成"死锁"。死锁是系统的一种出错状态,应该尽量预防和避免。产生死锁的主要原因是提供共享的系统资源不足、资源分配策略和进程的推进顺序不当。
产生死锁的必要条件是:互斥条件、保持和等待条件、不剥夺条件、环路等待条件。只要使上述4个必要条件中的某一个不满足,就可以解决死锁。本题中R为临界资源,要想6个并发进程互斥地访问R而不会死锁,必须是R的数量足以满足至少一个进程可以运行,考虑极端情况,6个并发进程都具有了4个R,只要再多一个R就可以调度其中一个执行,这样就打破了死锁的互斥条件。所以(2)为25个。
2、下面的程序将要输出什么?
#define SQR(x) (x*x) main() { int a,b=3; a=SQR(b+2); printf("%d\n",a); }
执行后输出11。宏定义展开时容易造成二义性问题。a=b+2*b+2 而并不是想象的那样;想要得到25应该改为
#define SQR (x) ((x)*(x))
2、用预处理指令声明一个常数,用表明1年中有多少秒(不考虑闰年)
注意三点:
1、不能以分号结束,括号的使用等
2、要知道预处理器会计算常数表达式的值
3、这个表达式会使一个16位机的整数溢出。因此要用长整形L,最好用UL(无符号长整形)
#define YEAR (60*60*24*365)UL
3、const的主要用法:
(1)定义const常量
(2)修饰函数参数
(3)修饰函数返回值
被const修饰的东西都受到强制的保护,可以防止意外的变动。
4、const 与 #define 相比有什么不同?
(1)const常量有数据类型,而宏常量没有。编译器可以对前者进程类型安全检查,而后者只能进行字符替换,没有类型安全检查,并且在替换的过程中可能会产生错误。
(2)有些调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
本篇博客出自 阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/6882586