阿里云 暑期实习面经 三面|讲解|0305

前面讲解过该同学阿里云的一面讲解二面讲解,这是第三面的,继续给大家做讲解分析,参考回答和学习资料指引,联合起来,参考意义很大,期望大家有所收获~

这篇文章主要考察点:海量数据场景题+操作系统+计算机网络+数据库

原贴链接

alt 感谢这位同学分享!!!

开始吧~~

1.场景题:不考虑系统限制,如何快速在大量字符串中统计出现次数前10的字符串?如果考虑内存限制,应该采取什么措施在海量数据中进行统计?

解析:

属于海量数据面试题之一,系统学习推荐资料,掌握常用的分析处理方法,例如分治,外排序等方法,这些问题基本问不住你~~

参考回答:

无限内存

  1. hash_map统计 先对这批海量数据预处理。具体方法是:维护一个Key为字符串,Value为该Query出现次数的hash_map,即hash_map(KeyStr, Value),每次读取一个KeyStr,如果该字串不在Table中,那么加入该字串,并将Value值设为1;如果该字串在Table中,那么将该字串的计数加1 即可。最终我们在O(N)的时间复杂度内用hash_map完成了统计;
  2. 堆排序 借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。即借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历hash_map,分别和根元素进行对比。所以,我们最终的时间复杂度是:O(n) + N' * O(logk),其中,N’为300万中不同的String个数,即hash_map中Key的个数。

有限内存

这一类问题中,限制内存的面试题才是更常见的,解法也是。

1.分而治之/hash映射: 首先把所有字符串,采用Hash映射的方法,比如%1000,把整个大文件映射为1000个小文件(目标是拆分到每个小文件大小可以装入内存)。

2.hash_map统计 + 堆排序 针对每个小文件,采用上面不限内存的方式,统计出每个小文件的Top10

3.合并小文件结果 讲1000个文件的Top10取出,一共1万个元素,再用一次堆排序,取出这1万个中的Top10, 即最终结果。

学习指引:

系统学习这篇文章,类似海量数据面试题问不住你~~

系统学习:《后端海量数据面试题讲解-01分治》|第1题|第2题

2.场景题:设计实现一个高可用、高并发的系统,讲讲有哪些需要注意的地方?对于突发的大流量有哪些处理方法?热点数据有哪些处理方法?

解析:

笼统的答一下就行,面试官会细问你,再详细回答。

参考回答:

注意的地方: 设计实现一个高可用、高并发的系统时,需要注意的关键点包括:采用微服务架构和负载均衡确保系统的可扩展性和故障隔离;实现数据库读写分离、分库分表以及合理使用缓存来优化数据存储和访问性能;利用异步处理和消息队列提高系统吞吐量;强化安全性设计,包括身份验证、授权和数据加密;建立完善的监控和告警机制,以及时发现和解决性能瓶颈;通过容器化部署和自动扩缩容实现弹性伸缩;同时,容错和恢复策略的制定,以及充分的功能、压力和安全测试都是确保系统高可用和高并发的重要环节。

突发大流量: 应首先确保系统架构具备水平扩展能力,利用负载均衡技术分散请求压力;同时,结合缓存策略,将热点数据缓存至高性能存储中,减少对后端服务的冲击;若流量仍超出处理能力,可启用限流机制保护核心资源,并通过降级非关键服务维持整体稳定;此外,监控系统需实时检测流量变化,自动触发扩展资源以应对峰值。

热点数据处理:

缓存优化:为了缓解数据库的压力,我们应该将热点数据缓存起来。使用高性能的缓存系统,如Redis或Memcached,可以将这些数据存储在内存中,从而大幅度减少对数据库的访问。通过合理的缓存策略,如基于访问频率的动态缓存、缓存预热等,可以进一步提高缓存的命中率和效果。

数据库优化:数据库的优化也是处理热点数据的关键环节。对于读多写少的热点数据,可以考虑使用读写分离的策略,将读操作和写操作分散到不同的数据库服务器上,以提高并发处理能力。同时,通过数据库分片技术,可以将数据水平分割到多个数据库服务器上,每个服务器只处理一部分数据,进一步分散存储和访问压力。

学习指引:

