25年10月虾皮 Java开发 实习 二面

#JAVA##JAVA面经##JAVA内推#

1. 详细说说父子进程,包括内存地址、共享页表、写时拷贝、子进程回收

思路

  • 内存地址:父子进程虚拟地址独立,物理地址初始共享。
  • 共享页表:fork后内核为子进程创建页表,初始与父进程指向同一物理页。
  • 写时拷贝(COW):仅当任一进程写数据时,内核才复制物理页,保证数据隔离。
  • 子进程回收:父进程通过wait/waitpid回收,避免僵尸进程;父进程先退出则子进程归init进程托管。

回答示例

创建子进程后,父子进程拥有独立的虚拟地址空间,但初始页表指向相同的物理内存页,实现内存共享。写时拷贝机制下,只有当某一进程修改数据时,内核才会复制对应的物理页,避免冗余拷贝。子进程退出后,父进程需通过wait或waitpid系统调用回收其资源,否则子进程会变成僵尸进程;若父进程先退出,子进程会被init进程接管并最终回收。

2. 分布式锁相关:set nx ex、watch dog、redlock

思路

  • set nx ex:Redis分布式锁核心指令,nx保证互斥(仅不存在时设置),ex设置过期时间避免死锁。
  • watch dog:分布式锁续命机制,持有锁的进程在过期前自动续期,防止业务未完成锁释放。
  • redlock:Redis官方分布式锁方案,多实例部署下,需在半数以上实例获取锁才算成功,解决单实例宕机问题。

回答示例

Redis分布式锁常用set nx ex指令,nx确保同一时间只有一个客户端获取锁,ex给锁设置过期时间防止死锁;watch dog是锁的续命机制,比如Redisson中的看门狗线程,会在锁即将过期但业务未完成时自动延长过期时间;redlock则是针对Redis单实例故障的优化方案,需在N/2+1个Redis实例上成功获取锁,才认为锁获取成功,提升分布式锁的可靠性。

3. 分布式锁的可重入性如何实现

思路

  • 核心:记录持有锁的客户端标识+重入次数。
  • 实现方式:用Hash结构存储,key为锁名,field为客户端ID,value为重入次数;获取锁时判断是否是当前客户端,是则次数+1,释放时次数-1,次数为0时删除锁。

回答示例

实现分布式锁可重入性需记录锁的归属和重入次数,我会用Redis的Hash结构:锁的key为业务标识,field存客户端唯一ID(如IP+线程ID),value存重入次数。第一次获取锁时nx设置Hash并初始化次数为1;再次获取时判断field匹配则次数+1;释放锁时次数-1,只有次数归0时才真正删除锁,实现可重入。

4. 先执行set nx再执行set ex会存在什么问题

思路

  • 原子性问题:nx和ex分两次执行,若nx成功后

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务