版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频计算机八股面试题及答案进程和线程的本质区别是什么?在微服务架构中如何选择线程池参数?进程是操作系统资源分配的基本单位,包含独立的内存空间、文件描述符等资源;线程是CPU调度的基本单位,共享进程内存空间。本质区别在于资源隔离性:进程间通过IPC通信,线程通过共享内存通信。微服务架构中线程池参数选择需结合业务类型:CPU密集型任务(如数据计算)建议线程数=CPU核心数+1,避免上下文切换;IO密集型任务(如数据库查询)建议线程数=CPU核心数×(1+IO耗时/CPU耗时),通过增大线程数覆盖IO等待时间。需注意最大线程数应限制在JVM栈内存允许范围内(默认1MB/线程),避免OOM;队列选择上,CPU密集型用有界队列(如ArrayBlockingQueue)防止任务堆积,IO密集型可用无界队列(如LinkedBlockingQueue)但需监控队列长度。死锁的四大必要条件是什么?实际开发中如何检测和解除分布式死锁?必要条件:互斥(资源独占)、请求与保持(持有资源并请求其他)、不可抢占(资源不可强行剥夺)、循环等待(形成资源请求环)。分布式死锁检测可通过两种方式:1.超时机制:设置锁的最大持有时间(如Redis的expire),超时自动释放;2.全局事务追踪:通过分布式链路追踪系统(如Jaeger)记录各服务的锁获取顺序,构建资源分配图,定期检查是否存在环。解除方法包括:终止部分进程(微服务中可重启实例)、抢占资源(分布式锁支持锁续期时,强制终止续期线程)、调整资源分配顺序(统一按资源ID递增顺序申请锁)。例如在电商秒杀场景,通过Redis分布式锁时,若检测到某个服务长时间持有锁但无后续操作,可通过Lua脚本强制删除锁。虚拟内存的核心作用是什么?Linux下如何通过/proc文件系统查看进程虚拟内存使用?虚拟内存通过地址空间抽象,将物理内存与外存(磁盘)结合,允许进程使用比物理内存更大的地址空间。核心作用:1.内存隔离(进程间地址空间独立);2.内存复用(共享库只需加载一次);3.内存扩展(外存作为物理内存的补充)。在Linux中,查看进程虚拟内存可通过/proc/[pid]/maps文件,该文件记录进程所有内存映射区域(代码段、数据段、堆、栈、共享库等)的起始地址、权限、映射文件等信息。例如执行cat/proc/1234/maps可查看PID为1234进程的虚拟内存分布;配合pmap-x1234命令可更直观展示各区域的虚拟内存大小(VSZ)和物理内存占用(RSS)。IO多路复用的三种实现(select/poll/epoll)的核心差异是什么?在高并发API网关中为何选择epoll?select:使用位图存储文件描述符(FD),支持FD数量受限于内核参数(默认1024);每次调用需将FD集合从用户态拷贝到内核态;通过轮询方式检查就绪FD,时间复杂度O(n)。poll:使用链表存储FD,无数量限制(受限于系统最大FD数);同样需用户态/内核态拷贝;轮询检查O(n)。epoll:通过epoll_ctl注册FD,内核维护红黑树存储FD;使用事件驱动(回调函数),就绪FD存储在就绪列表中;epoll_wait返回时直接获取就绪FD,时间复杂度O(1)。高并发API网关(如Nginx)选择epoll的原因:1.支持百万级FD(受限于系统ulimit-n);2.无用户态/内核态拷贝(通过mmap共享内存);3.仅返回就绪FD,避免无效遍历。实际应用中,epoll的ET(边缘触发)模式比LT(水平触发)更高效,因为只在FD状态变化时通知,减少重复处理。HTTP/3相比HTTP/2的核心改进有哪些?QUIC协议如何解决TCP队头阻塞问题?HTTP/3基于QUIC(QuickUDPInternetConnections)协议,主要改进:1.传输层从TCP改为UDP,减少连接建立延迟(QUIC握手仅需1RTT,TLS1.3+TCP需2RTT);2.解决TCP队头阻塞:TCP中若某数据包丢失,后续数据包需等待重传,导致整条连接阻塞;QUIC将数据流(Stream)独立编号,单个Stream的丢包不影响其他Stream的数据传输;3.连接迁移:QUIC通过连接ID标识会话,终端IP/端口变化时(如Wi-Fi切4G),无需重新建立连接。QUIC解决队头阻塞的关键是将数据分属不同Stream,每个Stream有独立的序列号,丢包时仅重传该Stream的丢失包,其他Stream的数据可正常处理。例如视频直播场景中,音频流和视频流属于不同Stream,视频流的丢包不会阻塞音频流的播放。TCP拥塞控制的四个阶段是什么?BBR算法相比CUBIC的优势在哪里?四个阶段:慢启动(SlowStart,拥塞窗口cwnd指数增长)、拥塞避免(CongestionAvoidance,cwnd线性增长)、快速重传(FastRetransmit,收到3个重复ACK后重传丢失包)、快速恢复(FastRecovery,cwnd减半后进入拥塞避免)。BBR(BottleneckBandwidthandRTT)相比CUBIC的优势:1.基于带宽延迟乘积(BDP)建模,直接测量网络瓶颈带宽和最小RTT,而非依赖丢包事件;2.适用于高带宽长延迟(HTLL)网络(如跨洋链路),CUBIC在丢包率低时仍可能因误判拥塞降低传输速率;3.减少缓冲区膨胀(Bufferbloat),通过控制发送速率匹配瓶颈带宽,避免路由器缓冲区堆积。例如在5G网络中,BBR能更高效利用动态变化的带宽,减少视频传输的卡顿。HTTPS握手过程中,客户端如何验证服务器证书的合法性?中间人攻击如何被防范?握手过程(以TLS1.3为例):1.客户端发送ClientHello(支持的TLS版本、密码套件、随机数);2.服务器返回ServerHello(选定的密码套件、随机数)、服务器证书链(包含公钥)、ServerHelloDone;3.客户端验证证书:检查证书是否由信任的CA签发(通过本地CA根证书链验证)、证书是否过期、证书中的域名是否与目标域名匹配(如CN或SAN字段);4.客户端提供预主密钥(Pre-MasterSecret),用服务器公钥加密后发送;5.双方用Pre-MasterSecret和随机数提供会话密钥(MasterSecret);6.客户端发送Finished消息(用会话密钥加密),服务器验证后发送自己的Finished消息,握手完成。防范中间人攻击的关键:1.证书链验证确保公钥来自合法服务器(中间人无法伪造CA签名的证书);2.会话密钥仅由客户端提供并加密传输(中间人无服务器私钥,无法解密Pre-MasterSecret);3.TLS1.3支持0-RTT重连,通过早期数据(EarlyData)加密防止重放攻击。MySQL中B+树索引和LSM树索引的适用场景有何不同?为什么InnoDB选择B+树而TiDB选择LSM树?B+树所有数据存储在叶子节点,非叶子节点仅存索引键,支持范围查询(通过叶子节点链表),写操作(插入/删除)需分裂/合并节点,随机写性能一般。LSM树(Log-StructuredMerge-Tree)将写操作先写入内存MemTable(跳表结构),达到阈值后刷盘为SSTable(排序字符串表),读操作需遍历MemTable和多层SSTable(通过布隆过滤器快速判断是否存在),适合高写入场景但读性能受层级数影响。InnoDB选择B+树的原因:OLTP场景中,点查询和短范围查询占比高,B+树的O(logn)查询性能稳定;事务需要索引的强一致性(B+树支持行锁,LSM树的SSTable合并可能影响事务隔离)。TiDB(分布式数据库)选择LSM树的原因:分布式场景下,高并发写(如日志、监控数据)需要顺序写盘(LSM树的SSTable刷盘是顺序IO,性能远高于B+树的随机写);通过分层合并(Compaction)优化空间,适合大数据量存储。事务的ACID特性如何实现?MySQL可重复读隔离级别下如何解决幻读?ACID实现:原子性(Atomicity)通过undolog实现,事务回滚时撤销已执行操作;一致性(Consistency)由业务逻辑和约束(如唯一索引、外键)保证;隔离性(Isolation)通过锁(行锁、间隙锁)和MVCC(多版本并发控制)实现;持久性(Durability)通过redolog(预写日志)实现,事务提交时先写redolog到磁盘。MySQLInnoDB在可重复读(REPEATABLEREAD)隔离级别下,通过MVCC的一致性读(快照读)解决幻读:查询时读取事务开始时的历史版本(通过undolog提供快照),后续插入的新记录不会出现在当前事务的快照中。对于当前读(如SELECT...FORUPDATE),通过间隙锁(GapLock)锁定记录之间的间隙,防止其他事务插入新记录,从而避免幻读。例如,事务A查询id=10的记录不存在并插入,若未加间隙锁,事务B可能同时插入id=10的记录导致幻读;间隙锁会锁定(5,15)的间隙,阻止事务B插入。分布式事务中2PC、3PC和TCC的优缺点及适用场景?2PC(两阶段提交):阶段1(准备)协调者询问所有参与者是否就绪,参与者执行事务并写undo/redolog;阶段2(提交/回滚)协调者根据准备结果发送提交或回滚指令。优点:强一致性;缺点:单点故障(协调者宕机导致阻塞)、长事务锁定资源(准备阶段到提交阶段资源被锁定)。适用场景:数据库强一致要求(如银行转账)。3PC(三阶段提交):增加预准备(CanCommit)阶段,参与者反馈是否可执行事务;准备阶段(PreCommit)参与者执行事务但不提交;提交阶段(DoCommit)正式提交。优点:减少阻塞(引入超时机制,参与者超时后自动提交);缺点:仍存在一致性风险(网络分区时可能部分提交)。适用场景:网络较可靠的分布式系统。TCC(Try-Confirm-Cancel):Try阶段预留资源(如冻结账户余额),Confirm阶段提交资源(扣除冻结余额),Cancel阶段释放资源(解冻余额)。优点:无长时间锁(资源在Try阶段预留,Confirm/Cancel快速完成);缺点:业务侵入性强(需实现三个接口)、补偿操作复杂(Cancel需幂等)。适用场景:微服务架构中跨服务事务(如电商下单-扣库存-支付)。例如,用户下单时,订单服务Try提供订单,库存服务Try冻结库存,支付服务Try冻结余额;所有Try成功后执行Confirm,否则执行Cancel解冻。红黑树和AVL树的核心区别是什么?JavaTreeMap为何选择红黑树而不是AVL树?红黑树是近似平衡的二叉搜索树,通过颜色标记(红/黑)和5条规则(根黑、叶黑、红节点子节点黑、路径黑节点数相同)保证最长路径不超过最短路径的2倍。AVL树是严格平衡的二叉搜索树,每个节点的左右子树高度差(平衡因子)不超过1。核心区别:红黑树的平衡是“近似”的(旋转次数少),AVL树是“严格”的(旋转次数多)。JavaTreeMap选择红黑树的原因:TreeMap的主要操作(插入、删除、查找)的时间复杂度均为O(logn),红黑树在插入/删除时的旋转次数更少(平均1.5次旋转vsAVL树的2次以上),更适合频繁写操作的场景。例如,插入一个节点时,AVL树可能需要从插入点向上回溯到根节点调整平衡,而红黑树通过颜色翻转和有限旋转即可恢复平衡,整体性能更优。TopK问题的常见解法有哪些?在海量数据(10亿条)下如何优化?常见解法:1.快速选择(QuickSelect):基于快速排序的分区思想,平均时间复杂度O(n),最坏O(n²);2.大顶堆/小顶堆:维护大小为K的小顶堆(找最大的K个数),遍历所有元素,若当前元素大于堆顶则替换并调整堆,时间复杂度O(nlogK);3.分治法:将数据分块处理,每块找TopK,最后合并所有块的TopK再找最终TopK。海量数据下优化:1.内存限制:若数据无法全部加载到内存,使用外部排序(如归并排序)或分块读取,每块用堆处理后保存中间结果;2.并行计算:利用多线程或分布式框架(如MapReduce),Map阶段各节点处理子集找TopK,Reduce阶段合并所有TopK找最终结果;3.布隆过滤器:先过滤重复元素(若允许近似),减少数据量;4.概率算法:如HyperLogLog估计数据量,但仅适用于统计场景。例如处理10亿条URL找访问量Top100,可用哈希分桶(按URL哈希值分到1000个文件),每个文件用小顶堆找Top100,最后合并1000个Top100找最终Top100。LRU缓存的实现原理是什么?如何用JavaLinkedHashMap实现线程安全的LRU?LRU(LeastRecentlyUsed)缓存通过记录数据的访问时间,当缓存满时淘汰最久未使用的数据。核心数据结构:双向链表(维护访问顺序)+哈希表(O(1)时间查找节点)。JavaLinkedHashMap默认按插入顺序排列,通过构造函数LinkedHashMap(intinitialCapacity,floatloadFactor,booleanaccessOrder)将accessOrder设为true,可按访问顺序排列(get/put操作会调整节点到链表尾部)。线程安全实现:1.使用Collections.synchronizedMap包装LinkedHashMap,但会导致全表锁,性能差;2.继承LinkedHashMap并覆盖removeEldestEntry方法(返回true时移除最旧节点),外层用ReentrantLock保证线程安全。示例代码:```javaclassThreadSafeLRUCache<K,V>extendsLinkedHashMap<K,V>{privatefinalintcapacity;privatefinalReentrantLocklock=newReentrantLock();publicThreadSafeLRUCache(intcapacity){super(capacity,0.75f,true);this.capacity=capacity;}@OverrideprotectedbooleanremoveEldestEntry(Map.Entry<K,V>eldest){returnsize()>capacity;}@OverridepublicVget(Objectkey){lock.lock();try{returnsuper.get(key);}finally{lock.unlock();}}@OverridepublicVput(Kkey,Vvalue){lock.lock();try{returnsuper.put(key,value);}finally{lock.unlock();}}}```Java中AQS(AbstractQueuedSynchronizer)的核心设计思想是什么?ReentrantLock如何利用AQS实现可重入?AQS通过维护一个volatileintstate(同步状态)和一个CLH(Craig-Landin-Hagersten)队列(等待线程的双向链表),提供独占式(如ReentrantLock)和共享式(如CountDownLatch)同步。核心思想:将同步状态的管理抽象为state的原子操作(通过CAS),等待线程的阻塞/唤醒通过LockSupport.park/unpark实现,子类只需重写tryAcquire/tryRelease(独占)或tryAcquireShared/tryReleaseShared(共享)方法。ReentrantLock实现可重入:1.独占锁模式(非公平/公平);2.state表示锁的重入次数(初始0,获取锁时state+1,释放时state-1,state=0时完全释放);3.线程获取锁时检查当前线程是否是持有锁的线程(通过exclusiveOwnerThread变量),若是则state+1(可重入),否则加入等待队列。例如,线程A第一次获取锁时state=1,再次获取时state=2,释放两次后state=0,其他线程可竞争锁。Python中GIL(全局解释器锁)的本质是什么?如何在多线程中利用多核CPU?GIL是Python解释器(如CPython)为保证线程安全而设计的互斥锁,同一时间仅允许一个线程执行Python字节码。本质是解决共享数据的线程安全问题(如引用计数的原子性操作),但导致多线程无法利用多核CPU(CPU密集型任务仍串行执行)。利用多核的方法:1.多进程(multiprocessing模块):每个进程有独立的GIL,可利用多核;2.C扩展:在C代码中释放GIL(通过Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS宏),允许其他线程执行;3.使用异步编程(asyncio):通过事件循环处理IO密集型任务,避免线程阻塞;4.选择其他解释器(如PyPy、Jython),但生态可能不完善。例如,计算密集型任务(如矩阵运算)应使用多进程,而IO密集型任务(如网络请求)可使用多线程(IO等待时GIL会释放)。单例模式的线程安全实现有哪些方式?双重检查锁定(DCL)为何需要volatile修饰变量?线程安全实现方式:1.饿汉式(静态变量初始化):类加载时创建实例,天然线程安全(类加载由JVM保证线程安全);2.懒汉式+同步方法(synchronized):方法上加锁,性能差(每次获取实例都加锁);3.静态内部类(Holder模式):通过静态内部类的类加载机制,调用getInstance时加载Holder类并创建实例,线程安全且懒加载;4.双重检查锁定(DCL):同步代码块内二次检查实例是否为空,减少锁竞争。DCL需要volatile的原因:JVM存在指令重排序,实例创建(newSingleton())可分为三步:分配内存、初始化对象、将内存地址赋给实例变量。若重排序为分配内存→赋地址→初始化,其他线程可能获取到未初始化的实例(地址非空但对象未完成构造)。volatile修饰实例变量可禁止指令重排序,保证可见性(修改后立即刷新到主内存)。示例代码:```javapublicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次检查,避免不必要的锁synchronized(Singleton.class){if(instance==null){//第二次检查,防止多线程同时通过第一次检查instance=newSingleton();}}}returninstance;}}```动态规划解决0-1背包问题的状态转移方程是什么?如何优化空间复杂度?0-1背包问题:有n个物品,重量w[i],价值v[i],背包容量C,求能装的最大价值。状态定义:dp[i][j]表示前i个物品,容量为j的背包的最大价值。状态转移方程:对于第i个物品,选或不选:不选:dp[i][j]=dp[i-1][j]选:dp[i][j]=dp[i-1][jw[i]]+v[i](j≥w[i])取两者最大值,即dp[i][j]=max(dp[i-1][j],dp[i-1][jw[i]]+v[i])。空间优化:观察状态转移方程,每个i的状态仅依赖i-1的状态,可将二维数组压缩为一维数组。优化后状态定义:dp[j]表示容量为j的背包的最大价值。倒序遍历j(从C到w[i]),避免覆盖i-1的状态:```javaint[]dp=newint[C+1];for(inti=0;i<n;i++){for(intj=C;j>=w[i];j--){dp[j]=Math.max(dp[j],dp[jw[i]]+v[i]);}}returndp[C];```TCP和UDP的核心区别是什么?在实时音视频传输中为何选择UDP?TCP是面向连接的、可靠的、面向字节流的传输协议,通过序列号、确认应答、重传机制保证数据可靠;UDP是无连接的、不可靠的、面向数据报的传输协议,无重传和流量控制。实时音视频传输选择UDP的原因:1.低延迟:无需三次握手建立连接,适合实时性要求高的场景(如视频通话);2.避免队头阻塞:TCP丢包重传会导致后续数据延迟,UDP允许丢包(可通过前向纠错FEC或应用层重传少量关键包);3.协议定制灵活:可在应用层实现自定义的拥塞控制(如WebRTC的GCC算法),比TCP更适应动态网络环境。例如,视频会议中偶尔丢失几帧画面影响较小,但延迟增加会导致卡顿,UDP更适合这种场景。JVM内存模型中堆和栈的区别是什么?OOM可能发生在哪些区域?堆(Heap):所有线程共享,存储对象实例和数组,是GC的主要区域(分新生代Eden/Survivor、老年代);栈(JavaVirtualMachineStacks):线程私有,每个方法调用创建栈帧(存储局部变量表、操作数栈、动态链接、方法出口),生命周期与线程一致。核心区别:堆是共享的、存储对象;栈是私有的、存储方法调用信息。OOM可能发生的区域:1.堆(JavaHeapSpace):对象创建过多且未被回收(如内存泄漏);2.方法区/元空间(Metaspace):类信息、常量、静态变量过多(如动态提供大量类的框架);3.栈(StackOverflowError):方法递归深度过大(默认栈大小1MB,递归10000层可能溢出);4.直接内存(DirectMemory):通过Unsafe或ByteBuffer.allocateDirect分配的堆外内存,超出-XX:MaxDirectMemorySize限制。Kafka的分区(Partition)和副本(Replica)机制如何保证高可用和高吞吐量?分区机制:将主题(Topic)划分为多个分区,每个分区是一个有序的日志文件,数据按offset顺序写入。分区分布在不同Broker上,支持并行读写(消费者组的每个消费者订阅一个分区),提升吞吐量。副本机制:每个分区有多个副本(Leader和Follower),Leader处理读写请求,Follower异步复制Leader的数据。当Leader宕机时,ISR(In-SyncReplicas,与Leader保持同步的Follower集合)中的一个Follower会被选举为新Leader,保证高可用。高吞吐量实现:1.分区并行读写(多线程处理不同分区);2.顺序写盘(分区日志是追加写,磁盘顺序IO效率高);3.零拷贝(通过sendfile将数据直接从磁盘到网卡,减少用户态/内核态拷贝)。高可用实现:1.ISR保证副本同步进度;2.Leader选举(ZooKeeper或KRaft模式)快速切换;3.数据持久化(所有消息写入磁盘)。Python装饰器的作用是什么?如何实现一个带参数的装饰器?装饰器是用于修改函数行为的可调用对象(函数、类),本质是闭包,在不修改原函数代码的情况下增加额外功能(如日志、权限校验、性能监控)。带参数的装饰器需要三层函数:最外层函数接收装饰器参数,中间层接收被装饰函数,最内层是包装函数。示例(记录函数执行时间,支持自定义日志前缀):```pythonimporttimefromfunctoolsimportwrapsdeftimer(prefix="耗时"):defdecorator(func):@wraps(func)保留原函数元信息defwrapper(args,kwargs):start=time.time()result=func(args,kwargs)end=time.time()pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 达州四川达州宣汉县乡镇事业单位面向服务期满“三支一扶”志愿者招聘笔试历年参考题库附带答案详解
- 苏州2025年江苏苏州张家港市卫生健康系统事业单位招聘卫技人员103人笔试历年参考题库附带答案详解
- 眉山2025年四川眉山市公安局高新区(甘眉园区)分局招聘警务辅助人员21人笔试历年参考题库附带答案详解
- 济宁2025年山东济宁邹城市“杏林归巢”人才回引(29人)笔试历年参考题库附带答案详解
- 江西2025年江西省荣军优抚医院招聘合同制护理人员笔试历年参考题库附带答案详解
- 昆明云南昆明市呈贡区应急管理局招聘公益性岗位工作人员笔试历年参考题库附带答案详解
- 怒江2025年云南怒江泸水市医学专业大学生招聘24人笔试历年参考题库附带答案详解
- 广东2025年广东省立中山图书馆招聘笔试历年参考题库附带答案详解
- 安顺2025年贵州安顺市普定县中医医院医共体定南分院招聘笔试历年参考题库附带答案详解
- 南充2025年四川南充市第十五中学校考调教师15人笔试历年参考题库附带答案详解
- 2024-2025学年度高一英语下学期期中试卷(北师大版含答案)
- 银行从业者观《榜样》心得体会
- 农村年底活动方案
- 2024届山东省威海市高三二模数学试题(解析版)
- 设备管理奖罚管理制度
- LINE6效果器HD300中文说明书
- 2025年航运行业安全生产费用提取和使用计划
- 纳米纤维凝胶隔热材料的应用研究进展
- 蟹苗买卖合同协议
- 2025年社区养老服务补贴政策及申领方法
- 胸外科手术围手术期的护理
评论
0/150
提交评论