百度提前批C++一二三面(已通过)
面的是搜索数据架构部门,岗位C++开发
一面
- 自我介绍
- TCP和UDP的区别
- TCP可靠性如何保证
- 网络拥塞,目的是什么,为什么不能通过预估网络带宽进行拥塞控制呢?
- 流量控制,目的是什么
- TCP四次挥手
- time_wait作用
- 在一个TCP连接中,客户端到服务器链路中断,服务器到客户端还是通的,会出现什么异常状况?(TCP 的 keepalive 机制)
- 多线程解决了什么问题
- 同步非阻塞IO优点是什么?减少了阻塞时间有什么用?
- 在cpu拉满的情况下,linux的timefd定时会出现延时吗?如何保证没有延时的呢?(软中断,进程优先级),这个软中断是由谁发起的呢(内核)?
- 多线程和多进程有什么区别?进程切换和线程切换
- 进程间通信
- 多进程资源互斥
- 给定一个原子变量,如何实现自旋锁?
- 读写锁应用场景
- 智能指针,shared_ptr线程安全吗
有若干个任务的执行记录,每条记录包含开始时间和终止时间。这些任务可能是并行执行的,时间上会交错。 请求出从最开始有记录到最终一条记录之间,有多长时间是完全没有任何任务在执行的。 结构: struct Task { // 任务起始和结束时间 int begin; int end; } 接口: // 参数:所有任务历史记录 // 返回值:中间的空洞时间总长度
二面
- 写代码:实现单例模式,拷贝构造函数,赋值操作符需要定义吗?static变量是什么时候初始化的?
- mutable,const关键字,顶层const和底层const,这里贴出一个记忆的好方法:只需要判断const是在 * 的左边还是右边即可。左边则是修饰被指物,即被指物是常量,不可以修改它的值;右边则是修饰指针,即指针是常量,不可以修改它的指向;在左右两边,则被指物和指针都是常量,都不可以修改。
- 写代码:删除 vector 数组中变量,主要考察迭代器失效问题
- 二叉搜索树,AVL树,红黑树特性
- 跳表
- multiple Reactor,Proactor
- 进程,线程,协程,协程有什么缺点?需要注意哪些地方?有没有看过libco库?
- buffer io 和 direct io
- linux 的read,write的系统的内核调用栈
- mmap,和 read,write的区别
- 写代码:线程安全的读写队列,保证性能(写了个阻塞模式,面试官可能更想要一个无锁队列)
- CAS,ABA问题
- 读写锁
- 聊了一些项目问题
三面
三面应该是经理面,没问题基础,只考了几个算法题和概率题:
- 寻找链表的公共节点,如何快速判断没有公共节点(一次遍历)
- 寻找中位数
- 分布式环境中,10台机器,每台机器上都有一部分数据,怎么找所有数据中的中位数
- 老王有两个孩子,已知其中一个是女孩,另外一个也是女孩的概率是多少?
- 聊未来,聊人生,聊工作
三面最后直接说了我没问题,需要在8.15号之前给他一个答复,确定去不去,现在也拿了字节意向书,比较纠结,有没有大佬给分析一下。