面试真实经历某商银行大厂系统,微服务,分布式问题和答案总结

在开发领域,尤其是技术面试中,涉及的知识广泛而深入。本文将针对常见的操作系统、分布式事务、Zookeeper、MyBatis、数据结构与算法、以及微服务架构等问题进行详细解析,帮助你准备面试时的关键知识点。


操作系统部分

1. 操作系统有哪几个部分组成?

操作系统主要由以下几个部分组成:

  • 内核(Kernel):操作系统的核心,负责管理硬件资源、进程调度、内存管理、文件系统等基础服务。
  • 进程管理:负责进程的创建、调度、销毁等管理工作。
  • 内存管理:负责内存的分配、回收、虚拟内存等操作。
  • 文件系统:负责文件的存储、管理和访问。
  • 设备驱动:提供与硬件设备的交互接口。
  • 用户接口:提供用户与操作系统交互的方式,如命令行或图形界面。

2. 内存管理

内存管理是操作系统的一项关键功能,主要包括以下几个方面:

  • 内存分配:操作系统需要为不同的程序分配内存,并且保证程序间的隔离性。
  • 虚拟内存:通过硬件支持,操作系统能够让程序认为自己有足够的内存,而实际上是通过磁盘等外部存储来扩展物理内存。
  • 页面置换:当物理内存不足时,操作系统会将一些数据从内存交换到硬盘中,确保内存的有效利用。
  • 内存保护:确保每个程序只能访问自己被分配的内存区域,防止程序间的冲突。

3. malloc方法的过程

malloc函数用于动态分配内存,其工作流程如下:

  1. 请求内存 :当调用malloc时,操作系统会向内存管理器请求指定大小的内存。
  2. 查找空闲内存块:内存管理器会查找空闲的内存区域,通常是通过一个空闲链表来管理内存块。
  3. 分配内存:如果有足够的内存,操作系统会将空闲块分配给用户,并返回内存的起始地址。
  4. 返回指针malloc返回的是指向所分配内存块的指针,如果内存分配失败,则返回NULL

4. 虚拟内存

虚拟内存是操作系统提供的一个内存管理机制,使得每个进程都能认为它拥有连续的、独立的内存空间,而实际上这些内存可能是分布在物理内存和硬盘上的。

  • 分页机制:虚拟内存通过分页来将内存分割为多个固定大小的块,称为页面。操作系统通过页面表来映射虚拟地址到物理地址。
  • 交换空间:当物理内存不足时,操作系统会将不常用的内存页面移到磁盘上,腾出内存空间。

5. 进程通信

进程通信(IPC, Inter-Process Communication)指的是不同进程之间数据交换的机制。常见的进程通信方式有:

  • 管道(Pipe):一种半双工的通信方式,通常用于父子进程之间。
  • 消息队列(Message Queue):通过消息传递机制在不同进程之间进行通信。
  • 共享内存(Shared Memory):多个进程通过共享同一块内存区域进行通信。
  • 信号量(Semaphore) :用于进程间的同步控制,解决资源的竞争问题。编辑

分布式事务

1. 错过了啥?

在分布式系统中,事务的处理比传统单体应用复杂,主要是因为涉及到多服务间的数据一致性。常见的解决方案有:

  • 两阶段提交(2PC):一种保证事务一致性的协议,但它存在阻塞问题。
  • 三阶段提交(3PC):比2PC更加强化了事务的可靠性,避免了阻塞问题。
  • TCC(Try Confirm Cancel) :通过预留、确认和取消三个步骤来处理分布式事务。编辑

Zookeeper

1. 分布式锁的实现

分布式锁通常通过Zookeeper来实现。Zookeeper是一个分布式协调服务,可以通过它来实现分布式环境中的锁机制。

  • 使用Zookeeper实现分布式锁
    1. 客户端通过Zookeeper创建一个临时顺序节点。
    2. 获取锁的客户端会根据节点的顺序号判断是否是最小的节点(即获得锁)。
    3. 如果当前节点的顺序号最小,客户端获取锁;如果不是最小,客户端会监听比自己顺序号小的节点,等待锁的释放。编辑

MyBatis

1. MyBatis比单纯JDBC好在哪里?

