IT评测·应用市场-qidao123.com技术社区

标题: 【面试题】2025年百度校招Java后端面试题 [打印本页]

作者: 南飓风    时间: 2024-11-27 19:25
标题: 【面试题】2025年百度校招Java后端面试题

媒介

25 届百度校招开发岗位的薪资。

其中具名费也不是每一个人都有,具名费是分 2 年才能发完,比如具名费 6w,第一年是发 3w,剩下的 3w 第二年发,假如中途去职就拿不到这个具名费了,所以具名费也是企业留住人才的一种方式。
这次,来看看百度校招的 Java 后端开发面经,团体上观察的点挺多的。
   重要重点观察了网络i/o、网络协议、linux体系、mysql,Java 问的不多,可能是百度的后端开发的语言不是重要以 Java 为主,所以重点看面试者的计算机基础是否踏实。
    除了这些知识点的拷打之外,还出了1 个大数据场景题目+1 个算法。
  废话不多说,看看你能应对多少题?
一、网络IO

1、服务器处置惩罚并发哀求有哪几种方式?


2、说一下select,poll,epoll的区别?

select 和 poll 内部都是使用「线性结构」来存储进程关注的 Socket 聚集。
在使用的时候,首先必要把关注的 Socket 聚集通过 select/poll 体系调用从用户态拷贝到内核态,然后由内核检测事件,当有网络事件产生时,内核必要遍历进程关注 Socket 聚集,找到对应的 Socket,并设置其状态为可读/可写,然后把整个 Socket 聚集从内核态拷贝到用户态,用户态还要继续遍历整个 Socket 聚集找到可读/可写的 Socket,然后对其处置惩罚。
很明显发现,select 和 poll 的缺陷在于,当客户端越多,也就是 Socket 聚集越大,Socket 聚集的遍历和拷贝会带来很大的开销,因此也很难应对 C10K。
epoll 是办理 C10K 问题的利器,通过两个方面办理了 select/poll 的问题。


3、Java 有一种现代的处置惩罚方式,属于异步I/O,是什么?redis,nginx,netty 是依赖什么做的这么高性能?

重要是依赖Reactor 模式实现了高性能网络模式,这个是在i/o多路复用接口基础上实现的了网络模子。Reactor 翻译过来的意思是「反应堆」,这里的反应指的是「对事件反应」,也就是来了一个事件,Reactor 就有相对应的反应/响应。
Reactor 模式重要由 Reactor 和处置惩罚资源池这两个核心部分组成,它俩负责的事情如下:

Reactor 模式是机动多变的,可以应对不同的业务场景,机动在于:

Redis 6.0 之前使用的 Reactor 模子就是单 Reactor 单进程模式。单 Reactor 单进程的方案由于全部工作都在同一个进程内完成,所以实现起来比较简单,不必要思量进程间通信,也不用担心多进程竞争。

但是,这种方案存在 2 个缺点:

所以,单 Reactor 单进程的方案不实用计算机密集型的场景,只实用于业务处置惩罚非常快速的场景。
Redis 是由 C 语言实现的,在 Redis 6.0 版本之前采用的正是「单 Reactor 单进程」的方案,由于 Redis 业务处置惩罚重要是在内存中完成,操作的速率是很快的,性能瓶颈不在 CPU 上,所以 Redis 对于命令的处置惩罚是单进程的方案。
Netty 是采用了多 Reactor 多线程方案,如下图:

多 Reactor 多线程的方案上风:

Netty 是多 Reactor 多进程方案,不过方案与尺度的多 Reactor 多进程有些差别。

具体差别表现在主进程中仅仅用来初始化 socket,并没有创建 mainReactor 来 accept 连接,而是由子进程的 Reactor 来 accept 连接,通过锁来控制一次只有一个子进程举行 accept(防止出现惊群现象),子进程 accept 新连接后就放到自己的 Reactor 举行处置惩罚,不会再分配给其他子进程。
二、网络协议

1、https是如何防范中间人的攻击?

重要通过加密和身份校验机制来防范中间人攻击的。


中间人攻击的关键在于攻击者冒充服务器与客户端建立连接,并同时与服务器建立连接。但由于攻击者无法得到服务器的私钥,因此无法精确解密客户端发送的加密数据。同时,客户端会在建立连接时验证服务器的证书,假如证书验证失败或存在问题,客户端会发出警告或中止连接。
2、描述一下打开百度首页后发生的网络过程



3、什么是ddos攻击?怎么防范?

