背景:10月底我接了个字节打来的电话,想约面试(我之前面过字节,二面挂),当时想的没什么事,闲来无聊面一次也无妨,然后就答应了下来,约在了11.6面试。岗位是:生活服务-客户端开发面试过程:1. 自我介绍环节:我说到“经常打竞赛,CF/Leetcode,特别是Leetcode竞赛分数全国700,周赛基本稳定前200+...”,然后面试官打断了我,问了一些有关竞赛的事宜(这个倒也没什么,打断说话可以理解,不过没想到这仅仅是个开头)面试官喝了一口奶茶,继续吧...2. 项目介绍环节:我首先介绍了研究生的机器学习课题,然后面试官老套路问题“有什么困难”,我回答了一下;然后又问“怎么解决的”(其实单说这个问题没什么,只是我在回答前面一个问题的时候已经说过了,感觉他没好好在听),没办法我又解释了一下;然后又问“解决的方式”,我是真的没太明白什么意思(我寻思一个问题怎么反复问),后来我反问不太理解,他解释了一下说,“看论文?逛论坛?等等”,然后我吧啦吧啦下一个项目,问了其中的线程池模块,让我先介绍介绍;那我按部就班的开始扯,突然被打断,问了一些他感兴趣的东西,比如“为什么使用deque不用queue?”;我说“首先queue这个容器适配器底层默认的容器就是deque,所以从逻辑上讲使用deque没什么问题;其他可能有一些api方面的考虑(这个我确实想不起来了)”,还有“为什么使用deque不用vector?”,我也扯了扯;后面就一直在问答环节(期间我也没再往下介绍);然后因为我没介绍完,所以有些信息他肯定是不知道的,但是他又想和我争论,我只能再往下介绍了他一直在争论地方的具体实现,他明白后说“这种细节你应该直接说清楚知道么?”(此时我内心真的...,不是你一直打断我的么,不过我也没说什么);然后不知道是不是不会管理自己的行为和表情,问完项目之后说,你这效率应该挺低的,似笑非笑的呵了一声...接着面试官问了我有没有实习,我说没有,但是想解释一下本科和硕士两个窗口期为什么没有去实习,然后本科的情况还没说完,他打断说“那你直接说实习没过不就行了么”(虽然说的对,但是到现在我已经忍耐很久了,很不爽)3. 基础知识环节:此时我真的不想再面试了...也开始消极了问进程和线程的区别(既然你不尊重我,我为什么要好好回答你呢)我说“这个问题面试以来问了无数次了”,然后他打断我说“你不要觉得不屑,吧啦吧啦...”,我说“既然你这边不想面试,对我有看法,我也不想回答了”,他说“我倒是感觉你不尊重我,我一直在认真问...”,(我真想说,你什么态度你知道),不过还是给了个台阶“那我们后面就好好问答,不用阴阳怪气什么的”,他也同意进程和线程的区别,不想扯了线程共享进程的资源,访问为什么存在线程安全问题,我举了个简单的例子,以读取数据和寄存器角度,谈了谈非原子性他又问(因为这个问题,我到现在也没有理解,所以可能复述得有问题),“线程自己共享的数据,读取会不会也有线程安全的问题?请你以C++的角度,谈一谈”,我尼玛,听到这个问题我都懵逼了?这是在问什么?thread_local?局部变量?私有栈?还从C++的角度,难道内存模型?原子顺序?抱歉,我实在不理解是什么意思;包括面试结束的反问环节,我也再次问了这个问题,还是没有明白(如果有了解的大佬,还请指点一二)路由器的工作原理,(之前学过网络信息安全,但是忘了)扯了扯自己的想法,他说差不多,就是这个意思让我说几个了解的协议,我说tcp了解(网络编程写得多),http也了解(平时抓包比较多)然后让我说说http,我就从抓包角度开始说,先说了http的版本,1.1/2.0,他又打断我,让我说说2.0和1.1的区别,我吧啦吧啦了几句,什么tls、头部压缩、帧、并发传输等等;然后也没让我继续介绍http了。。。数据库怎么实现线程的读写安全?我首先想到MySQL的锁机制,什么表锁行锁,但是我又单说行锁,并没有完全说到怎么解决读写安全的,因为只是在遍历B+树的时候,是否需要加锁也是一个问题;因此我说了说自己的想法,并且结合最近在实现一个小的数据库内核,说了一下怎么实现读写安全的;首先在find、inset或者remove这些api统一加一把大锁也是可以办到的,但是效率感人;然后我的做法是,给B+树的每一个页面加锁,例如find的时候就加读锁,其他操作加写锁,并且如果下一个孩子页面是安全的,也就是不会发生分裂和合并,那么可以对祖节点解锁,从而达到多线程的高性能读写;这种加锁方式也可以形象的叫做螃蟹锁。(担心他没有听清楚,我又说了句,不知道我说明白了么)然后他又问,你的缓存机制怎么做的?我说首先就是有一个缓存池(类似内存池一样),用来存储从磁盘读取的页面,缓存池内部先定义一批缓存页;然后需要有一个页面淘汰机制,这里用的是LRU-K算法...,又被打断,“LRU-K算法是什么?没听过呀,只知道LRU”;我说LRU-K可以看作LRU算法的升级,LRU算法他不就是淘汰最久未使用的么,但是如果现在有一个热点数据在缓存池中,但是突然读取了大批冷门数据,这是数据后续不会再用到,那么导致热点数据被淘汰,显然是不好的,所以引入了LRU-K算法,会根据数据的访问频率来固定数据,防止被换出;我说,不知道我说明白了么;他说,没有,没有听明白...。(其实缓存机制这里还有很多东西需要说,比如可动态扩展哈希等等,不过他这样我页没那心思了)问 C++用过hash_map没?我说这是肯定用过。那你介绍一下吧,怎么解决哈希冲突的。我说,C++标准库的哈希表叫做unordered_map,它解决哈希碰撞的方法是,会在哈希桶内部用链表链接,链表中存储的就是哈希表的元素;因此在查找的时候,会通过哈希计算定位到某个桶,然后再去遍历;如果发现桶的数量不够,负载较高,那么就会重哈希他说,感觉你擅长的还是算法和数据结构,那么写个题吧(这什么b话,草...)题目是,两个无序数组合并为一个有序数组,我直接分别排序然后合并数组,接着让我一行一行讲解代码。。。他说,感觉还是算法一整个下来比较顺利。。。4. 反问环节:基本没问什么,还是反问了那个前面说的线程共享数据的安全性问题,还是没听懂。。。
点赞 15
评论 4
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务