在电商平台如某多多的系统架构中,操作系统、分布式事务、消息队列和 Linux 内存回收等技术是保证系统高效运行的重要组成部分。本文将围绕这些技术知识点进行总结,并回答相关的面试问题。
操作系统相关问题
1. 线程和进程的区别
编辑
-
进程 :
-
是操作系统进行资源分配和调度的基本单位。
编辑 -
每个进程都有自己独立的地址空间、代码、数据和系统资源(如文件描述符)。
编辑 -
进程间的通信通常需要通过 IPC(进程间通信)机制(如管道、共享内存、消息队列)进行。
-
-
线程 :
-
是进程中的执行单元,多个线程共享同一进程的地址空间、堆栈等资源。
-
线程间的通信比进程间通信更高效,因为它们共享同一内存空间,但也更容易引发竞争条件和死锁。
-
线程通常用于并发执行,可以提高程序的并行度,特别适用于 CPU 密集型或 IO 密集型任务。
-
区别:
- 资源隔离 :进程之间完全独立,线程之间共享同一进程的内存空间。
编辑 - 创建和销毁:进程的创建和销毁比线程更加耗费资源,因为进程需要分配独立的资源;线程的创建和销毁开销较小。
- 通信方式:进程间通信较为复杂,需要通过 IPC;线程间通信相对简单,可以直接通过共享内存或其他同步机制进行。
2. 分段和分页内存管理
编辑
- 分段管理 :将程序的内存划分为不同大小的段,如代码段、数据段、堆栈段等,每个段都有自己的基地址和长度。分段提供了更为灵活的内存管理,适用于动态变化的程序。
- 分页管理:将物理内存和逻辑内存都分成固定大小的块(页和页框)。分页消除了内存碎片问题,使得内存的管理更加高效。每个进程拥有独立的页表来映射虚拟地址到物理地址。
区别:
- 灵活性:分段管理可以处理不同大小的内存块,而分页管理则使用固定大小的内存块。
- 内存碎片:分页管理可以避免外部碎片,但可能存在内部碎片;分段管理则可以灵活地避免内部碎片,但可能存在外部碎片。
3. 用户态和内核态的区别
- 用户态 :指程序运行时,用户应用程序执行的状态。在用户态下,程序无法直接访问硬件资源和核心操作系统功能,必须通过系统调用来请求内核服务。
- 内核态:指操作系统核心部分执行的状态,具有完全的控制权限,可以直接访问硬件资源和管理系统资源。内核态运行时,操作系统可以执行涉及硬件操作和资源管理的任务。
区别:
- 权限:用户态权限有限,内核态权限更高,可以直接操作硬件资源。
- 切换成本:从用户态切换到内核态需要进行上下文切换,开销较大。
分布式事务
1. 如何设计一个二阶段提交(2PC)协议
二阶段提交(2PC)协议用于解决分布式系统中的事务一致性问题。它的基本流程包括两个阶段:
-
阶段一:准备阶段(Prepare Phase) :
-
主协调者(通常是事务协调器)向所有参与者发送提交请求,并等待各个参与者的响应。
-
每个参与者判断是否能够提交事务(如检查本地事务的执行情况、锁资源等),然后发送 "准备提交" 或 "拒绝" 给协调者。
-
-
阶段二:提交阶段(Commit Phase) :
-
如果所有参与者都返回 "准备提交",协调者会发送 "提交" 命令,参与者正式提交事务。
-
如果任何一个参与者返回 "拒绝" 或者在等待过程中出现故障,协调者会发送 "回滚" 命令,所有参与者回滚事务。
-
设计关键点:
- 一致性:必须确保所有参与者一致同意提交或回滚,保证事务的原子性。
- 容错:必须考虑网络故障、节点崩溃等异常情况,确保在系统恢复后能够继续完成事务。
消息队列(MQ)
1. 消息队列有什么好处
消息队列(MQ)是用于不同系统或应用之间传递消息的一种异步通信方式。其主要优点包括:
- 解耦:生产者和消费者不需要直接通信,通过消息队列进行中介,系统之间松耦合,便于扩展和维护。
- 异步处理:消费者可以异步消费消息,生产者不需要等待消费者的处理结果,从而提高系统的吞吐量。
- 流量削峰:在高并发情况下,消息队列可以平滑流量波动,防止系统过载。
- 可靠性保障:通过消息持久化机制,确保消息在网络异常或系统崩溃时不丢失。
Linux 内存回收策略
1. Linux 内存回收策略
Linux 使用的内存回收策略包括:
-
虚拟内存管理 :Linux 会将一部分内存标记为虚拟内存,并将不常用的数据或页面交换到磁盘(交换空间),以释放物理内存。
-
页面回收(Page Reclaiming):当系统内存紧张时,Linux 会选择回收不活跃的页面,如清理文件缓存、回收未使用的内存页等。
-
内存压缩(Zswap、Zram):通过内存压缩技术,将数据压缩存储在内存中,从而延缓或减少磁盘交换的需要。
-
OOM Killer:当系统内存不足时,内核会通过 OOM(Out Of Memory)杀手结束某些进程以释放内存,通常会优先杀死占用内存较大的进程。
总结
本文回答了在某多多面试中可能遇到的操作系统、分布式事务、消息队列以及 Linux 内存回收策略的相关问题。掌握这些技术原理不仅有助于通过面试,还能为后续的工作奠定坚实的基础。