分布式拒绝服务(DDoS)攻击是通过大规模互联网流量淹没目标服务器或其周边基础办法,以破坏目标服务器、服务或网络正常流量的恶意举动。
DDoS 攻击是通过连接互联网的计算机网络举行的。这些网络由计算机和其他设备(例如 IoT 设备)组成,它们感染了恶意软件,从而被攻击者长途控制。这些个体设备称为机器人(或僵尸),一组机器人则称为僵尸网络。

一旦建立了僵尸网络,攻击者就可通过向每个机器人发送长途指令来发动攻击。当僵尸网络将受害者的服务器或网络作为目标时,每个机器人会将哀求发送到目标的 IP 地址,这可能导致服务器或网络不堪重负,从而造成对正常流量的拒绝服务。由于每个机器人都是合法的互联网设备,因而可能很难区分攻击流量与正常流量。
常见的DDoS攻击包罗以下几类:

为了防范DDoS攻击,可以采取以下措施:

三、Linux 操作体系

1、进程中通信的方式有哪些?


Linux 内核提供了不少进程间通信的方式,其中最简单的方式就是管道,管道分为「匿名管道」和「定名管道」。
匿名管道顾名思义,它没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件体系中,shell 命令中的「|」竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,数据只能在一个方向上流动,假如要双向通信,必要创建两个管道,再来匿名管道是只能用于存在父子关系的进程间通信,匿名管道的生命周期随着进程创建而建立,随着进程制止而消失。
定名管道突破了匿名管道只能在亲缘关系进程间的通信限定,由于使用定名管道的前提,必要在文件体系创建一个类型为 p 的设备文件,那么毫无关系的进程就可以通过这个设备文件举行通信。另外,不管是匿名管道照旧定名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵照先进先出原则,不支持 lseek 之类的文件定位操作。
消息队列克服了管道通信的数据是无格式的字节流的问题,消息队列现实上是保存在内核的「消息链表」,消息队列的消息体是可以用户自界说的数据类型,发送数据时,会被分成一个一个独立的消息体,当然接收数据时,也要与发送方发送的消息体的数据类型保持一致,这样才能包管读取的数据是精确的。消息队列通信的速率不是最及时的,毕竟每次数据的写入和读取都必要经过用户态与内核态之间的拷贝过程。
共享内存可以办理消息队列通信中用户态与内核态之间数据拷贝过程带来的开销,它直接分配一个共享空间,每个进程都可以直接访问,就像访问进程自己的空间一样快捷方便,不必要陷入内核态或者体系调用,大大进步了通信的速率,享有最快的进程间通信方式之名。但是便捷高效的共享内存通信,带来新的问题,多进程竞争同个共享资源会造成数据的错乱。
那么,就必要信号量来掩护共享资源,以确保任何时刻只能有一个进程访问共享资源,这种方式就是互斥访问。信号量不仅可以实现访问的互斥性,还可以实现进程间的同步,信号量其实是一个计数器,表示的是资源个数,其值可以通过两个原子操作来控制,分别是 P 操作和 V 操作。
与信号量名字很相似的叫信号,它俩名字虽然相似,但功能一点儿都不一样。信号是异步通信机制,信号可以在应用进程和内核之间直接交互,内核也可以使用信号来关照用户空间的进程发生了哪些体系事件,信号事件的来源重要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令),一旦有信号发生,进程有三种方式响应信号 1. 执行默认操作、2. 捕捉信号、3. 忽略信号。有两个信号是应用进程无法捕捉和忽略的,即 SIGKILL 和 SIGSTOP,这是为了方便我们能在任何时候结束或制止某个进程。
前面说到的通信机制,都是工作于同一台主机,假如要与不同主机的进程间通信,那么就必要 Socket 通信了。Socket 现实上不仅用于不同的主机进程间通信,还可以用于本田主机进程间通信,可根据创建 Socket 的类型不同,分为三种常见的通信方式,一个是基于 TCP 协议的通信方式,一个是基于 UDP 协议的通信方式,一个是本地进程间通信方式。
2、怎么检察哪个端口被哪个进程占用?

可以通过 lsof 或者 netstate 命令检察,比如检察 80 端口。
lsof :
   [root@xiaolin ~]# lsof -i :80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 929 root 6u IPv4 15249 0t0 TCP *:http (LISTEN)nginx 929 root 7u IPv6 15250 0t0 TCP *:http (LISTEN)nginx 934 nginx 6u IPv4 15249 0t0 TCP *:http (LISTEN)nginx 934 nginx 7u IPv6 15250 0t0 TCP *:http (LISTEN)AliYunDun 16507 root 10u IPv4 40212783 0t0 TCP xiaolin:41830->100.100.30.26:http (ESTABLISHED)
  netstate:
   [root@xiaolin ~]# netstat -napt | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 929/nginx: master p
  3、用shell命令更换一个文件中的字符串

