阿里提前批面试查缺补漏
程序员文章站
2024-03-23 13:02:58
...
B树B+树的区别?
- B树的每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null;B+树只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针
- 在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针,这些叶子节点可以组成顺序结构,方便范围查询
- 之后可以引出与hash索引和有序数组的区别,以及为什么适合做MySQL的索引结构
docker是怎么实现的(基于什么技术)?与虚拟机的架构区别是什么?
-
docker
- 基于虚拟化的轻量级替代技术,创建一个容器并在其上通过配置文件自动化安装部署和升级,可以把生产环境和开发环境分开
- 不同的Namespaces将docker的进程树、网络接口、挂载点和资源隔离开来
- docker使用AUFS作为容器的文件系统,将容器需要的目录挂载到容器中,同时禁止当前容器访问宿主机上其他目录
- Control Groups(简称 CGroups)能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽,可以为不同的容器分配合适的资源,即使某个容器在处理CPU密集型任务,也不会影响其他容器
- LXC是Linux containers的简称,是一种基于容器的操作系统层级虚拟化技术。借助于namespace的隔离和cgroup限额功能,提供一套API和工具管理容器。它被整合进内核,执行时不用重复加载kernel,与host共享内核,加快容器启动过程,减少内存消耗
-
与虚拟机的架构区别
- 虚拟机在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。注意:docker没有层次上的虚拟化操作系统
- 虚拟机的Hypervisor(运行在物理服务器和操作系统之间的中间软件层)会对资源进行虚拟化;docker直接使用硬件资源,相当于进程
RPC?底层原理?
-
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层
-
动态代理方法
- 在客户端以本地方式调用服务后,客户端存根(client stub)负责将方法、参数等组装,设置超时时间 requestID等相关参数
- 序列化上述数据,并通过socket将消息发给服务端
- 服务端存根(server stub)收到消息后解码(反序列化),根据结果调用本地服务
- 本地服务调用完毕,再把执行结果返回给服务端存根,打包序列化,再通过socket发送给客户端
AOP的实现原理?
-
动态代理(JDK动态代理和cglib)
-
通过反射机制获取相应对象的代理类,创建代理对象然后在此对象上处理执行逻辑
-
其中有两个非常核心的类:
-
java.lang.reflect.Proxy
类。 -
java.lang.reflect.InvocationHandle
接口。
Proxy
类是用于创建代理对象,而InvocationHandler
接口主要你是来处理执行逻辑例如下面的代码,
newProxyInstance
参数分别是 类加载器,类要实现的接口和InvocationHandler
接口的实现类,其中InvocationHandler
接口的实现类中的invoke函数就是处理逻辑 -
-
public static Object getProxy(Object object) { return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new ProxyClient(object)); }
-
滑动窗口机制?接收方,发送方窗口大小是怎么确定的?
发送端缓存(按ID一个个排列)
- 发送了并已经确认的
- 发送了并尚未确认的
- 没有发送但等待发送
- 没有发送且暂时不会发送
Advertised window
接收端给发送端报的窗口大小,等于第二部分加第三部分(没做完的和马上要交代的)
- LastByteAcked:第一部分和第二部分的分界线
- LastByteSent:第二部分和第三部分的分界线
- LastByteAcked + AdvertisedWindow:第三部分和第四部分的分界线
接收端缓存
- 接收并确认过的
- 还没接收,马上能接收的(最大工作量)
- 还没接收也没法接收的
- MaxRcvBuffer:最大缓存的量;
- LastByteRead之后是已经接收了,但是还没被应用层读取的;
- NextByteExpected是第一部分和第二部分的分界线。
AdvertisedWindow=MaxRcvBuffer-((NextByteExpected-1)-LastByteRead)
一些设计模式和相对应的类图。。。
类加载器的分类,双亲委派机制?
还有一些其他基础问题,如JVM内存结构、并发中AQS的底层实现、HashMap原理扩容机制、线程安全性问题、数据库锁和幻读等问题,基本了解的就不再展开讲了
上一篇: 网易电话面试经验——C 游戏服务器开发
下一篇: 面试总结