七进七出,终获阿里32k*16offer,这就是我悲惨的面试经历~

本文作者分享了其三次面试阿里的经历,从面试准备、面试过程到最终获得32K*16的offer。在面试中涉及了Java、Redis、Spring等多个技术领域的深度问题,如线程安全、数据库索引、JVM内存管理等。此外,作者还强调了面试中的应变能力、简历优化以及对未来的职业规划和学习规划的重要性。

写在片头:声明,勿杠

首先简单说一下,这三次面试阿里并不是一次性去面的,实际上第一次面试时候还在大四,找的实习岗,不太清楚是什么部门,别问我为什么还记得面试题,有记录和复盘的习惯,再问就是杠。

个人背景不详细多说,学历双非本科,不是应届生,工作年限不长,技术不是大牛,但也非小白,面经分享是想给正面试的同行一些建议和鼓励,希望能够多多支持。

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

注意:下文内容中会提到一些简历模板、学习笔记、学习脑图、Java电子书籍和视频等,需要的添加助手vx:bjmsb10 凭截图即可免费领取。

One:三顾茅庐,七面阿里,拿下32K*16offer

——一顾阿里一面被怼(未知部门)

阿里巴巴未知部门一面(问的问题让我感觉是偏金融的部门,面试官很严肃,现在想想都有些后怕)

  • 自我介绍
  • 开源项目贡献过代码么?(回答没有,很尴尬)
  • 之前在部门做什么?简单介绍一下业务吧,内部有哪些系统,作何交互过程说一下
  • Dubbo踩过哪些坑?分别是怎么解决的?(我答了异常处理时业务异常捕获的问题,自定义了一个异常拦截器)
  • 说下你对线程安全的理解
  • 事务有哪些特性?
  • 怎么理解原子性?
  • 讲一下乐观锁和悲观锁的区别,这两种锁在Java和MySQL分别是怎么实现的?
  • HashMap为什么不是线程安全的?怎么让HashMap变得线程安全?两者的区别是什么?
  • jdk1.8对ConcurrentHashMap做了哪些优化?为什么这样优化?
  • redis主从机制了解么?怎么实现的?
  • 有过GC调优的经历么?(有点虚,答得不是很好)
  • List,Map,Set三个接口存取元素时,各有什么特点?
  • TreeMap和TreeSet在排序时如何比较元素?Collection工具类中的sort()方法如何比较元素?
  • Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行 它们有什么区别?
  • 线程的sleep()方法和yield()方法有什么区别?
  • 当一个线程进入一个对象的synchronized方法A之后 其他线程是否可进入此对象的synchronized方法b?
  • 请说出与线程同步以及线程调度相关的方法
  • synchroized关键字的用法?
  • 启动一个线程是调用run()还是start()方法?
  • 有什么想问的么?

——二顾阿里二面惨败(菜鸟网络)

阿里巴巴菜鸟网络一面:

  • 先来了个自我介绍
  • 然后介绍了自己简历里写到的一个比较熟悉的项目(询问了项目的细节及具体的实现)
  • 接着面试官开始针对项目进行提问:(1)高并发的情况下,Kafka消费到第一条记录,在下沉服务处理好,但由于网络抖动没有正确返回给上层,上层服务再次调用服务,怎么样保证只处理一次请求?(我答了分布式锁,介绍实现)(2)有自己用Redis实现过吗?说说看
  • 介绍一下Redis的zset实现(回答的根据skiplist+hashtable和多级索引的方式实现)
  • 介绍一下B树。(自己拓展开来回答,讲到了B+树的区别,聚簇索引和非聚簇索引,为什么B+树更矮胖,如何确定B树的阶等。)
  • 如果是普通索引,如何查找到对应的数据?
  • hashmap如何扩容的?讲transfer方法和resize方法。为什么容量是2的指数次幂?
  • 介绍一下悲观锁和乐观锁。
  • 当synchronized对指定的方法上锁,一条线程获取锁执行任务时,另一条线程来获取这个方法对应实例的锁时获取失败,会被阻塞。那么当前一条线程执行完任务以后,怎么通知被阻塞的线程可以获得被释放的锁继续执行任务?(感觉回答得比较糟糕,后来复盘的时候反思了下,建议还是从对象头中存储的偏向线程ID、线程持有的锁、锁状态标志以及monitor锁计数器结合回答)
  • 介绍一下线程池(介绍几个参数以及几种常见的线程池,各自的阻塞队列)
  • 几个参数之间的关系?大致说了一下,打断问,如果最大线程数大于核心线程数,且阻塞队列中任务已满,核心线程数创建达到设置的最大值,提交任务的线程被阻塞挂起,请问此时线程池开始创建额外的线程来执行任务,是哪个任务先被执行?队列头的还是队列尾的?
  • 介绍一下jvm内存分区和垃圾回收机制?
  • 如何确定eden区的对象何时进入老年代?当线上监控中心的新生代和老年代哪个区域发生垃圾回收,表示此时比较危险?
  • Spring的两大特性?Springboot如何实现自动装配的?aop在项目中用过吗?怎么用的?底层是如何实现的?介绍一下动态代理。jdk原生的动态代理和cglib的动态代理有什么区别?
  • spark和flink的区别?(简历没写flink,但之前有spark任务,就勉强回答了一下)。
  • 有没有发生数据倾斜的情况?如何解决的?怎么观察spark任务的执行情况?
  • 有了解过apollo吗?
  • 了解CAP原则吗,介绍一下?
  • 你有什么要问我的吗?