系统学习:《网课:高并发系统设计40问》

3.Redis:为什么redis是单线程但速度依旧很快?

解析:

redis高频面试题之一

参考回答:

Redis速度快的原因主要有以下几点:首先,Redis是一个内存数据库,所有的数据都存储在内存中,这大大减少了磁盘I/O的延迟,使得数据读写速度非常快;其次,Redis使用单线程模型,避免了线程切换和锁竞争等开销,能够更高效地利用CPU资源;此外,Redis提供了多种高效的数据结构,如字符串、哈希表、列表、集合等,这些数据结构都经过了高度优化,能够实现快速的读写操作;最后,Redis还使用了异步I/O模型,能够同时处理多个并发请求,提高了系统的吞吐量。这些因素共同作用,使得Redis在处理大量读写请求时表现出色,成为了一个高性能的键值数据库。

学习指引

面试学习:《小林 Coding》|图解Redis|Redis 采用单线程为什么还这么快?

4.操作系统:介绍下IO多路复用?select、poll和epoll各自的区别?

解析:

操作系统高频考题,重点掌握

参考回答:

是什么?

IO多路复用是一种在操作系统中用于处理多个输入/输出流的技术,它允许单个进程或线程同时监控多个文件描述符,以确定它们中的哪些可以进行非阻塞的读/写操作,从而提高系统对并发IO请求的处理效率。这项技术广泛应用于构建高性能、高并发的网络服务器。

select、poll和epoll各自的区别?

  • select: select是早期Unix系统上的IO多路复用技术,它使用一个位图来表示文件描述符集合,并允许程序同时监控这些描述符的读/写状态。然而,select存在两个主要问题:一是它所能监控的文件描述符数量受限于FD_SETSIZE(通常为1024);二是每次调用select时,都需要传递并处理整个文件描述符集合,这在描述符数量较多时效率较低。

  • poll: poll解决了select中文件描述符数量限制的问题,它使用一个数组来存储文件描述符及其对应的事件,因此可以支持更多的描述符。与select类似,poll也采用轮询的方式检查描述符的状态,但它在处理大量描述符时比select更高效,因为poll不需要像select那样在调用前后重新设置文件描述符集合。

  • epoll: epoll是Linux特有的IO多路复用技术,与select和poll不同,它使用基于事件驱动的方式来工作。epoll通过注册感兴趣的事件到文件描述符上,并在这些事件发生时接收通知,从而避免了轮询的开销。此外,epoll还支持水平触发和边缘触发两种模式,提供了更大的灵活性。在高并发场景下,epoll通常比select和poll具有更好的性能表现。

学习指引:

面试学习:《小林coding》|图解系统|I/O 多路复用

5.操作系统:磁盘快照有了解吗?介绍下COW和ROW?

解析:

了解。虽然是个操作系统问题,但是Redis的RDB持久化其实就有用到COW(写时复制)技术。

参考回答:

磁盘快照: 磁盘快照是一种创建文件系统或卷在某个特定时间点的只读副本的技术。它允许用户在不影响原始数据的情况下访问、备份或恢复数据。快照通常用于数据保护、恢复和备份场景,可以迅速创建并占用较少的存储空间。

COW(写时复制): COW是“写时复制”的缩写,是一种实现磁盘快照的技术。在使用COW时,原始数据块在修改之前不会被覆盖,而是将修改的数据块复制到新的位置,并更新文件系统的元数据以指向新的数据块。这样,快照可以继续访问原始数据块,而修改则反映在新的数据块上。COW技术提高了快照创建和管理的效率,因为快照和原始数据可以共享相同的数据块,直到发生修改为止。

ROW(写时重定向): ROW是“写时重定向”的缩写,是另一种实现磁盘快照的技术。与COW不同,在使用ROW时,当原始数据块需要修改时,修改会被重定向到新的位置,并且文件系统的元数据会更新以反映这种重定向。然而,与COW不同的是,ROW通常保留原始数据块的副本以供快照使用,而不是共享数据块。这意味着每个修改都会导致新的数据块被分配和写入,这可能会增加存储空间的消耗。

学习指引:

存储快照-COW和ROW

6.操作系统:进程、线程和协程各自的作用和区别?进程和线程的组成?

