阿里巴巴2016研发工程师笔试题及答案(三)

1.下面线程间的通讯机制中,关键路径上不会产生系统调用从而减少用户态到内核态的上下文切换的是____。
A.pthread_spin_lock
B.pthread_mutex
C.信号量
D.pthread_rwlock
E.管道
D.消息队列

解析:

1,  spinlock 介绍

spinlock又称自旋锁,线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁。spinlock在多处理器多线程环境的场景中有很广泛的使用,一般要求使用spinlock的临界区尽量简短,这样获取的锁可以尽快释放,以满足其他忙等的线程。Spinlock和mutex不同,spinlock不会导致线程的状态切换(用户态->内核态),但是spinlock使用不当(如临界区执行时间过长)会导致cpu busy飙高。

2 ,使用准则

Spinlock使用准则:临界区尽量简短,控制在100行代码以内,不要有显式或者隐式的系统调用,调用的函数也尽量简短。例如,不要在临界区中调用read,write,open等会产生系统调用的函数,也不要去sleep;strcpy,memcpy等函数慎用,依赖于数据的大小。


2.一人以 d 元在淘宝买入 n 套《三体》, d 为正整数,其中两套他以成本一半送给朋友,余下的每套高于原价 8 元卖出,加上送给朋友的两套,如果全部利润是 72 元,那么 n 最小可能是_12___。

解析:

d/n+(n-2)(d/n+8)=72+d
得:d/n=8(n-11)
所以n最小12.


3.进程 P1 和 P2,资源 A 和 B,进程对资源的操作定义如下:读取资源 A: rA 读取资源 B:rB 写入资源 A: wA 写入资源 B: wB 同时规定,进程读取某一资源前,必须加上共享锁,写入某一资源前必须加上排他锁;资源在被进程加共享锁时,可以被其他进程继续加共享锁,但不能加排他锁;资源在被进程加排他锁时,其他进程无法加锁。进程完成全部操作后释放锁。进程 P1 和进程 P2 并发执行,如下哪种运行序列可能会出现死锁_____。
A.P1(rA->rB), P2(rA->wB)
B.P1(rA->rB), P2(wA->rB)
C.P1(wB->rA), P2(rA->rB)
D.P1(wB->rA), P2(wA->rB)
E.P1(wA->wB), P2(wA->wB)
F.P1(wA->rB), P2(wA->wB)

解析:


4.假设基准值为数组首元素的快速排序,要使得数组满足非降序排列,下列数据分布导致快排算法效率最低的是____。

A.2-6-3-7-5-1-4
B.6-2-3-5-4-1-7
C.7-5-3-2-4-1-6
D.1-5-7-2-4-6-3
E.1-2-3-4-5-6-7
F.4-1-3-7-5-6-2

解析:

初始序列有序时,快速排序效率最低


5.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____。

A.2-6-3-5-4-1-7
B.6-2-3-5-4-1-7
C.6-5-3-2-4-1-7
D.1-5-3-2-4-6-7
E.5-4-3-2-1-6-7
F.5-1-3-2-4-6-7


6.将森林转换为对应的二叉树,若在二叉树结点中,结点 m 是结点 n 的双亲结点的双亲结点, 则在原来的森林中, m 和 n 可能具有的关系是____。
1.父子关系
2.m 的双亲结点与 n 的双亲结点是兄弟关系
3.兄弟关系


A.只有 3
B.1 和 3
C.1 和 2
D.1、 2 和 3
E.只有 1
F.只有 2
解析:


7.两人在一个n个点的无向完全图上进行游戏,每次可以选择当前图中两个端点度数奇偶性相同的边删除,谁不能操作谁输,则在n=1,2,3,......,9,10中,有____个图先手有必胜策略。

A.2

B.3

C.4

D.5

E.6

F.7
 

解析:

N个点的无向完全图边数为:N*(N-1)/2;先手获胜必须总数为奇数;

N=1,2,3,......,9,10代入公式,为奇数的只有N=2,3,6,7,10这5个。


8.关于线程和进程,不正确的描述是____。
A.进程的隔离性要好于线程
B.线程在资源消耗上通常要比进程轻量
C.不同进程间不会共享逻辑地址空间
D.同一个进程的线程之间共享内存,包括堆和栈
E.进程间有途径共享大量内存中的数据
F.线程间通讯可以通过直接访问全局变量,或者使用进程间通讯的机制(IPC)

解析:

多个线程共享进程提供的内存(拥有自己的私有栈空间只是作为运行需要的极少内存)


9.有一个程序中有 A,B,C 三个线程同时对一个文件进行读写操作,其中的 A,B 是写进程只负责往里面写数据, C 是读线程,同时把读取的数据从文件中删除, A 线程单独写满文件需要10 个小时, B 单独写程序需要 6 小时, C 线程需要 15 小时才能读取完整个文件,不考虑三个线程之间的相互影响的情况下现在____小时才能写满文件

5

6
5.5
4.5
4.8
5.3

解析:

不考虑三个线程之间的相互影响,突然回到了小学数学题:“两个水龙头注水,一个放水,问何时注满水池”的感觉。这样问题就简单了:

总任务是单位1,A的写工作效率是1/10,B的写工作效率是1/6,C的读工作效率是1/15,那么总工作效率是1/10 + 1/6 - 1/15 结果是1/5。于是,写满的总时间是:用单位1除以总工作效率五分之一,就是5小时。


 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值