50.进程间通信的途径:共享存储系统 消息传递系统 管道:以文件系统为基础 51.进程死锁的原因:资源竞争及进程推进顺序非法
52.死锁的四个必要条件:互斥、请求保持、不可剥夺、环路
53.死锁的处理:鸵鸟策略、预防策略、避免策略、检测与解除死锁
54.操作系统中进程调度策略有哪几种: ——FCFS(先来先服务),优先级,时间片轮转,多级反馈
55.ISO的七层参考模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点? 应用层 表示层 会话层 运输层 网络层 物理链路层 物理层
tcp /udp属于运输层
TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好
udp: 不提供稳定的服务,包头小,开销小
56.如何引用一个已经定义过的全局变量? 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。(不要问我什么是编译期间,什么是连接期间,请自己查资料)
57.测试方法: 人工测试:个人复查,抽查和会审 机器测试:白盒测试,黑盒测试 58.下面代码里,假设在32位系统下,各sizeof计算的结果分别是多少?
int *p=NULL;
sizeof(p)的值是__________(1)
sizeof(*p)的值是__________(2)
int a[100);
sizeof(a)的值是_________(3)
sizeof(a[100])的值是__________(4)
sizeof(&a)的值是_________(5)
sizeof(&a[0])的值是________(6)
int b[100];
void fun(int b[100])
{
sizeof(b);
}
sizeof(b)的值是________(7)
答:除(3)答案为400以外,别的答案都为4。
59.下面两段代码有什么区别?什么时候需要使用代码(2)?
代码(1): inti=10;
it j=i;
int k=i; 代码(2): volatile int i=10;
int j=i;
int k=i; 答:代码(1):这时候编译器对代码进行优化,因为在代码(1)的两条语句中,i没有被用作左值(没有被赋值)。这时候编译器认为i的值没有发生改变,所以在第1条语句时从内存中取出i的值赋给j之后,这个值并没有被丢掉,而是在第2条语句时继续用这个值给k赋值。编译器不会生成出汇编代码重新从内存里取i的值(不会编译生成装载内存的汇编指令,比如ARM的LDM指令),这样提高了效率。但要注意:两条语句之间i没有被用作左值(没有被赋值)才行。 代码(2):volatile关键字告诉编译器i是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成的汇编代码会重新从i的地址处读取数据放在k中。 代码(2)的使用时机:如果i是一个寄存器变量、表示一个端口数据或者是多个线程的共享数据,那么就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
60.0x01<<2+3的值是多少?为什么? ——32。因为加号的优先级比移位运算符的优先级高。
61、定义一个函数宏,求x的平方。 #define SQR(x) ((x)*(x)) 该语句有缺陷,传入++a这样的内容则函数宏失效。
62.如果在一个程序中调用了printf函数却不包含头文件,例如int main(void) {printf("\n"); },编译时会报警告:warning: incompatible implicit declaration of built-in function‘printf’。请分析错误原因。
在C语言标准中有些库函数被定义为内建函数(bulit-int-function),不需要包含相应头文件,比如printf等。个人理解为,编译器编译时,没有看到函数原型,就根据调用形式作了隐式申明。但是结果隐式声明的函数原型和库文件里的不对应,所以会报imcompatible警告。
63.定义变量时可以把相同类型的变量列在一起,而定义参数却不可以? 因为在函数原型声明时,只需要参数类型,不需要参数名称。如果一个参数类型后有多个参数,编译器只会认为只有一个参数。而不是多个参数。
64. 写两个表达式,分别取整型变量x的个位和十位:x=x%10 x=x%100/10
65.x=x+1,x+=1,x++哪个效率最高? ——x=x+1最低,因为它的执行过程如下1)读取右x的地址(2)x+1 (3)读取左x的地址(4)将右值传给左边的x ——x+=1其次,其执行过程如下:(1)读取右x的地址 (2)x+1 (3)将得到的值传给x(因为x的地址已经读出) ——x++效率最高,其执行过程如下:(1)读取右x的地址 (2)x自增1
66.有两个变量a,b不用判断语句找出两个数中间比较大的? ——方案一: intmax = ((a+b)+ abs(a-b))/ 2 ——方案二: int c= a - b; char*str[2] = {“a大”,“b大”}; c =unsigned(c) >> (sizeof(int)*8 - 1);
67.如何判断一段程序是由c编译程序还是c++编译程序编译的? ——c编译时定义了_STDC_,c++编译时定义了_cplusplus
68.#includeSQR(x) (x*x)—— SQR(b+2)=b+2*b+2
|