阿里巴巴菜鸟网络二面:

  • 自我介绍,这次着重介绍自己的项目经历和项目总结。
  • 介绍项目,我刚说第一个就被面试官打断了,感觉要开始怼我,直接问有没有更亮点的项目。然后我介绍了另一个比较难的项目,讲了一些业务背景以及使用到的技术栈,不知道为什么面试官没有拓展开继续问下去了。
  • 网络协议有哪些?
  • 讲讲ThreadLocal的作用,是否线程安全?
  • 进程间的通信
  • TreeMap讲解,里面有什么属性,entry里有什么属性?
  • Java里有哪些是不需要加锁的同步方法?
  • 行锁和表锁的区别、场景
  • 组合索引的使用,eg. (a, b, c)索引,where a=x;where b=x;where a=x and b=x;哪个能使用索引?
  • ArrayList和linkedlist的区别?
  • 有哪些集合类是线程安全的?
  • 算法:(1)排好序的数组,找2个数的和为M的所有组合;(2)大数据下,找出出现频率topK的ip
  • 上家公司的研发部门有哪些组?大致的工作内容是什么?一个组多少人?你在什么组?负责什么?
  • 离开上家公司后,在看什么书?学习什么技术?(回答在研究Dubbo和MySQL,还看了一些底层实现的东西)
  • 截止目前,你自己感觉面试表现怎么样?
  • 你有没有要问我的?

——三顾阿里四面拿offer(一淘事业部)

阿里巴巴一淘事业部一面:

  • 按照自我介绍,项目介绍
  • 你们每天这么大的数据量,都是保存在关系型数据库中吗?
  • 那你们有没有对查询做一些优化呢?
  • 能说说为什么B+树相对于B树在查询上会更加优胜吗?
  • 除了上面这个范围查询,你还能说出其他的一些区别吗?
  • 刚刚我们聊到B+ Tree,那你知道B+Tree的叶子节点都可以存哪些东西吗?
  • 聚簇索引和非聚簇索引,在查询数据的时候有区别吗?
  • 刚刚你提到主键索引查询只会查一次,而非主键索引需要回表查询多次。是所有情况都是这样的吗?非主键索引一定会查询多次吗?
  • 在创建索引的时候你都会考虑哪些因素呢?有用过联合索引吗?
  • 在创建联合索引的时候,需要做联合索引多个字段之间顺序你们是如何选择的呢?
  • 知道在MySQL 5.6中,对索引做了哪些优化吗?
  • 你们创建那么多索引,到底有没有生效,或者说你们的SQL语句有没有使用索引查询你们有统计过吗?
  • 那排查的时候,有什么手段可以知道有没有走索引查询呢?
  • 那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?
  • 你们线上数据的事务隔离级别是什么?
  • 手撕代码:链表内指定区间反转

阿里巴巴一淘事业部第二面:

  • 直接上来就手撕代码:重建二叉树
  • JVM:类加载机制,沙箱安全
  • 问到运行时数据区,我答漏了一个程序计数器,然后面试官就接着问到了程序计数器。
  • 问可达性分析,什么样的对象可以作为GcRoot、加载的时候把这些对象提前找好用的OopMap
  • 新生代几次对象几次到老年代?
  • 有没有可能直接就把刚new出来的对象放在老年代?(第一次碰到这个问题,有些慌,我答的有可能,毕竟有些垃圾回收器会有一个空间分配担保策略)
  • 多线程:volatile,CAS,总线嗅探,CPU缓存一致性协议
  • 讲一讲ReentrantLock、ThreadLocal、Lock和Synchronized的区别。
  • CountDownLatch,ABC三个线程怎么去保证顺序执行?
  • 数据库优化:B+树,Hash索引,最左前缀,索引优化分析,一条龙服务,都问了一下。
  • Redis:一来就是分布式锁,然后别的就没问了,可能也是觉得我回答得还行就跳过了。
  • HashMap:扩容的触发条件是什么?我答只是一个达到负载就扩容了,明显错了。然后面试官纠正说负载和Hash冲突同时发生。
  • 死锁怎么排查?
  • JVM调优怎么做?
  • 问了几个索引题。字符串要写单引号,字符串查询怎么增加查询效率,字符串索引太大了那就截取几个做索引,叫前缀索引。怎么判断一个索引字段选得好不好,看不重复的和总数的比值,越大越好。
  • 假如现在系统里面就是要模糊匹配怎么办?

