欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阿里提前批面试查缺补漏

程序员文章站 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原理扩容机制、线程安全性问题、数据库锁和幻读等问题,基本了解的就不再展开讲了

相关标签: 面经