可以使用sed命令。以下是一个示例:
   sed -i ‘s/旧字符串/新字符串/g’ 文件名
  在上面的命令中,-i选项表示直接在原始文件中举行修改,而不是输出到尺度输出。s/旧字符串/新字符串/g是更换操作的模式,其中旧字符串是要更换的字符串,新字符串是更换后的新字符串。g表示全局更换,即一行中出现多次的旧字符串都会被更换。
请留意,这将直接修改原始文件,假如必要备份原始文件,可以在-i选项后面指定一个备份文件的扩展名,例如-i.bak,这将在更换前备份原始文件。
例如,假设要将文件example.txt中的字符串Hello更换为Hi,可以运行以下命令:
   sed -i ‘s/Hello/Hi/g’ example.txt
  4、linux中有一个日记文件,日记文件中记录了访问哀求的信息,第一列是访问的日期,第二列是哀求的ip,第三列是哀求的耗时,写一条shell命令来查到哀求耗时最高的10条记录

要查找哀求耗时最高的10条记录,可以使用以下Shell命令:
   sort -k3 -nr 日记文件 | head -n 10
  在上面的命令中,sort -k3 -nr用于按第三列(哀求耗时)举行倒序排序。-k3表示按第三列排序,-n表示按数字排序,-r表示倒序排序。然后,使用head -n 10来获取排序后的前10行,即耗时最高的10条记录。
将命令中的“日记文件”更换为现实的日记文件路径,即可查找到哀求耗时最高的10条记录。
5、假如cpu跑到100%,你的办理思路是什么?

思路如下:

四、MySQL

1、mysql有哪几种存储引擎,它们的区别是什么?



2、mysql的隔离级别分为哪几种类型?


接下来,举个具体的例子来说明这四种隔离级别,有一张账户余额表,里面有一条账户余额为 100 万的记录。然后有两个并发的事务,事务 A 只负责查询余额,事务 B 则会将我的余额改成 200 万,下面是按照时间顺序执行两个事务的举动:

在不同隔离级别下,事务 A 执行过程中查询到的余额可能会不同:

这四种隔离级别具体是如何实现的呢?

3、慢查询是如何调试办理的?


4、mysql的explain有什么作用?

explain 是检察 sql 的执行操持,重要用来分析 sql 语句的执行过程,比如有没有走索引,有没有外部排序,有没有索引覆盖等等。
如下图,就是一个没有使用索引,并且是一个全表扫描的查询语句。

对于执行操持,参数有:

type 字段就是描述了找到所需数据时使用的扫描方式是什么,常见扫描类型的执行服从从低到高的顺序为:

在这些情况里,all 是最坏的情况,由于采用了全表扫描的方式。index 和 all 差不多,只不过 index 对索引表举行全扫描,这样做的利益是不再必要对数据举行排序,但是开销依然很大。所以,要尽量制止全表扫描和全索引扫描。
range 表示采用了索引范围扫描,一般在 where 子句中使用 < 、>、in、between 等关键词,只检索给定范围的行,属于范围查找。从这一级别开始,索引的作用会越来越明显,因此我们必要尽量让 SQL 查询可以使用到 range 这一级别及以上的 type 访问方式。
ref 类型表示采用了非唯一索引,或者是唯一索引的非唯一性前缀,返回数据返回可能是多条。由于虽然使用了索引,但该索引列的值并不唯一,有重复。这样纵然使用索引快速查找到了第一条数据,仍旧不能制止,要举行目标值附近的小范围扫描。但它的利益是它并不必要扫全表,由于索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。
eq_ref 类型是使用主键或唯一索引时产生的访问方式,通常使用在多表联查中。比如,对两张表举行联查,关联条件是两张表的 user_id 相等,且 user_id 是唯一索引,那么使用 EXPLAIN 举行执行操持检察的时候,type 就会表现 eq_ref。
const 类型表示使用了主键或者唯一索引与常量值举行比较,比如 select name from product where id=1。
必要说明的是 const 类型和 eq_ref 都使用了主键或唯一索引,不过这两个类型有所区别,const 是与常量举行比较,查询服从会更快,而 eq_ref 通常用于多表联查中。
extra 表现的结果,这里说几个重要的参考指标:

五、Java

1、Java中有哪些常用的锁,在什么场景下使用?


2、什么是反射?有哪些使用场景?

Java 反射机制是在运行状态中,对于任意一个类,都可以或许知道这个类中的所有属性和方法,对于任意一个对象,都可以或许调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
应用场景:

六、场景题目

   给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限定是4G,让你找出a、b文件共同的url
  
七、算法

   算法题:一个长度为n的数组找出最大的m个数

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4