阻塞和非阻塞区别
阻塞/非阻塞是形容函数的调用。
select的底层实现
用户空间维护一个fd_set, 内核将fd_set拷贝到内核区,发生IO事件时,就会改变fd_set的状态,调用返回时,遍历fd_set查询IO事件.
tcp握手挥手
tcp通过三次握手建立连接,通过四次挥手断开连接
简单描述三次握手和四次挥手的过程。
讲一下智能指针
采用引用计数机制,引用一次,计数器加1,当计数器为0时调用析构函数释放内存。
函数里面定义一个int类型变量,存在哪,加上const呢,有什么区别,加上static呢
讲一下c++怎么实现多态的
知道c怎么实现多态的吗 (虚函数表和虚函数表指针)
讲一下回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
C/C++ 的问题都比较偏底层
shopee 一
算法:字符串做+法, “234” + “678” = “912”
比较经典的模拟题,考一下写代码的感觉。
OSI 前四层的作用
物理层,链路层,网络层,传输层
TCP的滑动窗口用来干啥的
控制数据的发送,保证可靠性。
TCP四次挥手
为什么要四次挥手
确保数据能够完成传输,但关闭连接 时,当收到对方的 FIN 报文通知时,它
仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以
未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文
给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下
都是分开发送的
简单的说,就是使数据传输完成。
time wait 和 close wait是干啥的
time wait是确保最后一次挥手信号能够到达。
close wait是前两次挥手到发送主动关闭时要间隔一段时间。
什么时候用tcpdump
TCPDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
Server能不能提前close,会有什么结果
不能
滑动窗口size每次衰减/增大多少
HTTPS和HTTP的区别, HTTPS request的流程
http是明文传输,https是http+SSL加密
浏览器访问域名的事件流程
DNS域名解析,TCP连接建立,HTTP请求,HTTP响应,浏览器渲染解析。
ARP攻击是怎么回事
ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址。
ARP 攻击发送在局域网内
ARP协议存在很多漏洞和不足,给计算机网络造成很大的隐患。首先ARP协议是以广播方式发送ARP请求的,只要是同一个网段内主机都可以收到,这就为攻击者以可乘之机,攻击者可以发送大量的ARP请求包,阻塞正常网络宽带,使局域网中有限的网络资源被无用的广播信息所占用,造成网络拥堵;其次ARP协议没有安全认证机制,因为局域网内主机是建立在信任的基础上的,所以只要主机接收到ARP应答包,都会缓存在ARP表中,这就为ARP欺骗提供了可能。攻击者可以发送错误的IP地址MAC地址的映射关系。
怎么样防止ARP攻击
在交换机配置相关协议
知道虚拟IP吗(这个有点不确定。。就说好像是NAT内部的IP地址,与之对应的是公网的IP)
C++从代码到可执行文件是怎么生成的
预处理,编译,汇编,连接。
动态链接和静态链接有啥区别
静态连接库是全部编译在一起,当要增加新功能时需要重新编译。
动态链接库是分开编译,调用时加载
C++,python多态怎么实现的
为什么要GIL,用来解决什么问题的
有用过协程吗?和线程有什么区别
用户级线程,不需要内核进行切换。
什么是内存泄漏
不再使用的内存没有及时释放。
一个内存泄漏的进程退出还有有影响吗
没有影响
怎么样会有僵尸进程
shopee 二
无手撕算法…..只需要讲概念和实现
如何大数组找top K
堆
如何实现LRU
双向链表+Hash表
如何实现高可用
分布式存储主挂了怎么办
slave选举算法
如何预防脑裂
MySQL和mongodb的区别
关系型和非关系型
为什么NoSQL快(没答出来)
C++编译阶段都干了啥
有啥问题 ->(为什么NoSQL快
视频面
一面
二面
一面
首先介绍一下自己
说一下在实习期间做的项目
说一下数据库索引底层结构
B+树
说一下https的原理
说一下redis在分布式情况下的key是如何查找的
说一下几种map间的区别
说一下线程池的几个参数和具体用途
我在这里下,面试官可能不太了解。所以说了很久线程池的不可重入锁的用途。
编程题
使用两个非空单向链表来代表两个非负的大整数,数字的最高位在链表的最开始节点存储,每个节点只存储一位数字,将这两个链表相加后返回一个新的链表。
例如 (6->3->5->8)+(1->4->3)=(6->5->0->1)
不是很难,但是现在想想感觉可以翻转链表按照leetcode 2的思路做,但是当时直接记录链表长度,递归连接了。
二面
首先介绍一下自己
说一下在实习期间做的项目
balabala具体项目的一些思路以及解决方案,说了很久
场景设计题:
积分换礼物的活动,每个用户(user)可以用不定积分(point)兑换一种礼盒,且每人限换一次。下单(order)逻辑:1)创建订单 2)扣减用户积分 3)扣减礼盒库存 4)下单成功
根据题目讨论了一下分布式锁,以及锁的范围大小,幂等的处理问题。
之后讨论了一下分布式事物处理方案,实习的组内是使用消息队列的形式保证事物的,但是当时和面试官讨论的时候一直纠结于如何处理回滚问题(我到现在也不知道,看网上的资料也只是通过重试保证一致性),没有回答好。
三面
三面的问题就偏向hr,问了一下我是如何学习的,以及在学校里的兴趣爱好,然后就介绍了一下做过一段时间的美漫翻译,嘿嘿。
聊了一下简历上的一些项目。
问题:
说一下map的get,put。
说一下堆的增删
说一下多进程间通讯方式。
说一下在命令行kill一个线程,在操作系统通信层面,都做了什么?
信号量
编程题 输入二维数组matrix, 将其中被1包围的所有0改为1 dfs
编程题 leetcode 71
最后问了一下我在阿里和头条间如何选择,舔!!!
因为简历投递的较晚,提前批临近结束前才被鹅厂捞起,接到了约一面的电话,当时挺紧张的,手都在抖。(第一次面试)
到了约定时间一分不差打过来了,感叹。
自我介绍
项目相关
学习相关
顺序存储链式存储优缺点
冒泡和快排平均时间复杂度
链表是否带环
如何不使用第三个数交换两个数
bfs dfs
虚函数表,什么时候创建
重载 多态
inline和宏区别
c++内存模型
长连接短连接应用场景
长连接适用于操作频繁/点对点通讯等连接数不太多的情况,如:一些游戏/即时通讯场景应该使用长连接;如:老师端和学生端的即时通讯教学软件; 最经典的案例是:数据库使用的连接(如果使用短连接会造成Socket错误
)。ps:每个TCP连接都需要三步握手(时间),每个操作必须先连接->再操作处理速度会降低,而且每个操作用完不断开,当次处理时直接用通道发送数据包,不在建立TCP连接。
短连接适用于Web【wapWeb/H5等】的http服务,长连接对于服务端来说会耗费一定资源。对于电子商务Web的访问量可能是千万级别甚至亿万级别的。如果使用长连接的方式 当一万个用户访问时会占用一万个连接,假设服务器站点(IIS等)的通信吞吐量只有1千个,那么另外九千人就彻底挂啦,所以并发量大且用户不需要频繁的交互式操作时 用短连接为上策。
如何控制长连接
设置一个心跳包。
tcp三次握手四次挥手
四次挥手为什么第二次第三次不能合并在一起
tcp是全双工通讯
拥塞控制
状态同步帧同步
王者荣耀是什么同步 为什么
状态同步有哪些应用场景
总结:实在是面了好久,讲的口干舌燥,问题基本都回答上来了,不过瑕疵还是很多,最后让我回去等通知。
第二天早上就接到了约下午二面的电话,到了约定时间后一直没接到电话,很忐忑的等了10分钟左右,实在按耐不住就回拨了座机转人工咨询面试情况,然后hr说帮我问一下。刚挂电话,二面的电话就来了。
聊一面经历
昨天听说你不太了解手机端纹理压缩格式,回去有了解吗(回来看了忘了一点,答得不好。)
协程是什么
用户级线程
c++多态如何实现
虚函数表创建时期
mysql会吗(我:“不会,在校学的mssql”,面试官:“mssql太简单了”。。。。。。。。。。。。)
有哪些着色器,有哪些坐标系,哪个坐标系是二维的,有哪些变换,这些变换分别应用在哪些着色器里
深度测试阶段
高斯模糊如何实现
会opengl吗(只会dx)
mipmapping(一直讲讲完了纹理采样,面试官说你讲了挺多啊。。)
学习相关
项目相关
除了项目的还开发过什么游戏
平时玩什么游戏
平时玩什么腾讯游戏
腾讯手游玩吗 玩什么(我把刺激战场和平精英说成两个游戏了,罪过。)
玩fps游戏吗
ARP协议
此时,红黑树的操作效率高于链表
多线程中使用索引。
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
MySQL的事务类型
事务概念:
一条或一组 SQL 语句组成一个执行单元,其特点是这个单元要么都执行要么都不执行,单元中的每条 SQL 语句相互依赖,形成一个整体,如果某条 SQL 语句执行失败或者出现错误,那么整个单元就会回滚,撤回到事务最初的状态,如果单元中所有的 SQL 语句都执行成功,则事务就顺利执行。
举个栗子:
张三的账户有 1000 元,李四的账户有 1000 元,现在张三准备给李四转账 500,此时执行 SQL 为:
UPDATE tb_account SET balance = 500 WHERE name = '张三';
UPDATE tb_account SET balance = 1500 WHERE name = '李四';
假如在执行完第一条 SQL 语句后,中间出现了错误,执行不到第二条,这就导致了张三的余额变了,而李四的余额没有变。这时就需要事务来解决这个问题,而上面两条 SQL 语句就组成一个执行单元。
事务的特性(ACID):
⑴ 原子性(Atomicity):
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
⑵ 一致性(Consistency):
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如说刚才的栗子,张三和李四他们在转账之前的余额总和为 2000,经过事务执行之后,他们的余额之和也得是 2000。
⑶ 隔离性(Isolation):
一个事务的执行不能被其他事务干扰,即一个事务的内部操作及使用的数据对并发的其他事务是隔离的。并发执行的各个事务之间不能互相干扰。
⑷ 持久性(Durability):
一个事务一旦被提交,它对数据库中数据的改变就是永久性的,后续的其他操作和数据库故障不应该对其有任何影响。
MySQL 提供了 4 种事务隔离级别:
⑴ READ UNCOMMITTED(读未提交记录)
允许事务读取未被其他事务提交的变更,脏读,不可重复读和幻读的问题都会出现。
⑵ READ COMMITTED(读已提交记录)
只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能会出现。
⑶ REPEATABLE READ(可重复读)
确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读问题仍然存在。
⑷ SERIALIZABLE(串行化)
确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下。
MySQL 默认的事务隔离级别为 REPEATABLE READ。
compare and swap,存一个期望值和,当前值与期望值相同时,才修改,否则就不修改。
原子操作用CAS
占用CPU资源高
安全,CPU底层的操作。