阿里巴巴一淘事业部第三面

  • 自我介绍,直接问到了技术栈。(这次优化了自我介绍的内容,主要围绕4个点去讲。自报家门、项目经验、技术栈以及求职愿景)
  • 根据项目来提问,技术问题(这部分大致是对你的整体价值观做宏观的把控,包括上进心、责任心、心态以及工作激情等)
  • 在项目中遇到了哪些比较棘手的问题?是如何解决的呢?
  • 目前系统支撑的用户量是多少?假如用户量提升10倍,系统会出现什么样的问题?如何重新设计系统?(这部分就是主要考察你对问题的预见能力、解决能力,考察你对项目、问题解决的整体思路)
  • 使用memcached是一个什么样的原理?
  • 如何存放数据到memcached集群中,介绍一下这个过程。跟进的问题,讲一下一致性哈希算法的实现原理。
  • JVM中堆是如何管理的?JVM的内存回收机制,介绍一下
  • 分布式事务实现方式
  • 热点账户问题(项目中有就会问到)
  • 类加载委托机制
  • 锁的应用
  • 项目架构
  • 最后一问:你觉得你在同事眼中是一个什么样的人?

阿里巴巴一淘事业部第四面(终面:Hr面)

  • 自我介绍
  • 看你工作换得比较勤?你的职业规划是怎么样的?
  • 上一份工作为什么要换?(我回答的是:上份工作让我处于一个舒适区,但我比较喜欢做有挑战的事情,巴拉巴拉)
  • 对阿里了解多少?对电商了解多少?
  • 知道新零售吗?说说看
  • 读过哪些算法方面的书籍?
  • 开放题:数据和商业的关系
  • 薪资待遇
  • 你有什么想问的?

面试题答案:

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

Two:三顾阿里,七轮面试,我的经验复盘

1.阿里面试注意事项

  1. 部门选择:从这三次面试经历来看,部门不同,问到的技术栈都有所区别,所以在面试前最好是根据自己所面试的部门做相应的准备。
  2. 岗位选择:根据岗位介绍能够洞见的关键信息并不多,基于有限的信息,所谓合适通常需满足以下几点:①自身的核心竞争力与所应聘的岗位具有较高的匹配度;②对岗位的工作内容感兴趣,至少不排斥;③岗位所在的业务具有良好的前景;④工作地点可接受。
  3. 应变能力:几轮面试下来,给我最大的一个感受就是一定要培养自己的应变能力。在面试过程中,面试官会根据和你交流的过程中,找一些细节进行提问,一旦应变能力不强,就容易慌了张影响面试发挥,导致失败。

2.面试核心知识点梳理

除了阿里以外,其他七七七八八的互联网公司我也面过不少,不说身经百战,那也面临过一些枪林弹雨的。所以,对于面试会问到什么技术栈,还是做了一些详细的梳理,这些面试梳理还是相当有说服力的。

针对面试核心知识点的梳理,我提供了以下的思维导图和面试核心点PDF:

  • Java面试核心知识导图

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

  • Java面试核心点PDF

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

3.简历优化

不要以为简历只是一个 “敲门砖”而已,事实上,它将伴随你走过应聘流程中的几个关键环节:简历评估,技术面试,HR 面试。

一份优质的简历有助于应聘者展示自己的能力和优势,同时,也可以为面试官提供 “提问指导” (通常面试官会根据简历内容有针对性地提问,有的放矢),因此不断去优化自己的简历是很有必要的。

关于简历,我可以提供我个人的简历模板给你参考:

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

Three:我的未来规划(知足常乐,但不安于现状)

1.职业规划

程序员职业发展一般分三条路:

  • 技术
  • 管理
  • 创业

放到自己身上来看,很显然,没有创业的头脑,那这条路自然是行不通的。那走技术还是走管理?实际上并不需要过早定下来,等到一定年纪自然会开始方向的转移,但无论是走技术还是管理,一开始就要把技术打得扎实,由此,对于技术痴迷的我,先以技术路线为主,管理路线为辅。

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