MyBatis相比纯JDBC的优点包括:

  • SQL映射:MyBatis通过XML或注解的方式来映射SQL,使得代码更加简洁,避免了JDBC中SQL与代码的耦合。
  • 缓存机制:MyBatis内置了一级缓存和二级缓存,能够有效提升查询性能。
  • 动态SQL:MyBatis支持动态生成SQL语句,能够根据不同的查询条件动态调整SQL。
  • 易用性:相比JDBC,MyBatis的学习曲线较为平缓,且能够较好地处理数据库操作的复杂性。

2. MyBatis一级和二级缓存

  • 一级缓存:是SqlSession级别的缓存,每次使用同一个SqlSession进行查询时,查询结果会被缓存到一级缓存中,重复查询时直接从缓存中获取数据。
  • 二级缓存:是Mapper级别的缓存,不同SqlSession之间共享,通常存储在内存或磁盘中。

3. #$的区别

  • # :用于防止SQL注入,将参数值转换为安全的SQL格式(即会将值进行预编译,防止SQL注入)。例如:SELECT * FROM users WHERE username = #{username}
  • $ :直接将参数值拼接到SQL语句中,容易引发SQL注入,通常不推荐使用。例如:SELECT * FROM users WHERE username = ${username}

数据结构与算法

1. 两个队列实现栈

使用两个队列来实现栈的功能,可以通过以下方式:

  • 栈的入栈操作:将元素加入第一个队列。
  • 栈的出栈操作:将队列中的元素逐一移动到另一个队列,直到只剩一个元素,那个元素即为栈顶元素。

2. 单例

单例模式确保一个类只有一个实例,并提供一个全局访问点。常见的实现方式有:

  • 饿汉式:在类加载时就创建实例,线程安全,但不灵活。
  • 懒汉式:在需要时才创建实例,使用时可能需要加锁来保证线程安全。
  • 双重检查锁:结合懒汉式和线程安全,减少锁的开销。

3. 链表环

链表环是指链表中的某个节点的next指针指向了链表中的前一个节点,形成一个闭环。检测链表是否有环可以使用"快慢指针法":

  • 快指针每次移动两步,慢指针每次移动一步。如果链表中有环,快慢指针最终会相遇。

4. 怎么实现手机号中间四位用星号表示?

可以通过字符串处理来实现:

python 复制代码
def mask_phone_number(phone):  
    return phone[:3] + '****' + phone[7:]  

这样输入的手机号会返回类似138****1234的格式。


微服务

1. 微服务架构的服务粒度怎么确定,服务怎么通信?

  • 服务粒度 :服务的粒度应该依据业务需求来决定,粒度过大会影响系统的扩展性,粒度过小会增加管理和协调的复杂度。一般来说,按照业务功能划分服务,每个服务拥有自己的数据库和存储逻辑。编辑
  • 服务通信:微服务之间通常使用轻量级的通信协议,如HTTP REST API或消息队列(例如RabbitMQ、Kafka)进行异步通信。RESTful API适用于同步通信,而消息队列适用于解耦和异步处理。

通过对这些常见的面试问题进行深入解析,能够更好地理解开发面试中涉及的知识点。

相关推荐
绝无仅有4 小时前
面试真实经历某商银行大厂计算机网络问题和答案总结
后端·面试·github
IT_陈寒4 小时前
5个Java 21新特性实战技巧,让你的代码性能飙升200%!
前端·人工智能·后端
paishishaba5 小时前
JAVA面试复习笔记(待完善)
java·笔记·后端·面试
Victor3565 小时前
Redis(72)Redis分布式锁的常见使用场景有哪些?
后端
Victor3566 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
后端
程序员爱钓鱼8 小时前
Python编程实战 · 基础入门篇 | Python的缩进与代码块
后端·python
earthzhang202110 小时前
第3讲:Go垃圾回收机制与性能优化
开发语言·jvm·数据结构·后端·性能优化·golang
thinktik13 小时前
AWS EKS 集成Load Balancer Controller 对外暴露互联网可访问API [AWS 中国宁夏区]
后端·kubernetes·aws
追逐时光者13 小时前
将 EasySQLite 解决方案文件格式从 .sln 升级为更简洁的 .slnx
后端·.net