首页 > 笔经面经 > 字节跳动C++产品研发实习一二三面+iOS一面面经

字节跳动C++产品研发实习一二三面+iOS一面面经

头像
CharlesKassel
编辑于 2021-08-10 15:54:49 APP内打开
赞 7 | 收藏 55 | 回复8 | 浏览4234

一面 1h10min

  • Unicode和ASCII的区别
答:不会,只说了可能编码的方式不同因此各自可以存储的字符、大小会有不同
  • 进程和线程的区别
答:八股文 + Linux下进程如何创建、线程如何创建
追问:共享的资源
答:线程持有栈、程序计数器
答:八股文 + Linux内核的CFB调度器的实现:基于nice值加权与时间分配求出虚拟运行时间,并用红黑树维护,每次挑选最短虚拟运行时间的进程运行等等
追问:进程什么时候会调度
答:时间片用完了、任务做完了、等待事件发生(不知道答的对不对)
继续追问:进程中断的时候,谁来保持上下文。
答:不知道,瞎扯内核线程来操作等等
追问: 是有可能在另一个CPU的线程来操作保存上下文吗? 我意识到这样确实说不通,再次表示自己确实不清楚
  • 虚拟地址
答:八股文 + 在讲到缺页中断的时候没讲好,面试官提示“知道页表吗”,我表示知道,接着把页表的细节也补充上
追问寻址具体是哪个硬件在做?
答:不知道
  • CPU的多级缓存
答:每个CPU的共享缓存和独享的缓存等等 + atomic的实现方式之一就是依据缓存一致性原则实现的
追问:CPU如何通过缓存获取一个变量 具体过程是怎样的(大概是这么个意思)
瞎扯了一些
  • volatile
答:(理解的不是很深刻,只回答了基本的概念)面试官让举个例子。就说了多线程下对同个变量的操作会怎么怎么样,讲的不太好
  • Semaphore和mutex区别
答:一开始讲成signal和mutex的区别,被面试官点出来了(因为问的是信号量和互斥锁的区别)。之后类比condition_variable来说semaphore。mutex只能由锁了和没锁两种状态
接着略略的说了下多线程环境下用semaphore、signal等系统提供的变量会存在什么问题
  • 读写锁
答:八股文 + 如何处理写锁饿死的情况
  • 知道线程池吗
答:说了自己项目线程池的实现:mutex、condition_variable、bool、用function封装的任务队列;讲到线程创建的时候,自己提了知道线程创建的数目有讲究
但是没有去处理,之后说了线程池里的线程是如何工作的
  • 静态链接和动态链接
答:八股文
追问:动态链接何时链接,回答不知道
  • Linux大页存储
答:(这块不太熟)一开始面试官只说了“知道大页吗?”我还想 大爷?啥玩意。面试官提醒说Linux里面会存一些比较大的页。我表示知道了,然后谈了Linux的伙伴算法和mmap()
打断并追问:mmap()的命名映射和匿名映射
答:说了mmap()的共享匿名映射构建出的父子进程的共享内存实现通信。(但是忘记了私有匿名映射用于malloc()的分配,不过面试官没继续追问)
  • 知道MMU和TLB吗
答:不知道,提问TLB是线程控制模块吗(查了下是PCB,自己记错了)?面试官回答说是俩硬件,我表示不知道
  • 知道Slab和xx的区别吗?
答:xx是啥我忘了。表示自己Slab和xx都有了解过,但是不清楚二者的区别,尔后讲了Slab的工作原理:将页分区、每个区的页大小不一样等等
  • 模板的偏特化
答完面试官告诉我答成特化了不是偏特化,我表示很抱歉,然后面试官耐心的给讲解了模板的偏特化
追问知道bind()函数吗,我表示知道,并讲了bind()函数在函数传参时候的用法,然后面试官帮忙总结了bind()函数的作用
  • 你之前提到C++的allocator,可以讲一下吗
答:简单提了下为什么会从malloc发展到new再到allocator,然后讲了malloc分配的内存会得到一个带有cookie夹着的内存块,会有很多不必要的空间浪费。由此
诞生了allocator,讲了allocator的工作原理,拓展到其实就是内存池的设计理念,malloc底层实现其实也跟allocator差不多
  • TCP、UDP的协议栈
答:八股文 + 把应用层到网络层的都提了一下
  • 报文从应用层到数据链路层会有怎样的变化
讲了分片,和加包头
追问是每一层都要分片吗
答:如果超过了对应层限制的报文大小的话,是的,同时提了下数据链路层超过1500B就要分片。不知道答对没有
面试官只是继续追问:分片帧和分片报文段有啥区别(记不清)
答:不同层的叫法不同吧(不确定)
  • Google的protocol buffer知道吗?
答:尝试了解过,只知道解决了序列化啥的的问题,但是不知道咋学,就没看了。
追问:json,表示同样不知道。
  • 路由器、网桥、交换机在哪一层
答:都在数据链路层。 这里面完,我舍友跟我说路由器在网络层,但是当时面试官只是继续问了下一题
  • 一个数据包发送的全过程
按照浏览器输入URL发生什么答的。从DNS协议讲起,到ARP协议等等,最后讲到TCP协议。然后面试官追问三次握手、四次挥手的八股文、SYN-FLOOD攻击
回答完后,面试官问服务端对第一次握手的回应的,回应了啥(忘了具体是怎么问的了),没答到点上,面试官回答了说这一次握手既回应了syn
又发送了ack(这里没记好,之后再查查,总之就是三次握手其实有四次回应的意思)
  • TCP的滑动窗口,拥塞控制
