笔试真题解析 ALBB-2015 校招研发在线笔试题

1)不算main这个进程自身,到底创建了多少个进程啊?
int main(int argc, char* argv[])
{
   fork();
   fork() && fork() || fork();
   fork();
}
【解析】只看这句, fork() && fork() || fork(); 结果有5个进程。第一句 ,fork 后进程加倍,所以执行 fork() && fork() || fork() 后有10个进程。最后一句进程加倍,就是20个  减去主进程,结果共有 19个。


3)下面的函数哪个是系统调用而不是库函数()?
printf
scanf
fgetc
read
print_s
scan_s
【解析】
read()不是库函数,是系统调用,作用是读文件(Linux中的一切设备都看做文件)
函数原型:
Ssize_t read(int filedes, void *buf, size_t nbytes);
                    Returns:number of bytes read, 0 if end of file, -1 on error
如果read系统调用成功,则将返回读取到的字节数;如果遇到了文件尾EOF,则返回0。
正确答案: D

5)某二维平面上有12个位置不同的点,通过连接其中任意两点,可以画出59条不同的直线。那么,在59条直线中,经过3个或3个以上的点的直线有()条。
【解析】】
12个点,任意三个点或是以上不在同一条直线上,可以组成的直线为12*11/2=66
先在只有59条直线,说明7条直线重复 
而三个点在一条线上,减少2条线的组合
四个点在一条线上,减少5条线的组合
五个点在一条线上,减少9条线的组合
所以可能的情况 2+5=7
即 三个点在一条线上,4个点在一条线上,其余的点均不在一条线上
1----1-----1   
1-----1-----1-----1
所以经过三个或四个点的线有2条

7)下列不属于hash碰撞解决方法的是()。
线性探测
单旋转法
二次探测
拉链法
双重散列
多重散列
【解析】
旋转法是将数据的键值中进行旋转。
如5062101旋转之后得到1506210,
这是产生随机散列值(hash)的一种方法,不是解决hash碰撞的方法。
正确答案: B


8)针对外部存储器(如磁盘)上存放的程序和数据,说法正确的是()。
可由CPU直接进行读取写入操作
须在CPU访问之前移入内存
必须由文件系统管理的
必须由进程调度程序管理
程序和数据必须为只读
程序和数据只能被一个进程独占
【解析】
文件系统的数据都是需要被加载到内存中,才可以被CPU直接访问的。CPU的寻址空间指的是内存的寻址空间,外层由文件系统管理,CPU无法直接访问,外存(如磁盘)上存放的程序和数据必须在CPU访问之前移入内存
B、C存在争议,访问的时候如果没在内存,可以触发缺页中断,调入内存,虚拟内存机制。
正确答案: B


10)村长带着4对父子参加爸爸去哪儿第三季第二站某村庄的拍摄。村里为了保护小孩不被拐走有个前年的规矩,那就是吃饭时候小孩左右只能是其他小孩或自己的父母,那么4对父子在圆桌上共有多少种坐法。(旋转一下,每个人面对方向变更后算是一种新的坐法)
【解析】
(1)根据小孩左右只能是其他小孩或自己的父母进行划分,对小孩划分不太容易,对父母划分,集合是1 - 4个连续。(最多几个连续)
(2)当3个连续时,出现最后一个父母两边是孩子,会偷走一个。当父母都是间隔的,同样不成立。
(3)当4个相邻,两个孩子固定,还有两个位置,孩子随意 A(4,4) * A(2,2),该旋转有8种情况,没有重复,当2个相邻时,只有A(4,4),父母的摆放,当旋转以后,会有一半是对称的,一半重复(也就是当 两个人 处在两个位置的时候,会被认为是两种情况,因而被重复计算两次),除以2。
正确答案: A(4,4)* A(2,2) * 8 + A(4,4) * 8 / 2 = 480

 

12)并发进程执行的相对速度是()。
由进程的程序结构决定
由进程本身来控制
进程被创建时决定
与进程调度策略有关
与进程销毁时间有关
由内存分配策略决定
【解析】
 一个进程被中断后, 哪个进程可以运行、被中断的进程什么时候能再去占用 处理器,这是与进程调度策略有关的. 所以,进程执行的相对速度不能由进程自己来控制, 还与进程调度 策咯有关。
正确答案: D

13)有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值?
C=(int32)(A+B),D=(int32)(A-B)
C=(int32)(A+B),D=(int32)((A-B)>>1)
C=(int32)(A+B),D=B
C=(int32)(A+B),D=(int32)(A+2*B)
C=(int32)(A*B),D=(int32)(A/B)
都不可以,可能溢出
【解析】
第一项:A=(C+D)/2,B=C-A 
第二项:D右移一位,不知道移出的是1还是0,不能恢复 
第三项:A=C-D,B=D 
第四项:B=D-C,A=C-B 
第五项:虽然可以C*D再开方,但是不能确定A和B的正负 
但是对于无符号数,A不行,这里简单起见,以3bit数为例。例如A=111,B=110。C=A+B=001(溢出),D=A-B=001,所以A不能正确恢复了。C仍然可以,A=C-D=001-110=111。D答案,同样因为溢出不能恢复。 
正确答案: C


16)下列关于线程调度的叙述中,错误的是()。
调用线程的sleep()方法,可以使比当前线程优先级低的线程获得运行机会
调用线程的yeild()方法,只会使与当前线程相同优先级的线程获得运行机会
当有比当前线程的优先级高的线程出现时,高优先级线程将抢占CPU并运行
一个线程由于某些原因进入阻塞状态,会放弃CPU
具有相同优先级的多个线程的调度一定是分时的
分时调度模型是让所有线程轮流获得CPU使用权
【解析】

yield()暂时交出 cpu 控制权,从 running 状态转为 runnalbe 状态,但是仍有 可能被调度,sleep()线程指定休眠一段时间,wait()在其他线程调用此对 象的 notify()或 notifyAll()方法时才能继续执行。

线程中 sleep()方法和 yeild()方法的主要区别: 

1.sleep()方法会给其他线程运行的机会,而不管其他线程的优先级,因此会给较 低优先级的线程运行的机会;yeild()方法只会给优先 级相同的或者比自己高的线程运行的机会. 
2.sleep()方法声明抛出 InterruptionException 异常,而 yeild()方法没有声明 抛出任何异常. 
3.sleep()方法比 yeild()方法具有更高的可移植性. 
4.sleep()方法使线程进入阻塞状态,而 yeild()方法使线程进入就绪状态. 当前运行的线程可以调用另一个线程的 join()方法,当前运行的线程将转到阻 塞状态,直到另一个线程运行结束,它才会恢复运行. join()有两种形式:public void join()和 public void join(long timeout)可 以设置阻塞的时间。

关于选项C,当有比当前线程的优先级高的线程出现时,高优先级线程将抢占CPU并运行。这个在没有基于优先级抢占的系统里面是错误的,因为不存在抢占。在有基于优先级抢占的系统里面是对的。但是现在的系统基本都是有基于优先级抢占的,不抢占的那只是出现在课本里。

正确答案: B E

【17】
http://www.nowcoder.com/test/question/done?tid=740329&qid=15744#summary
【18】
http://www.nowcoder.com/questionTerminal/7cd288c3259e455cb10b5d8fdbae5a39

你可能感兴趣的:(阿里巴巴,研发,笔试,校招,机试)