2019 ByteDance Summer Camp
19年夏令营,头条请了天奇大神过去做talk,我是冲着天奇大佬去的,他是做DL编译器的,跟我个人的研究方向很类似,所以很期望能跟他当面交流一下。
夏令营有两次笔试机会,取成绩最高的一次作为最终的成绩。由于消息看到得晚,在下开始申请的时候,第一次笔试已经结束了。本人只参加了第二次笔试,笔试题目构成如下:单选题3题、不定向选择题1题、填空题2题、编程题3题、设计类1题,共5类题目,时间两个半小时(晚上7点-9点半)。
笔试是在牛客网完成的,笔试有一个特殊的要求:某一类题型全部做完了才能进入下一个题型,而且该类题型提交以后就不能修改了。比如说,选择题有3题,你把3题全部做完了,点提交,才能去做其他类型的题目,一旦提交了就不能回过头修改。所以合理安排时间非常重要,不能卡在某一类题目上太多时间,我是把非编程题类题目全部做完以后才去做的编程题。中途有事,第二道编程题提交完,出去了一下,回来后第三题还没看完就被强制提交了:D
单选题一:位示图管理。操作系统磁盘管理的问题:给定柱面、磁道和扇区数据,利用位示图对存储管理;
单选题二:二进制含0的数量。操作系统内存页映射的问题:限定问题场景,1GB内存,划分为131072个内存块。给定一段简单的C++代码,开了一个1024大小的int数组,一段循环对该数组的每个元素按照某个规律赋值,同时给定操作系统逻辑页号和内存块号的映射表。假设数组的逻辑地址是64C0,从物理地址A6BC取4个字节的数据。问该数据二进制0的个数。
该题目不是很难,但是手工计算量挺大的,131072=2^17
(我除了好久才除出来:D),1GB=2^30B
,所以块大小是2^30B/2^17=2^13B=8KB
,所以内存逻辑页的layout关系大概是:
第0页:0 ... 1FFF
第1页:2000 ... 3FFF
第2页:4000 ... 5FFF
第3页:6000 ... 7FFF
第4页:8000 ... 9FFF
第5页:A000 ... BFFF
第6页:C000 ... DFFF
第7页:E000 ... FFFF
...
数组的逻辑起始地址是64C0,数组大小是1024个int,即4KB,半个内存页。逻辑页号从0开始,可以大概算出来,64C0所在的逻辑页号为3,页内偏移为4C0=1216
,
根据逻辑页和物理块的映射表,可以查出来,第3页对应的物理块号是第5块。而物理地址A6BC恰好也在第5块,