2.学习规划

说得难听点,程序员不学习,那就是在“等死”,尤其是对于大厂程序员来说,因此接下来的时间要有一个清晰的学习规划。

我的学习规划如下:

  • Step1:按照技术路线图学习

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

  • Step2:啃完这些电子书籍和技术笔记

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

  • Step3:利用碎片时间看视频学习

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

3.业余规划

  • 搞副业:用业余时间搞点副业还是ok的,接点小项目,或写写博客(正在做)。
  • 混论坛:混迹各大程序员知名论坛中,如GitHub等,能够参与开源最好不过。
  • 交朋友:加一些社群,参加线下面基,结识一些同行朋友,或许能碰撞出一些不一样的代码火花?

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

 

写在末尾:一些建议和行业愿景

文章写到这里差不多可以停笔了,但是又好像还想说点什么,或许是对同行的你一些小建议,也或许是对整个行业的一些愿景。

近几年来,铺天盖地而来的“程序员35岁”制造了不少年龄焦虑,试问自己被公司裁员,被社会淘汰真的是年龄导致的吗?大多数还是与自己能力相关,在我接触到的认知里,互联网公司35岁以上的技术经理,技术大牛仍有不少。实际上,无论你是什么行业,能力不过关,都会被淘汰,而避免被淘汰的唯一办法:坚持学习。

所以,最后希望同为代码献身的我们,不负初衷,不畏困难,拥抱发展!

以上文章内容所提及的【Java面试核心点】+【Java电子书+技术笔记】+【学习视频】均免费分享,需要的朋友只需你:

——转发+点赞+评论文章,关注我,添加助手vx:bjmsb10  即可免费领取。

