1.IP数据报头采用()字节序,在此字节序下从低地址到高地址0x1234的表示形式为() C
A) big_endian,0x12 0x34 0 0
B) little_endian,0x34 0x12 0 0
C) big_endian,0 0 0x12 0x34
D) little_endian, 0 0 0x34 0x12
解答:C
其实 big endian 是指低地址存放最高有效字节( MSB ),而 little endian 则是低地址存放最低有效字节( LSB )。
比如,数字 0x12345678 在两种不同字节序 CPU 中的存储顺序如下所示:
//数字:0x12345678
Big Endian:
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1
2
3
4
5
6
7
Little Endian:
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1
2
3
4
5
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。由于IP数据报头采用“big endian”,所以0x1234 的big endian形式为:0 0 0x12 0x34
**2.两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
void foo(){
a=a+1;
printf("%d ",a);
}
正确答案: A B C D
3 2
2 3
3 3
2 2
解析:
A:3, 2
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
B:2 3
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
C:3 3
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
D:2 2
类似C,a的初始值为0即可
这里关键有两点:
(1)两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
3.对一个正整数作如下操作:如果是偶数则除以2,如果是奇数则加1,如此进行直到1时操作停止,求经过9次操作变为1的数有多少个? B
A.18 B.34 C.64 D.78
解:
笔试题解题:由于本题是属于递归调用,通过计算机调用递归很容易得出结论 34;
其次,在不能通过程序运行的时候可以通过反向逆推,找规律,由奇偶性可以看出逆推的时候产生的结果数是不同的,逆推三四个就能找到规律了。
***4.某计算机系统中有8台打印机,由K个进程竞争使用,每个进程最多需要3台打印机。该系统可能会发生死锁的最小值是(C )。
A.2
B.3
C.4
D.5
每个进程3台,不会产生死锁;对于三个进程,可以有两个进程分别获得3台,使其执行完释放后让第三个进程获得3台,所以也不会产生死锁;对于四个进程,假若每个进程各获得2台而同时需要另外一台,产生了死锁,所以产生死锁的最小值是4。
类似题型(1):
假设现在有P个进程,每个进程最多需要m个资源,并且有r个资源可用。什么样的条件可以保证死锁不会发生
解:如果一个进程有m个资源它就能够结束,不会使自己陷入死锁中。因此最差情况是每个进程有m-1个资源并且需要另外一个资源。如果留下有一个资源可用,
那么其中某个进程就能够结束并释放它的所有资源.使其它进程也能够结束。所以避免死锁的条件是: r≥p(m-1)+1。
由此条件解上题:r=8,m=3,带入公式得:2p≤7。即当P小于等于3时才可保证死锁不会发生,所以可能会产生死锁的最小值是4。
类似题型(2):某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是多少
解:带入上述条件公式:r≥3*(4-1)+1=10。所以答案为10个。
简答题:
1.三次握手
2.程序什么时候使用线程,什么时候使用单线程;
3.操作系统总进程调度策略有哪几种?
解:1.先来先服务调度算法
2.短作业优先调度算法
3.优先级调度算法
4.高响应比优先调度算法
5.轮转调度算法
6.多级反馈队列
4. 嵌入式系统中断服务子程序(ISR)
中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{ double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
1). ISR 不能返回一个值。
2). ISR 不能传递参数。
3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4). 与第三点一脉相承,printf()经常有重入和性能上的问题。
2.程序什么时候应该使用线程,什么时候单线程效率高。
答:1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提高CPU利用率
4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独
立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。
5、Windows是内核级线程么。
答:见下一题
6.Linux有内核级线程么。
答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两
种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序
中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度
和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现
,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一
种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部
需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支
,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线
程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不
到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占
用了更多的系统开支。
Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程
本文解析了计算机系统及编程面试中常见的技术问题,包括IP数据报头字节序、线程并发执行、递归算法求解及操作系统中的死锁问题等。还探讨了线程使用的场景和操作系统进程调度策略。

2239

被折叠的 条评论
为什么被折叠?



