现在的位置: 首页 > 综合 > 正文

进程互斥、宏定义、const 相关面试题

2013年12月09日 ⁄ 综合 ⁄ 共 1412字 ⁄ 字号 评论关闭

   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

 

抱歉!评论已关闭.