目录
- 校招面经
-
- 百度一面面经-小度
-
- 1、简单的自我介绍
- 2、描述一下你的其它项目
-
- 2.1、描述的时候尽量挑一些你主要实现的功能,整个的大项目我不太关心,主要就是想了解这是一个什么系统,你在这个项目里负责了哪些模块
- 2.2、你做这样一个web服务器是为了什么场景下而去做的
- 2.3、你是基于Nginx项目还是哪个开源项目进行开发的?用什么语言开发的?
- 2.4、你这个项目最终做完之后,压测情况能抗到多大的并发量?硬件配置大概是什么情况?
- 2.5、你了解过在业内或者商业上使用的其它的web服务器的话,它的QPS大概在什么情况?在做这个开发项目之前,对开源项目有调研过吗?
- 2.5、你这个web服务器是把哪些开源项目的功能都实现了呢,还是只实现了GET和POST?
- 2.6、你在压测的过程中,是使用了什么样的一个请求?是一个代理,还是一个静态文件,还是一个已经承接的web服务?
- 2.7、你当时实现web服务的初衷是什么?项目需求、工作、学习?有学习过其它开源项目再进行开发吗?业内比较出名的开源项目了解过哪些?它们是基于什么进行开发的?
- 2.8、你的项目和这些开源项目之间有哪些区别?以及你的项目会对比它有什么优势,或者它比你更优一些什么优势?
- 2.9、你有没有思考了一下,然后希望优化它的一些功能?某些细微场景的优化有吗?
- 2.10、你了解Nginx吧?你看他们那些开源项目的时候,进程之间的调度,以及守护进程是怎么处理的。你的整个项目的调度是怎么实现的,主进程、线程的调度?你了解那个开源项目以及Nginx项目,它们是怎么做的?
- 3、其它的还有一些什么项目
- 4、还有其它的项目经验吗
- 5、你会其它一些语言吗?比如说java、go之类的?
- 6、简单写几个排序
- 7、Nginx有了解吗?Redis有了解吗?还使用了哪些数据库?
-
- 7.1、MySQL有哪些引擎
- 7.2、它们有什么区别?在什么场景下使用哪个会好一些?
- 7.3、大概是哪个版本开始默认使用Innodb?
- 7.4、如果我是高并发下的读,你建议我使用哪个引擎?
- 7.5、高并发下的写,建议用哪个引擎?
- 7.6、那Innodb是可以把MyISAM替换掉了,还是说MyISAM有哪些其它的使用场景?
- 7.7、如果有一个数据量比较大的库(上千万),有没有什么处理可以降低我慢查询的频次?
- 7.8、猜测如果要优化查询速度的话,可以从哪些方面进行优化?任何方面都可以,发散一下思路
- 7.9、如果在数据库中设置了太多索引,但是在查询的过程中优先使用到了你最不希望的那个索引(查询效率最差的)
- 8、你如果用Redis除了刚才说的用于一些缓存方案上,还了解到它会在哪些场景下使用?
- 9、有没有哪些知识点你所擅长的,我没有问到的,你可以说一下?
- 10、为什么没有考虑去其它厂进行实习呢?学习压力还是什么原因?
- 11、反问环节
- [快手一面 面经](#快手一面 面经)
-
- [1、手撕算法 LeetCode 单词拆分II](#1、手撕算法 LeetCode 单词拆分II)
- 2、十大排序的平均时间复杂度
- 3、lambda表达式的用法
- 4、三种智能指针以及使用场景?
-
- [4.1 weak_ptr除了解决循环引用的场景,还有哪些场景会使用到?](#4.1 weak_ptr除了解决循环引用的场景,还有哪些场景会使用到?)
- 5、虚函数的用法,以及在什么时候需要使用到虚函数
- 6、下面两种遍历方式有什么区别
- 7、线程同步的几种方式
- 8、反问环节
- [快手二面 面经](#快手二面 面经)
-
- 1、自我介绍
- 2、简单说一下设计模式中的单例模式
- 3、写一个单例模式-懒汉模式
- 4、解释一下在双重校验机制下,为什么要再次进行加锁?
- 5、C++空类默认会添加哪些函数?
- [6、A* instance = A::getInstance(); 这个时候会创建出一个实例对象吗?为什么?](#6、A* instance = A::getInstance(); 这个时候会创建出一个实例对象吗?为什么?)
- 7、讲一下Qt的信号槽机制,从设计模式方面来看,信号槽机制属于那种设计模式?
- 8、简单说明一下广播模式?
- 9、写一个算法题
- 10、反问环节
- [西安三星电子研究所 一面 面经](#西安三星电子研究所 一面 面经)
- [西安三星电子研究所 二面 HR面经](#西安三星电子研究所 二面 HR面经)
- [西安诺瓦星云提前批 一面面经](#西安诺瓦星云提前批 一面面经)
-
- 1、简单自我介绍
- 2、进程和线程的概念,以及两者之间的区别与联系
- 3、进程调度算法有哪些
- 4、进程间的通信方式有哪些?
- 5、C++中的多态底层是如何实现的?绑定子类对应override函数发生的时机在什么时候?
- 6、C++中的深拷贝和浅拷贝的区别
- 7、STL中map的底层结构是由什么来实现的?平均查找效率是多少?map可以使用其它方式实现吗?
- 8、B树和B+树的区别,与平衡二叉树和红黑树之间的区别
- 9、TCP四次挥手,TIME_WAIT出现在哪一端?TIME_WAIT过多会出现什么问题?
- 10、介绍跳表项目,跳表的插入数据如何实现的?
- 11、select、poll、epoll之间的区别是什么?
- 12、反问环节
- [海康威视一面 面经](#海康威视一面 面经)
校招面经
百度一面面经-小度
1、简单的自我介绍
包括但不仅限于学习经历、求学经历以及工作经验相关
1.1、描述一下项目经验
1.2、你主要在这个项目中负责哪些模块功能的开发
1.3、这些界面的数据以及通信是怎么实现的?用的哪些协议或者哪些数据库
1.4、解析完的数据后续要怎么处理
面试官:你的页面其实是一个数据的承接和展现的一个功能,通过TCP协议拿到数据,然后对拿到的数据包进行解析之后,进行进一步的数据展现。
1.5、除了展现数据之外,有变更和操作相关的功能吗
面试官:其实更像是使用QT做了一个端页面,然后给操作人员去使用的一个测控系统,在这个测控系统上进行查看和编辑
2、描述一下你的其它项目
2.1、描述的时候尽量挑一些你主要实现的功能,整个的大项目我不太关心,主要就是想了解这是一个什么系统,你在这个项目里负责了哪些模块
2.2、你做这样一个web服务器是为了什么场景下而去做的
2.3、你是基于Nginx项目还是哪个开源项目进行开发的?用什么语言开发的?
2.4、你这个项目最终做完之后,压测情况能抗到多大的并发量?硬件配置大概是什么情况?
2.5、你了解过在业内或者商业上使用的其它的web服务器的话,它的QPS大概在什么情况?在做这个开发项目之前,对开源项目有调研过吗?
2.5、你这个web服务器是把哪些开源项目的功能都实现了呢,还是只实现了GET和POST?
2.6、你在压测的过程中,是使用了什么样的一个请求?是一个代理,还是一个静态文件,还是一个已经承接的web服务?
面试官:相当于一个GET请求对于图片的一个压测
2.7、你当时实现web服务的初衷是什么?项目需求、工作、学习?有学习过其它开源项目再进行开发吗?业内比较出名的开源项目了解过哪些?它们是基于什么进行开发的?
2.8、你的项目和这些开源项目之间有哪些区别?以及你的项目会对比它有什么优势,或者它比你更优一些什么优势?
2.9、你有没有思考了一下,然后希望优化它的一些功能?某些细微场景的优化有吗?
2.10、你了解Nginx吧?你看他们那些开源项目的时候,进程之间的调度,以及守护进程是怎么处理的。你的整个项目的调度是怎么实现的,主进程、线程的调度?你了解那个开源项目以及Nginx项目,它们是怎么做的?
推荐你看一些项目的源码,可能对你有跟多帮助
3、其它的还有一些什么项目
3.1、Redis大概支持哪些数据结构存储
4、还有其它的项目经验吗
5、你会其它一些语言吗?比如说java、go之类的?
6、简单写几个排序
6.1、实现一下快排和选择排序
6.2、十大排序都有哪些
6.3、快排和选择排序的时间复杂度
7、Nginx有了解吗?Redis有了解吗?还使用了哪些数据库?
7.1、MySQL有哪些引擎
7.2、它们有什么区别?在什么场景下使用哪个会好一些?
7.3、大概是哪个版本开始默认使用Innodb?
MySQL5.5版本开始默认使用InnoDB
7.4、如果我是高并发下的读,你建议我使用哪个引擎?
建议使用MyISAM,因为这种场景下只需要进行频繁的查询操作,MyISAM在这种场景下查询效率更高并且占用内存更少,因为没有了事务以及锁等信息,MyISAM会更专注与查询数据,效率相较之下就更快,MyISAM使用的是非聚集索引,非叶子节点记录的是对应的索引 + 指针,所以B+树相较之下占用的磁盘空间更小
7.5、高并发下的写,建议用哪个引擎?
建议使用InnoDB,因为InnoDB支持事务隔离机制以及行级锁,在需要对数据进行频繁更新的情况下,可以保证数据的安全性
7.6、那Innodb是可以把MyISAM替换掉了,还是说MyISAM有哪些其它的使用场景?
7.7、如果有一个数据量比较大的库(上千万),有没有什么处理可以降低我慢查询的频次?
7.8、猜测如果要优化查询速度的话,可以从哪些方面进行优化?任何方面都可以,发散一下思路
- 数据结构的优化,也就是表结构的优化
- 选用合适的数据类型:比如在存储年龄,没必要使用INT这么大范围的字段
- 适当的拆分:一张表的字段不能超过30,不要试图把所有字段都放在一张表里
- 字段尽量设置成NOT NULL,尽量带有默认值,执行查询的时候,数据库不用去比较NULL值
- SQL语句优化
- 尽量使用索引,尽量避免全表查询,提高查询速度
- 查询语句当中包含有 MAX (), MIN () 和 ORDERBY 这些命令的时候,性能提高更为明显
- 索引应建立在那些将用于 JOIN, WHERE 判断和 ORDER BY 排序的字段上
- 尽量不要对数据库中某个含有大量重复的值的字段建立索引
- 不能无限制的建立索引,维护索引也会影响性能
- 尽量避免在 where 子句中对字段进行 Null 值判断
- select 的时候,使用具体的字段代替 * 号
- 避免返回大量数据,增加分页
- 减少数据库的访问
- 可以通过增加本地缓存或者分布式缓存的方式,将热点数据存储到缓存中,以减少数据库的访问
- 对于一个不合理的需求,我们可以拒绝做这个需求,这样也算是"减少了数据库访问"
- 读写分离
- 主库用于写,从库用于读,将读写分散在不同的数据库上,利用多台机器的资源,来提高数据库的可用性和性能
- 分库分表
- 采用一定的路由规则,将数据保存到不同的数据库中
7.9、如果在数据库中设置了太多索引,但是在查询的过程中优先使用到了你最不希望的那个索引(查询效率最差的)
- 首先进行分析查询执行计划,在查询指令前添加explain关键字,查看在查询的过程中,使用到的是哪个索引
- 检查并且合理的减少不必要的索引,太多的索引可能会导致数据库在查询时产生额外的开销,不同的查询可能需要不同的索引来获得最佳性能
- 在查询语句中使用索引提示,明确指定希望数据库使用的索引
- SELECT * FROM table_name USE INDEX (index_name) WHERE ...
- SELECT * FROM table_name IGNORE INDEX (index_name) WHERE ...
- 强制选择索引可能会导致其它查询性能下降,一般情况下还是依赖MySQL查询优化器自动选择最佳索引
- 尝试重写查询,添加或者修改WHERE条件,或者采用JOIN来改变查询逻辑
- 数据库统计信息更新
- 确保数据库的统计信息是最新的。数据库优化器根据统计信息来估计执行计划的成本,并根据成本选择最优的索引。如果统计信息过期或不准确,优化器可能会做出错误的选择
- 使用Redis内存缓存
- 分区表
- 对于特别大的表,可以考虑将其分为更小的分区表,然后针对查询的模式设置合适的索引。这样可以减少索引的数量,提高查询性能
8、你如果用Redis除了刚才说的用于一些缓存方案上,还了解到它会在哪些场景下使用?
- 会话存储(Session Store): Redis 可以用作会话存储,将用户会话数据保存在内存中,以提高性能和扩展性。由于 Redis 具有高速的读写能力和数据持久化选项,它比传统的基于文件的会话存储更加可靠和高效。
Token会被服务器缓存在Redis中,并且Redis会设置过期时间
发布/订阅系统(Pub/Sub): Redis 提供了发布/订阅功能,允许不同的客户端之间通过消息通信。这在实时通信、实时事件处理、聊天应用程序等场景中非常有用。
计数器(Counter): Redis 的原子性操作和高速读写使其成为计数器的理想选择。可以用 Redis 实现网站的访问计数、点赞计数等功能。
排行榜(Leaderboard): Redis 的有序集合数据结构可以用于创建排行榜,例如游戏中的玩家积分排行榜、社交媒体的用户粉丝数排行榜等。
地理空间数据处理: Redis 支持地理空间数据处理,可以存储和查询地理位置信息,用于位置服务、附近的人功能等。
任务队列: Redis 的列表数据结构可以用作任务队列,支持先进先出(FIFO)的任务处理,实现异步任务处理,例如后台任务的处理、消息队列等。
缓存失效处理: Redis 提供了 Key 过期功能,可以在设置 Key 的时候指定过期时间,适用于缓存失效处理,当数据过期后自动删除,从而减少缓存占用的内存。
分布式锁: Redis 的原子性操作可以用来实现分布式锁,保证在分布式系统中对共享资源的互斥访问。
全文搜索: Redis 可以结合外部搜索引擎(如 RediSearch)来实现全文搜索功能,用于实时搜索和检索大量文本数据。
8.1、有哪些成熟的方案或者架构会使用负载均衡?
8.2、如果你使用负载均衡,打到了一个机房,机房里有成百上千个服务器,再怎么DNS呢?
9、有没有哪些知识点你所擅长的,我没有问到的,你可以说一下?
防止我对你的优点没有采集到
10、为什么没有考虑去其它厂进行实习呢?学习压力还是什么原因?
11、反问环节
快手一面 面经
1、手撕算法 LeetCode 单词拆分II
2、十大排序的平均时间复杂度
3、lambda表达式的用法
4、三种智能指针以及使用场景?
4.1 weak_ptr除了解决循环引用的场景,还有哪些场景会使用到?
5、虚函数的用法,以及在什么时候需要使用到虚函数
6、下面两种遍历方式有什么区别
vector result;
for(C c : result)
for(C& c : result)
7、线程同步的几种方式
8、反问环节
快手二面 面经
1、自我介绍
2、简单说一下设计模式中的单例模式
3、写一个单例模式-懒汉模式
4、解释一下在双重校验机制下,为什么要再次进行加锁?
5、C++空类默认会添加哪些函数?
构造函数、析构函数、拷贝构造、拷贝赋值
5.1、说明一下拷贝构造与拷贝赋值两者发生的时机是什么?
6、A* instance = A::getInstance(); 这个时候会创建出一个实例对象吗?为什么?
7、讲一下Qt的信号槽机制,从设计模式方面来看,信号槽机制属于那种设计模式?
属于观察者模式
8、简单说明一下广播模式?
9、写一个算法题
10、反问环节
西安三星电子研究所 一面 面经
1、英文自我介绍
2、select、poll、epoll之间的区别是什么?
3、进程、线程的上下文以及上下文切换
4、操作系统中的页表
5、TCP数据传输中的粘包问题,如何解决?
6、说明一下Redis的缓存问题
7、简要说明Redis数据的过期删除策略
8、Redis持久化有哪几种方式?简要分别说明一下
9、CPU占用率过高问题,说明一下问题发生的原因,以及如何解决的?
10、简单说明一下冒泡、快排、堆排之间的区别,时空复杂度,以及如何实现的?
西安三星电子研究所 二面 HR面经
1、英文自我介绍,主要介绍家庭情况
2、问一些科研情况、项目情况、工作预期等情况(HR问题)
西安诺瓦星云提前批 一面面经
1、简单自我介绍
2、进程和线程的概念,以及两者之间的区别与联系
3、进程调度算法有哪些
4、进程间的通信方式有哪些?
4.1、共享内存和内存映射之间的区别
5、C++中的多态底层是如何实现的?绑定子类对应override函数发生的时机在什么时候?
5.1、你的项目中有使用过多态吗?具体用在什么场景,介绍一下
5.2、构造函数可以是虚函数吗?
5.3、析构函数可以是虚函数吗?如果不声明为虚函数会出现什么问题?
6、C++中的深拷贝和浅拷贝的区别
7、STL中map的底层结构是由什么来实现的?平均查找效率是多少?map可以使用其它方式实现吗?
7.1、unordered_map底层哈希出现哈希碰撞该如何解决?map和unordered_map两者的优缺点
7.2、二叉搜索树、平衡二叉搜索树、红黑树三者之间的区别以及优缺点
8、B树和B+树的区别,与平衡二叉树和红黑树之间的区别
8.1、1000w条数据,对应的B树和B+树分别有几层?
9、TCP四次挥手,TIME_WAIT出现在哪一端?TIME_WAIT过多会出现什么问题?
10、介绍跳表项目,跳表的插入数据如何实现的?
11、select、poll、epoll之间的区别是什么?
12、反问环节
海康威视一面 面经
1、指针的大小一般是多少?最终是由什么决定的?
答:在大多数32位 操作系统上,指针的大小通常是4字节,而在64位操作系统上,指针的大小通常是8字节。
有些特定的编译器 、操作系统或编译器选项可能会导致指针大小有所不同,但通常情况下,上述的规则是适用的。在编写跨平台的代码时,最好使用
sizeof
运算符来确定指针的大小,而不是假定固定的大小
2、结构体的大小会由哪些因素决定?
成员变量的数据类型、成员变量的数量、内存对齐要求
3、你对TCP是基于字节流的协议是如何理解的?
TCP是基于字节流的协议,而不是基于消息的。这意味着数据在传输过程中没有明确的消息边界,而是按照字节流的方式进行传输 。TCP不会将数据分割成消息,而是将数据视为一连串的字节,并在接收端重新组装成有意义的消息 。这种特性使得TCP适用于传输各种类型的数据,包括文本、图像、音频和视频等。