深情的小鱼干在努力存钱 level
获赞
2
粉丝
2
关注
2
看过 TA
32
门头沟学院
2023
深度学习
IP属地:陕西
暂未填写个人简介
私信
关注
昨天 17:34
已编辑
门头沟学院 深度学习
面试官很和善了,问的问题也都是简历上自己写的,还是自己准备的不够充分,这场面试让我深刻认识到自己的拉跨和面试真得把简历上得东西特别熟悉(连简历上自己写的都没回答好,纯菜jb了 🥲)面试基本问的是项目,一点实习没问(估计对实习干什么不太了解)1. 实现内存池的三级缓存分别是哪三级,为什么要设计成三级,有何作用?2. 中央缓存有没有必要做成无锁的?3. 这个中央缓存在NUMA架构下可能存在什么问题(其实就是想问tcmalloc的cpu-local的实现,怎么针对numa做的具体优化,但是这部分没看过,遂寄)4. 问另外一个RAG的项目,介绍一下项目架构(网上买的项目,其实自己不够熟悉),介绍完之后,面试官问为什么四个模块要作为独立进程运行,为什么不设计成多线程的呢(我说其实项目就是一个单进程的,没有多进程),然后问改成多进程会带来什么好处,不是多进程为什么要用消息队列,你对消息队列熟悉吗(直接给我问懵了,对这个项目太不熟悉了)5. RAG里构建的知识库是自己爬的数据吗,文本是怎么分割然后转换为向量的,检索的时候具体是怎么检索的。6. 简历中的一段话是怎么实现的(简历是让ai写的,这段话实际上项目里没有,拉跨完了)7. 手撕:c++实现c风格的safe_strcpy,将源字符串src复制到目标字符串dest,不能使用cpp标准库里的函数实现,纯靠基本类型和操作实现,且需要重点考虑两个字符串有内存重叠的情况,这道题其实真的很简单,但是我对c风格的char*操作不够熟悉,导致硬是一点没写出来,遂寄 😭这里给大家提示两个关键的点,可以试着自己写一下,然后问问ai对不对。(1)c风格的字符串是char*,是地址连续的若干char组成的,每次++就能取到下一个字符,且字符串会以’\0’结尾(2) 不用考虑拷贝后src是什么,只要dest是src拷贝前的字符串就好,所以要考虑dest和src内存重叠时dest在src前还是后(因为字符串地址是连续的,所以直接可以判断dest和src的地址大小与长度,就可以知道是不是重叠,重叠的话在前还是在后了)8. 反问:部门是快手的搜推,40来号人,作息比较自由。9. 我让面试官给我一个面试和简历建议,面试官说对RAG这个项目不够熟悉,这个项目比较新,可能更容易被问。果然最短板的被最狠狠的记住了,其实中间还有一些其他小问题没回答上来,但还是自己感觉回答最不好的,面试官也感觉最不好,面试也是木板效应,建议大家还是好好深挖简历,把每个点都熟悉(至少自己写简历上的得能说的很好,额外发散问的就看自身有没有相关经历和运气回答对了,那个就不好把握了)补充:又想起来几个问题。1. 客户端向服务端分别发送三个TCP包和三个UDP包(不考虑建立连接,假设连接已经有了),服务端分别会收到几个包?这个问题实际上是想问TCP和UDP的可靠和不可靠,答案是TCP理论上服务端会收到3个,UDP是0-3个(可能会丢),但是自己考虑到TCP的字节流,粘包上去了,回答的是TCP可能粘包,是1-3个,UDP是3个,拉完了2. 客户端向服务端发送读取文件的请求,服务端进行一次磁盘IO然后返回数据,要调用哪些系统调用(假设连接已经建立,如果是两个的话是哪两个),两个的话最起码是read和write,之后又接着问,read做几次拷贝,write做几次拷贝,如果使用sendfile这个零拷贝的系统调用的话实际上有几次拷贝?
查看15道真题和解析
0 点赞 评论 收藏
分享
岗位是:KVcache/高性能缓存开发上来先让做自我介绍(这里切出来看自己写好的自我介绍了),自我介绍完后因为听面试官声音有点小就又切出来提音量了,然后面试官就恼火了,说别一直切屏,他那边一直弹提醒(赛码网面试不写代码的时候切屏也会提醒,注意一下),之后就是面试官自我介绍,开始八股:1. 智能指针有哪些以及适用场景2. c++中有哪些常用的锁,使用场景是什么(这块问的很多,但是答得不够流利,得练习)3. 自旋锁和排他锁有什么区别4. 如何排查进程中cpu最繁忙的api或者说函数(这里没整过不太会,说的gdb写个脚本查看,太夸张了,下来查了一下大概是`top`+`perf`+`pstack`, top(或者htop可以更直观的查看cpu各个核心的使用率以及进程的资源占用,top -H -p PID也可以直接查看进程中的线程CPU占用)查看高消耗CPU的进程,然后执行pred top -p PID即会显示进程中系统调用和模块(可执行命令,链接库等内容)所占用CPU的百分比,然后pstack -TID(或PID)打印线程的调用栈(PID就是打印所有线程的调用栈),就可以排查高占用的进程以及函数。可以举一反三一下:内存,磁盘等IO占用率高如何排查?5. STL标准库中哪些容器是用树实现的,哪些容器是用哈希表实现的。6. 项目里的thread_local高并发内存池,三级缓存是怎么做的,使用什么数据结构管理这些缓存页以及分割为大小不一的对象的。7. 手撕:hashmap,要求使用开放地址法里的线性探测法实现,实现put和get函数(这个线性探测法第一次写,直接写成index一直++寻找空的了,面试官提醒要考虑最后找不到回来从头找的情况,因为可能hash算出来的key直接在最后,直接index++然后认为hash桶不足然后rehash的话可能会频繁发生rehash)8. 反问:业务,是小红书哪儿做分布式高性能缓存的团队,还是需求挺多的,然后现在一个小组大概8个人主要做缓存这一块,处理一些什么什么的具体问题。这个小红书的面试官真的是雷厉风行,大开大合的那种,30min急速八股然后手撕结束,一点实习没问,恼火恼火的也快,然后问问题的时候也会回答的很细很多,经常他回答的时候我都插不上话,如果不挂我的话,那我觉得他性格还不错,挂我我就要怪他调个音量就恼火我了。
查看8道真题和解析
0 点赞 评论 收藏
分享
发面经攒人品~上来先问了下为什么不做算法(做个雷达深度学习和大模型属实是差太远),研究方向是什么,然后直接八股:1. 智能指针用过哪些,各自适合于什么场景2. 虚函数是怎么实现运行时多态的,虚函数查表的开销有多大(静态多态和运行时多态那个开销更大)?查表的时间复杂度是 O(1),因为虚函数的偏移地址在编译期间就确定了,调用的时候直接可以用,但是后面面试官又问从 cpu 指令角度看还有什么开销,问了 ai 大概有这些开销(相比于普通函数调用的开销):首先我们说下虚函数在底层角度会多执行三步:获取 vptr->计算函数地址(偏移量是编译器就定了无所谓,但需要访问虚函数表 )->调用函数- 影响最大的是如果 vptr 或vtable 不在 cpu 高速缓存中的话,会触发缓存未命中(因为前两步大致的汇编代码是 `mov rax, [rdi] ; 假设rdi是对象地址,rax = vptr` 与 `mov rbx, [rax + 0x10] ;` 需要访问内存,就会发生缓存未命中,但是普通函数或者静态多态的地址在编译器就确定了,可以直接使用固定地址调用,就无需从内存中读取数据),这会延长大约 50+时钟周期(普通函数调用就 1~3 个时钟周期)- 调用函数时,因为 call 的是间接地址(即虚函数表中存储的内存地址,存在寄存器中被调用),会导致 CPU 指令预取失效,流水线需要重新同步,产生 3~10 个的时钟周期(所以即便虚函数表在缓存中,虚函数调用也普遍比普通函数或静态多态函数慢这么多)3. 移动语义简单说一下(这里移动语义答的不是很好,一慌就和 ai 发生幻觉了一样乱吐词,可以后面多了解一下具体应用上的移动语义),问知不知道 move 的底层实现(说到强转,又问有哪些转换)4. Cpp 中有哪些锁(这部分答得不是很好,可以系统梳理一下),粒度最小的锁是哪个(基于 atomic 的原子操作是粒度最小的,精确到单个内存位置),自旋锁什么场景使用(临界区执行时间很短,自旋等待的开销小于线程阻塞/唤醒的开销,以及不希望线程阻塞的实时系统)5. 问了解哪些常用的数据结构。6. 操作系统的虚拟内存说一下,一个页大小大概是多大,还有哪些页大小,页大了或者小了有什么优缺点(可以了解一下 THP 透明大页的概念)7. 场景题:微博这种搜索平台如何设计一个实时统计一定时间段(比如 5min)内 topK 热点关键词的系统,用那些数据结构或者软件可以做到?8. 手撕 LRU9. 反问环节:主要做的是快手的搜索架构,还做一些AI搜索,与快手视频的RAG
查看13道真题和解析
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务