今日头条三面经历(C++)
一面
- 讲一讲项目
- 如何处理get和post
- tcp接收窗口和拥塞窗口
- 什么时候会向对端传窗口大小
- extern C的意义
- 假设rtt(数据从两端一来一回) 100ms,那么从输入一个http://url到得到网页要多少时间
- https呢?
- 连续发送两次http请求,会得到两次结果吗?可能第二次比第一次快吗?
- 是否了解TCP包头阻塞?
- 服务器状态502 503 504什么问题,怎么排查
- netstat具体查看什么问题
- 写题:多路归并(用了堆,在细节上有一些问题) 看代码中的问题: class Foo { public: Foo(){_p = new int();} ~Foo() {delete _p; _p = nullptr;} private: int* _p; } sql:三句查询,要求建立索引来优化查询 一些linux语句的作用:less more sed awk du df dd at tee crotab xargs 最近看了什么技术书籍
二面
- linuxIO模型,区别在哪
- 线程独立拥有哪些资源
- 协程和线程有什么差别,优势呢?
- get和post有什么差别
- sendfile的优势在哪?
- 代码:随机播放100首歌(洗牌算法/这个我把自己绕进去了,洗一次直接输出就完了,我当时脑子短路了,洗一次播一首非要再洗一次来手动提升复杂度,最后没绕出去,然后换题了)
- 两个倒序数组找最第k大的(框架差不多,最后发现漏了一种情况,感觉还在想洗牌的事情)
因为二面代码花了很久,最后没写完,当时心态有点崩,但给了三面
三面
三面没有写代码,问了一个小时,面试官全程半启发半追问,感觉有点懵,我把上下文相关的问题空格分段了
C/C++内存问题有哪些,尽量说
free和delete在具体实现上的差异
free之后的指针使用有什么问题
缓冲区溢出如何避免,有哪些场景
如何检查/处理越界
野指针和悬空指针分别是什么
试图使用野指针有什么问题
内存上还有别的问题吗?
C++11用过什么特性
之前讲的内存问题有什么好的方法吗?
智能指针讲一下
shared_ptr讲一下,怎么实现的,unique_ptr呢?
是不是所有要用指针的地方都应该用智能指针,有什么问题和不足?(我答了两次寻址和额外空间)
这些缺陷,在不用shared_ptr的前提下有减少成本的策略吗?(跳过了)
include,头文件里面一般放了些什么
- 声明和实现要写在一起吗?是不是一定要分开写?
- 写在一起和分开对最后的代码有什么影响,怎么确认(这个我不会,面试官让我试着分析一下,结合include的行为来谈)
gdb怎么查看一个函数的地址?
- 你在Linux使用经常哪些指令
- 如何探查CPU负载情况
- 在什么时候CPU被认为是繁忙/空闲的?
看过哪些比较大的代码?(后面很多问题是从这来的)
服务器:
- 多线程服务器和nginx在工作方式有什么不一样的地方
- nginx怎么处理请求
- 进程唤醒(惊群问题)的额外成本主要在哪?
- nginx的负载均衡(我只答了那个worker的负载均衡)
- 为什么它要用多进程,优势在哪,劣势在哪
- 多线程怎么应付同样的问题,能够解决吗,讲一讲方案
- 你的方案有什么问题?
http了解多少?
- http缓存机制了解吗?
- 长连接讲一下
- 如何实现长连接(保活)
- 带外数据如何使用?
- 你的这个方法有什么问题,可以直接兼容不同的浏览器吗?
- 了解nginx的解决方案吗?
redis
你对redis怎么理解的?
redis的总体结构
单线程的优势和缺点
redis的事件分发
讲一讲文件事件有哪些
client功能是怎么实现的
时间事件(serverCron函数)
serverCron做了什么
redis所有事情都只有一个单线程吗?
bgsave讲一下,为什么要fork一个进程来做
interrupt与signal有什么差别
interrupt的发起和接受者是谁
操作系统在interrupt中发挥了什么作用
signal呢,发起者又是谁,接收者呢?(这里答得有点混乱)
TCP
- ack什么时候发送,丢失了会怎么样?
- sack了解吗?
- 重传ack的时机只有ack超时吗?
- 重复报文被接收会发生什么?
- 拥塞窗口要不要把自己的大小发给接收方,意义何在?(这个问题一面也问了,没有答出来)
- 延迟ACK的意义在哪?
- 为什么不能每次都直接发大的窗口?
- 进程地址空间布局讲一下
- BSS为什么要叫这个名字?(后来查了,block started by symbol)
- static关键字有什么作用,如果用来修饰函数呢?
- 多个线程使用static数据会开启多个副本吗?
C++OO
多重继承怎么实现
虚拟继承怎么实现
对于函数寻址在时间成本上有什么差异?
对于继承体系很复杂的情况这个成本会被拉高吗?
最后有什么问题吗?
。。。