title: 2021年4月19日 深圳头条后台开发实习面试(一面)
tags: 面经
2021年4月19日 深圳头条后台开发实习面试(一面)
自我介绍
谈了一下数学建模的经历,以及跟我现在做的深度学习的学习经历
介绍了一下项目
问了在项目中遇到的问题以及是如何解决的呢
你知道Java中的I/O模型吗?
selector的底层多路复用是怎么实现的?(select,poll,epoll)
这三者的区别是什么呢?
为什么现在都是用epoll,不用select呢?(这个地方说epoll的优点就行)
什么叫活跃的socket连接,什么叫不活跃的socket连接?
网络层的tcp为什么要三次握手,二次可以吗?
tcp如何保证可靠性地传输呢?
流量控制是怎么实现的呢?
拥塞控制是怎么控制的呢?
tcp为什么要做拥塞控制呢?
有了流量控制,为什么还需拥塞控制呢?
网络的负载是怎么定义的?一般网络能支持的负载多大呢?internet网的负载有多大呢?
(网络负载就是当前吞吐值/网络带宽,反映了当前负载大小,百分比越高越接近于网络饱和)
什么叫网络的带宽?(表示在单位时间内网络中的某信道所能通过的“最高数据率”。即表示网络中某通道的传送数据的能力)
网络带宽和网络负载有什么区别?(看上面的网络负载的定义)
如果网络带宽为1G,如果我不超过1G,那会不会出现网络负载问题?(回答的不太清楚)
进程和线程的区别?
那你了解协程吗?(不了解)
进程间的通信有哪些呢?
信号量跟信号有什么区别呢?
进程间的调度算法
为什么要进程调度呢?(实现最大的CPU的利用率)
我们现在用的是优先级调度吗?(不是,一般是使用多级反馈队列调度)
具体说一下什么是多级反馈队列调度算法呢?
什么是事务?事务的特性?
MySQL是如何保证事务的ACID特性呢?即如何保证原子性?如何保证持久性呢?如何保证隔离性?如何保证一致性?(即ACID是怎么实现的呢?)
undo log 和 redo log的区别?
你知道MySQL中的事务提交的过程吗?(两阶段提交的过程)
手撕算法题--每k个结点一组反转链表。
1.0 MySQL是如何保证事务的ACID特性呢?即如何保证原子性?如何保证持久性呢?如何保证隔离性?如何保证一致性?(即ACID是怎么实现的呢?)
其实,这是个好问题,我们有时候去看书的时候,并没有看的这么细的,这个是在面试官的引导下答出来的!
参考博客:数据库事务原子性、一致性是怎样实现的?
数据库的一致性依赖于其他三种特性:原子性,隔离性,持久性
原子性如何保证?
innodb使用的是undo log 回滚日志,这样就可以撤回之前的操作。
持久性如何保证?
使用redo log 重做日志来进行保证的。
MySQL 是先把磁盘上的数据加载到内存当中,在内存当中对数据进行修改,再刷回磁盘上。如果此时宕机,内存中的数据就会丢失。此时,就要去借助redo log来解决持久性的问题和读写IO消耗严重问题。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录此次的操作。当事务提交的时候,会将redo log日志进行刷盘。当数据库宕机重启时会将redo log中的内容恢复到数据库,再根据undo log 和 bin log内容决定回滚数据还是提交数据。
隔离性如何保证?
使用锁机制,保证每个事务能够看到的数据总是一致的,就好像其他事务不存在一样,多个事务并发执行后的状态和它们串行执行后的状态是等价的
两种锁:
- 悲观锁
当前事务设计操作的对象加锁,操作完成后释放给其它对象使用。
提高性能->{各种粒度:数据库/表/行/各种性质:共享/排他/共享意向/排他意向/共享排他意向}
解决死锁->{两阶段协议/死锁检测}
- 乐观锁
不同事物可同时可能到同一对象的不同历史版本。使用MVCC(多版本并发控制,Multi-Version Concurrency Control),可在事务提交前查看修改事务的版本,如果与读取版本不一致可放弃提交
如果有两个事务同时修改了同一数据行,那么在较晚的事务提交时进行冲突检测。实现:通过undo log来获取历史版本,另一种简单地在内存中保存同一数据行的多个历史版本,通过时间戳来区分。