<think>我们使用1616位的SRAW芯片构建32k×32位的存储器。这需要同时行字扩展(容量扩展)和位扩展(数据宽度扩展)。具体方案:1.字扩展(容量扩展):将16k扩展为32k,需要2倍的数量,因此需要2组芯片,每组2片(因为还有位扩展)。2.位扩展(数据宽度扩展):将16位扩展为32位,需要2片芯片并行工作,提供16位+16位=32位。因此,总共需要4片1616位的芯片。连接方案:-地址线:原芯片有14根地址线(因为16k=2^14),现在要扩展成32k32k=2^15),所以需要15根地址线。-将14根低位地址线(A0-A13)同时连接到4片芯片的地址输入端。-第15根地址线(A14)作为片选控制信号,用于选择两个不同的16k段(前16k和后16k)。-数据线:每片芯片提供16位数据,需要两片芯片组合成32位。因此,我们将两片芯片的数据线分别作为高16位和低16位。-芯片1:提供低16位(D0-D15)-芯片2:提供高16位(D16-D31)-同样,芯片3和芯片4也这样连接。但是,我们还需要将整个存储器分成两个16k的段:当A14=0时,选择前16k段(由芯片1和芯片2组成,分别提供低16位和高16位)当A14=1时,选择后16k段(由芯片3和芯片4组成,分别提供低16位和高16位)控制信号:读/写信号(WE)可以同时接到4片芯片的WE端。片选信号(CS)可以整体使能,也可以不用(因为我们已经用A14行了选择)。如果系统有全局片选,可以用一个与门将全局片选和A14(或通过译码)产生每个芯片的片选。具体芯片片选逻辑:我们使用A14和全局片选(如果有)来生成两个组选信号:组0片选:CS0=~A14&CS(当A14为0时,且全局片选有效时,选中芯片1和2)组1片选:CS1=A14&CS(当A14为1时,且全局片选有效时,选中芯片3和4)注意:如果没有全局片选,则直接使用A14和~A14。每个组内部的芯片,由于是位扩展(同时工作),所以同一组内的两片芯片的片选信号是相同的。因此,连接图如下:地址线:A0-A13:连接到所有4片芯片的地址线A0-A13。A14:用于片选控制。数据线:芯片1(组0,低16位):D0-D15连接到系统的数据总线D0-D15。芯片2(组0,高16位):D0-D15连接到系统的数据总线D16-D31。芯片3(组1,低16位):D0-D15连接到系统的数据总线D0-D15。芯片4(组1,高16位):D0-D15连接到系统的数据总线D16-D31。控制线:WE:连接到所有4片芯片的WE端(写使能)。片选信号:芯片1的片选CS1=CS0(组0片选)芯片2的片选CS2=CS0(组0片选)芯片3的片选CS3=CS1(组1片选)芯片4的片选CS4=CS1(组1片选)注意:芯片的片选信号一般是低电平有效,但这里我们假设高电平有效。具体根据芯片手册,可能需要反相器。逻辑连接图(文本描述):```+---------++---------++---------++---------+|16kx16||16kx16||16kx16||16kx16||芯片1||芯片2||芯片3||芯片4||||||||||A0-A13<=======A0-A13<=======A0-A13<=======A0-A13<=======系统地址总线A0-A13|||||||||D0-D15=====>系统D0-D15||D0-D15=====>系统D0-D15||||D0-D15=====>系统D16-D31|||D0-D15=====>系统D16-D31||||||||||WE<----------WE<----------WE<----------WE<----------系统WE|||||||||CS1<----+|CS2<----+|CS3<----+|CS4<----++---------++---------++---------++---------+^^^^||||||||+-----------++-----------+|组0片选:~A14&CS||组1片选:A14&CS|+-----------++-----------+^^||+-------------A14--------------+|+-------------CS(如果系统有全局片选)```如果没有全局片选CS,那么组0片选就是~A14,组1片选就是A14。注意:上面的连接图中,地址总线A0-A13连接到所有芯片的地址线,而A14则用于生成组选信号(经过一个非门得到~A14用于组0,直接用于组1)。这样设计的存储器总容量为32k×32位。注意:这里假设每个芯片的片选信号高电平有效。如果芯片的片选是低电平有效,则需要在组选信号后加入反相器。</think> ### 32k×32位存储器设计方案(基于1616位SRAW芯片) #### 1. 设计原理 需同时实现**字扩展**(容量从16k→32k)和**位扩展**(位宽从16位→32位): - **字扩展**:增加存储单元数量,需增加地址线($2^{14} = 16k$ → $2^{15} = 32k$) - **位扩展**:增加数据位宽,需合并多芯片的输 - **芯片总数**:$$ \frac{32k}{16k} \times \frac{32}{16} = 2 \times 2 = 4 \text{片} $$ #### 2. 逻辑连接图 ```plaintext +---------------------+ | 系统地址总线 (15位) | +----------+----------+ | +-------+-------+ | | | +---v---+ +---v---+ | | A0-13| | A0-13| | +-------+ +-------+ | | | | +----------------+ +----v-------v----+ | | 系统控制信号 | | 地址解码器 | | | (WE, CS) >----+------> A14 -> /CS1, CS2| | +----------------+ +----+-------+-----+ | | | | +----------------+ | +----+ | | 数据总线 (32位)| | | | +--------+-------+ | | | | | | | +----------+-------+ | | +--------+ | 低16位 D0-D15 | | | | 高16位 D16-D31 +--+----+----+----+ | | +----+----+----+----+ | | | | | | | | | | +----v-+ | +--v----+ | | +-----v-+ | +--v----+ |芯片1 | | |芯片2 | | | |芯片3 | | |芯片4 | +------+ | +-------+ | | +-------+ | +-------+ |1616| | |1616| | | |1616| | |1616| +------+ | +-------+ | | +-------+ | +-------+ | | | | | | | | +-------v------v-----v-----v--v--------v------v-----v-----+ | 共享控制信号 (WE, 组选通) | +---------------------------------------------------------+ ``` #### 3. 关键连接说明 1. **地址线连接**: - **A0-A13**:直连所有4片芯片(每片寻址16k空间) - **A14**:通过解码器生成片选信号: - $A_{14} = 0$ → 选通芯片1&2(低16k空间) - $A_{14} = 1$ → 选通芯片3&4(高16k空间)[^1] 2. **数据线连接**: - **芯片1(低16位)**:D0-D15 → 系统数据总线D0-D15 - **芯片2(高16位)**:D0-D15 → 系统数据总线D16-D31 - **芯片3&4**:同样方式连接高16k空间 3. **控制信号**: - **WE(写使能)**:直连所有芯片 - **CS(片选)**: - 芯片1&2:组选通信号 $/CS_1 = \overline{A_{14}}$ - 芯片3&4:组选通信号 $CS_2 = A_{14}$ #### 4. 工作流程 ```mermaid graph TD A[系统发起访问] --> B{A14=0?} B -- 是 --> C[选通芯片1+2] C --> D1[芯片1输D0-D15] C --> D2[芯片2输D16-D31] B -- 否 --> E[选通芯片3+4] E --> F1[芯片3输D0-D15] E --> F2[芯片4输D16-D31] ``` #### 5. 芯片技术说明 - SRAW芯片支持16位动态范围(与引用中RAW图像处理原理相同)[^1][^3] - 实际位宽受相机限制(如Sony a7 III仅支持14位)需在设计中校验[^1] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值