解析:

操作系统,简单且“最”常考面试题。必须掌握

参考回答:

进程、线程和协程区别?

  • 进程是操作系统资源分配的基本单位,它包含了正在运行的程序的所有状态信息,如代码、数据、系统资源和线程等。每个进程都有独立的内存空间和系统资源,相互之间互不干扰,保证了系统的稳定性和安全性。但是,进程间的切换和通信需要较大的开销。
  • 线程是进程内的执行单元,共享同一个进程的内存空间和资源,如文件句柄、信号量等。线程间的切换和通信比进程更快,因为它们共享同一地址空间。但是,线程没有独立的地址空间,一个线程的崩溃可能会影响整个进程。
  • 协程是一种更轻量级的线程,也被称为微线程。它们完全在用户态下执行,不需要内核的参与,因此切换开销更小。协程可以由程序自身控制调度,实现非抢占式的多任务处理。

进程和线程的组成?

  • 进程的组成: 进程主要由三部分组成:程序代码(即指令序列)、相关数据(包括变量、缓冲区、文件等)以及进程控制块(PCB)。其中,进程控制块是用于描述系统进程状态的关键数据结构,它包含了进程ID、进程状态、内存指针、文件描述符表、信号处理函数等重要信息。
  • 线程的组成: 线程是进程内的一个执行单元,其组成通常包括线程ID、当前指令指针(PC)、寄存器集合(用于保存线程上下文)、堆栈(用于函数调用和局部变量存储)以及线程控制块(TCB,类似于进程中的PCB,但更轻量级)。线程共享其所属进程的内存空间和部分资源,如文件句柄和信号量等,这使得线程间的数据交互变得容易,但同时也增加了同步和互斥的复杂性。

学习指引: 《小林coding》|图解系统|进成线程基础知识

7.操作系统:CPU数量为1的进程执行死循环会发生什么?如何解决?

参考回答:

在Linux系统中,如果某个进程出现死循环,其本身的运行会受到影响,但不会直接导致其他进程的运行受阻。这是因为Linux系统采用了多任务调度的机制,每个进程都有自己的时间片,通过轮转的方式依次分配给各个进程。当某个进程出现死循环时,它会占用自己分配到的时间片,导致其他进程在该时间片内无法执行。但是,当时间片轮转到其他进程时,它们仍然可以正常运行。

然而,死循环可能会导致系统的整体性能下降。因为死循环会消耗CPU的资源,导致其他进程无法充分利用CPU进行运算。如果死循环的进程是一个重要的系统进程,其消耗过多的CPU资源可能会导致系统响应变慢,甚至出现卡顿的情况。此外,如果死循环的进程还涉及到资源的竞争,如文件、网络连接等,可能会对其他进程的正常运行产生影响。

如何解决?

  1. 杀死进程:通过操作系统的任务管理器或命令行工具,可以强制终止执行死循环的进程。这通常是最直接和有效的方法。
  2. 调试和修复:如果可能的话,应该对导致死循环的代码进行调试和修复。通过检查循环条件和逻辑,找出问题所在,并进行相应的修改。
  3. 资源限制:操作系统可以提供一些机制来限制进程对CPU的占用,如设置进程优先级、使用CPU配额或限制进程的CPU使用时间。这些措施可以在一定程度上减轻死循环对系统的影响。
  4. 系统监控:实施系统监控和日志记录,以便及时发现并处理死循环等异常情况。这有助于提高系统的可维护性和可靠性。
  5. 多核或多CPU环境:虽然问题是关于单CPU系统的,但将系统升级到具有多个核心或CPU的环境可以提供更高的并发处理能力。这样,即使一个进程陷入死循环,其他进程仍然可以在其他核心或CPU上正常运行。

学习指引: 了解学习:如何快速定位死循环

8.计算机网络:有哪些网络攻击方式?在项目中针对可能的网络攻击采取了哪些相应的防范措施?

解析:

需要掌握一些常见的网络攻击方式,然后按照自己的理解,简单描述就行。

参考回答:

网络攻击方式多种多样,常见的包括拒绝服务攻击(DoS/DDoS),通过大量请求耗尽目标系统资源;SQL注入攻击,利用恶意SQL代码绕过身份验证;跨站脚本攻击(XSS),注入恶意脚本窃取用户信息。在项目中,我们采取了多种防范措施来应对这些攻击,例如实施防火墙和入侵检测系统来抵御DoS/DDoS攻击,使用参数化查询和预编译语句防止SQL注入,以及对用户输入进行严格的验证和过滤来防范XSS攻击。

学习指引:

面试学习:《JavaGuide》| 网络攻击常见手段总结

9.计算机网络:cookie、session和token的区别?各自的使用场景?

解析:

计算机网络重点考题之一,后端真实项目中也会频繁涉及相关知识,所以不管从面试还是工作来说,都需要掌握

参考回答:

  • Cookie是由服务器发送到用户浏览器并存储在客户端的小段数据。它通常用于识别用户并保持会话状态。然而,由于Cookie存储在客户端,存在安全风险,如跨站请求伪造(CSRF)和跨站脚本攻击(XSS)。因此,它们适用于非敏感信息的短期存储,如用户偏好或购物车内容。
  • Session是在服务器端创建并维护的用户会话信息。与Cookie不同,Session数据存储在服务器端,并通过唯一的会话标识符(通常存储在Cookie中)与用户关联。这提供了更高的安全性,因为敏感数据不会传输到客户端。Session适用于需要维护用户状态和进行身份验证的Web应用程序,如登录状态和用户个人资料。
  • Token是一种身份验证和授权机制,通常用于API和微服务之间的通信。与Cookie和Session不同,Token是无状态的,意味着服务器不需要维护用户会话信息。相反,客户端在每次请求时附带Token,服务器验证其有效性并授权访问资源。Token的主要优势在于其可扩展性和跨域能力,适用于分布式系统和跨多个应用程序的身份验证。常见的Token类型包括JWT(JSON Web Token),它们包含用户的身份信息和授权声明,并可以用于单点登录(SSO)和微服务之间的安全通信。

学习指引:

一文搞懂:《掘金博客》|傻傻分不清之 Cookie、Session、Token、JWT

10.数据库:项目中使用了NoSQL和MySQL,说说NoSQL和关系数据库的区别?

解析:: 可以从存储方式,扩展性,一致性,应用场景等几个方面来回答

参考回答:

  • 存储方式:NoSQL数据库通常采用键值对、文档、宽列存储或图结构等非关系型数据模型,而关系数据库则使用表格形式来存储数据,具有严格的模式和结构。这种差异使得NoSQL数据库在处理非结构化或半结构化数据时更加灵活。
  • 扩展性方面: NoSQL数据库通常设计为易于水平扩展的,即通过增加更多的服务器来增加数据库的容量和性能。而关系数据库虽然也可以进行扩展,但通常更倾向于垂直扩展,即通过提升单个服务器的性能来增强数据库的处理能力。这使得NoSQL数据库在处理大量数据时更具优势。
  • 一致性:另外,NoSQL数据库通常不遵循ACID(原子性、一致性、隔离性、持久性)原则,而是在可用性和一致性之间做出了权衡。这意味着在某些情况下,NoSQL数据库可能会牺牲数据的一致性来保证系统的可用性和响应速度。而关系数据库则严格遵守ACID原则,确保数据的完整性和一致性。
  • 应用场景上:: NoSQL数据库更适合处理海量数据、高并发读写、对数据一致性要求不那么严格的场景,如社交网络、实时分析等。而关系数据库则更适合处理结构化数据、需要复杂查询和事务处理的场景,如银行、企业资源规划等。

学习指引: 《知乎》|关系型数据库 VS 非关系型数据库

本文也是热门面经讲解》专栏 系列文章之一,文末尾有专栏链接,大家可以点个关注,我会持续更新~~

#面经##实习##阿里云##暑期实习##牛客在线求职答疑中心#
热门面经讲解 文章被收录于专栏

挑选近期热门真实后端面经进行讲解分析,给出:个人分析+参考回答+学习资料指引。

全部评论
第三题不是 I/O 多路复用吗
点赞 回复 分享
发布于 03-07 12:57 湖南

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
31 183 评论
分享
牛客网
牛客企业服务