八股文。
  • HTTP的header有啥
答:没有特别去背。面试官说回答下原理就可以。说了header用于指明http的版本、body的长度等等等等
  • cookie和session
八股文。之后提了一嘴防止syn-flood攻击的syn cookie,被面试官指出此cookie非彼cookie,尴尬
  • get和post区别
八股文
  • 状态码
表示没专门去背,随便说了一些
  • 跨站请求伪造攻击
按自己的印象讲了一下。面试官说我说的是跨站脚本攻击,但是没关系,大概知道就可以
  • 事务、锁、主键、索引的概念
基础知识
  • 你C++了解的很多是吧,那我直接问进阶的:虚函数表
说了虚函数表怎么运作的。追问能否用基类指针访问子类的虚函数
答:可以。并表示C++可以通过dynamic_cast等转型,任意转换指针类型,所以想访问基类子类都可以(不知道答的对不对,面试官没表态)
  • 智能指针
讲到智能指针是RAII理念下的产物,接着打断了
面试官表示没时间了,结束了提问,算法题也没做。
不过一开始面试官就把算法题打出来了,核心代码模式, LC437LC46

二面 1h20min

二三面的参考意义都不太大
  • 你一面的面评还挺好的,所以咱们这次主要考察下数据结构和算法
开始20min左右的数据结构交流,一直聊到跳表。然后面试官说“那你手写个跳表吧。”,心里咯噔一下
  • 手写跳表
面试官基本全程都在与我交流,在写数据结构的时候,我定的有点复杂了,面试官提示我让我改简单点,表示不需要整个实现出来
30min写完基本逻辑,然后剩下的时间面试官点bug,我改bug。一直到最后面试官觉得没啥问题了,就放我走了

三面 40min

LC54  LC41
  • 面向对象编程的思想
项目作为切入点,考察我面向对象编程的思想。面试官一直引导我回答,奈何我确实没有他想要的东西,最后变成上课了,给我说了这块地方应该看哪些书——《设计模式》等等等,又说了没有这种思想会怎么怎么样
最后看没啥可说的就让我下线了。面完感觉自己命悬一线,整场面试基本就在考察面向对象编程的思想,但是自己真没做过啥工程项目,设计模式也因为觉得是加分项所以没碰
面完之后一直没收到感谢信,第三天hr加我。说我被挂了,然后光速被ios的捞了, 并表示之前的面试会算在一起,因此没有收到感谢信,所以没有完全挂

ios一面面经 1h30min

自我介绍,之后面试官问我“你们这个专业(网络空间安全)毕业一般干什么”,我给他聊了会网安这个行业的前景,以及个人的一些见解,过渡到自己为什么选择研发
简历上的项目是烂大街的WebServer,因为太烂大街了,所以这里就把项目具体问了啥给大家看看,应该是有参考意义的
  • 定时器模块
定时器具体是如何服务于服务器运作的;采用了什么结构;小根堆的优势在哪里;为什么不用时间轮实现;定时器内部的插入、删除操作实现具体过程;查找特定定时器的时间复杂度;堆排的时间复杂度;
  • 日志模块
同步异步的具体实现;一般什么时候会要求日志采用同步式的写;异步情况下多个线程写入缓冲区后如何有序写入到日志中;

  • 进程调度算法
  • 内核线程和用户态线程区别
  • 嘴撕LRU
  • 哈希冲突的解决方法,扩充后如何保证原索引正确
这个问题可以参考现在HashMap的扩容机制,非常的巧妙
  • 进程的五个区
  • 栈和堆的区别
  • 内联函数,什么时候用内敛
  • int long区别
  • 给一棵树的前序和中序遍历,让输出后序遍历。不要求代码实现,直接给答案即可。参考LC105
  • 函数传入一个数组如何获取它的长度
我觉得这个应该是没办法做到的,就跟面试官说了没有办法拿到,然后说了一般最好用vector数组。面试官又说如果我这个数组是char a[100]呢?,这样的话传参的时候
依然是传指针,应该是没啥区别的。我就跟面试官说应该没啥区别,然后还说了假设传的时候把长度也传过去了,还要考虑这个数组有没有初始化的问题。这个问题懂得老哥分享下呗。
  • 子网掩码的作用
  • TCP和UDP的应用场景
  • HTTP劫持和DNS劫持(这个不会)
  • HTTP2和HTTP1.1区别(这个忘了),然后跟面试官说了我知道HTTP3和2的区别,接着他就让我说说区别在哪
  • HTTP3如何解决队头阻塞的多路复用,基于什么实现的
  • 抓HTTPS的包,可以得到明文吗?不可以的话,那你解释下为什么中间人攻击可以
  • 面试官自己出了两道字符串的简单题。均采用模拟方法就可以解决

总结

产品研发一二三面和ios一面的面试官都很好,后面复盘的时候发现对于很多第一次没答出来的的问题,面试官都在后续提问中换了个角度继续引导。最后三面挂掉真的让我感到非常的可惜,但是自己也确实缺乏工程项目的实战经验,这个没啥好说的。好好加油吧

8条回帖

回帖
加载中...
话题 回帖

推荐话题

相关热帖

笔经面经近期热帖

近期精华帖

热门推荐