已准备考研,整理一波java后端面试常考点


【计算机网络】面试常考点总结(2021.3.2)

此系列博客供自己复习所用,如有错误还望指出

一、ARP协议

地址解析协议

1.1 IP地址与MAC地址

  • MAC地址是数据链路层和物理层使用的地址

  • IP地址是网络层和以上各层使用的地址


1.2 ARP地址解析协议

基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。将IP地址转化为物理地址。不过再IPv6已不再使用,并被邻居发现协议(NDP)所替代。

1.3 ARP工作机制

报文格式

以太网传输层

在每台安装有TCP/IP协议的电脑或路由器都有一个ARP缓存表,表中的IP地址和MAC地址是一一对应的,如下表所示。

在主机A要向区域网上某个主机B发送IP数据报时,就先在其ARP高速缓存中查找有无主机B的IP地址。

  • 如果有,就在ARP高速缓存中查出其对应的硬件地址,再把其硬件地址写入到MAC帧,然后通过区域网把改MAC帧发往此硬件地址。

  • 如果没有,则:

    1. ARP进程在本局域网发送一个ARP请求分组


    2. 本区域网上所有主机运行的ARP进程都收到此ARP请求分组

    3. 主机B在ARP分组中见到自己的IP地址就向A发送ARP响应分组,并写入自己的硬件地址,响应分组是普通的单播

    4. 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射

    5. 另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为委托ARP或ARP代理(ARP Proxy)。

二、TCP三次握手和四次挥手

1. 三次握手

在这里插入图片描述

2. 四次挥手

在这里插入图片描述

三、HTTP和HTTPS区别

参考链接:http://www.mahaixiang.cn/internet/1233.html

  • http:超文本传输协议,https:安全套接字超文本传输协议

  • https在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并未浏览器和服务器之间的通信加密

  • https协议需要到CA申请证书

  • http端口:80,https端口:443

https协议主要作用:

(1)建立一个信息安全通道,来保证数据传输的安全;

(2)确认网站的真实性

四、get和post区别

  • 最直观的区别:get参数包含在url中,post则通过request body传递参数

  • 本质:都是tcp链接,并无差别。但是由于http的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同

  • 最重要的区别:get产生一个tcp数据包,而post产生两个tcp数据包

    • 对于get方式的请求,浏览器会吧http header和data一并发送出去,服务器响应200(返回数据)

    • 对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

    并不是所有的浏览器都会在post中发送两次包,Firefox就只发送一次

五、TCP和UDP区别

UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等

TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

【数据库】面试常考点

此系列博客供个人复习所用,如有错误还望指出

一、MySQL四种常见的数据库引擎

1. InnoDB存储引擎

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。

(1)InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎

(2)InnoDB是为处理巨大数据量的最大性能设计

(3)InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池

(4)InnoDB支持外键完整性约束

(5)InnoDB被用在众多需要高性能的大型数据库站点上

2. MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。MyISAM拥有较高的插入、查询速度,但不支持事物

(1)大文件,在支持大文件的文件系统和操作系统上被支持

(2)每个MyISAM表最大索引数是64,这可以通过重新编译来改变。

使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)

3. MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问

(1)可以在一个MEMORY表中有非唯一键值

4. Archive存储引擎

Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

5. 对比记忆

img_009790b51a88771c9d9d3a4ebd577f16.png

  • InnoDB:支持事务(提交、回滚、崩溃恢复能力的事务安全[ACID兼容]能力),要求实现并发控制

  • MyISAM:处理查询和查询效率极高

  • Memory:如果临时存放数据数据量不大,并且不需要较高的数据安全性。可以作为临时表,存放查询的中间结果。

  • Archive:如果只有insert和select操作,可以选择。支持高并发插入操作,但是本身不事务安全

使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

二、事务特性(ACID)

  • 原子性(Atomicity):事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。

    保证1-6所有过程要么都执行,要么都不执行。一旦在执行某一步骤的过程中发生问题,就需要执行回滚操作。 假如执行到第五步的时候,B账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。

  • 一致性(Consistency):这表示数据库的引用完整性的一致性,表中唯一的主键等。转账前后双方账户金额总和不变

    在转账之前,A和B的账户***有500+500=1000元钱。在转账之后,A和B的账户***有400+600=1000元。也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。

  • 隔离性(Isolation):可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。

    在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。 如果在A给B转账的同时,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱再加上自己原有的钱。

  • 持久性(Durability):一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。

    一旦转账成功(事务提交),两个账户的里面的钱就会真的发生变化(会把数据写入数据库做持久化保存)!

三、MySQL三大范式

参考链接:https://www.cnblogs.com/xuan584521/p/6366541.html

第一范式:确保每列的原子性

  • 最基本的范式。

  • 数据库表中的字段都是单一属性,不可再分。

  • 只要是关系数据库都满足第一范式

  • 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式

    例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。

第二范式:确保表中的每列都和主键相关

如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.

例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

第三范式:确保每列都和主键列直接相关,而不是间接相关

如果一个关系满足第二范式,并且除了主键以外的其它列都不传递依赖于主键列,则满足第三范式.

例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

总结

  • 1NF:字段不可分

  • 2NF:有主键,非主键字段依赖主键

  • 3NF:非主键字段不能相互依赖

1NF:原子性,字段不可再分,否则就不是关系数据库

2NF:唯一性,一个表只说明一个事物

3NF:每列都与主键有直接关系,不存在传递依赖

四、MySQL排他锁&共享锁

参考链接:https://www.cnblogs.com/boblogsbo/p/5602122.html

mysql锁机制分表级锁行级锁。共享锁和排他锁都属于行级锁。

  • 共享锁:读锁,简称S锁。共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

  • 排他锁:写锁,简称X锁。排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。

排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

五、MySQL事务隔离级别

参考链接:https://tech.meituan.com/2014/08/20/innodb-lock.html

1. 未提交读(Read uncommitted)

允许脏读,也就是可能读取到其他会话中未提交事务修改的数据(数据库一般不用)

2. 已提交读(Read committed)

只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的

3. 可重复读(Repeatable read)

可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读(幻读)

4. 可串行化(Serializable )

完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。解决幻读

5. 不可重复读和幻读的区别

  • 在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了

  • 但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免

  • 需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

6. 两类事务丢失

  • 第一类事务丢失:回滚丢失

    比如A和B同时在执行一个数据,B事务已经提交,然后A事务回滚,这样B事务的操作就因A事务的回滚丢失了

  • 第二类事务丢失:提交覆盖丢失

    事务A和B一起执行一个数据,两个同时取到一个数据,然后B事务首先提交,但是A事务接下来又提交,这样就覆盖了B事务

六、使用Redis缓存可能带来的问题

参考链接:https://snailclimb.gitee.io/javaguide/#/

1、缓存穿透

定义

大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层(比如:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库)

解决方法

  • 缓存失效key

    如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间。

    但是不能从根本上解决问题,如果黑客恶意攻击,每次构建不同的请求 key,会导致 Redis 中缓存大量无效的 key

  • 布隆过滤器

    image

    但是,布隆过滤器可能会存在误判的情况。总结来说就是: 布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。

    当一个元素加入布隆过滤器中的时候,会进行哪些操作:

    1. 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。

    2. 根据得到的哈希值,在位数组中把对应下标的值置为 1。

    当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行哪些操作:

    1. 对给定元素再次进行相同的哈希计算;

    2. 得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。

2、缓存雪崩

定义

缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求

解决方法

  • 针对 Redis 服务不可用的情况:

    1. 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。

    2. 限流,避免同时处理大量的请求。

  • 针对热点缓存失效的情况:

    1. 设置不同的失效时间比如随机设置缓存的失效时间。

    2. 缓存永不失效。

【操作系统】常见面试题总结(1.31更新)

此系列博客供自己复习所用,如有错误还望指出

一、虚拟存储机制

1.1 传统存储管理

特性:

  1. 一次性:作业必须一次性全部装入内存才能开始运行。

    导致:(1)大作业无法运行;(2)大量作业要求运行时,程序并发度下降

  2. 驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一段时间内只需访问作业的一小部分数据即可正常运行。

高速缓冲技术

思想:将近期会频繁访问到的数据存放到更高的存储器中,暂时用不到的数据放在更低速的存储器中。

img

1.2 虚拟内存的运行

  • 基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存暂时用不到的部分留在外存,就可以让程序开始执行。

    在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

    若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存

  • 在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存

  • 虚拟内存是操作系统虚拟性的一个体现,实际的物理内存大小没有变,只是在逻辑上进行了扩充。

  • 虚拟内存最大容量是由计算机的地址结构(cpu寻址范围)确定的

1.3 虚拟存储器的特征

  1. 多次性

    无需在作业运行是全部装入内存,而是允许被多次调入内存

  2. 对换性

    在作业运行时无需常驻内存,而是允许在作业运行过程中,将作业换入、换出

  3. 虚拟性

    在逻辑上扩充了内存的容量,是用户看到的内存容量远大于实际容量

1.4 虚拟存储器的实现方法

  1. 分页请求系统

    (1)请求分页的页表机制

    (2)缺页中断机构

    (3)地址变换机构

  2. 请求分段系统

    (1)请求分段的段表机制

    (2)缺页中断机构

    (3)地址变换机构

1.5 页面置换算法

  1. 最佳置换算法

  2. 先进先出置换算法(FIFO)

  3. 最近最久未使用置换算法(LRU)

  4. 最少使用置换算法(LFU)

  5. Clock置换算法以及改进型Clock置换算法

    1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。 2类(A=0,M=0):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。 3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能在被访问。 4类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。

1.6 抖动和工作集

  • 抖动原因:运行的进程太多,分配给每一个进程的物理块太少,频繁的出现缺页。不断的换进换出

  • 工作集:某段时间间隔里,进程实际所要访问页面的集合。

二、分段管理和分页管理

共同点

  • 两者都采用离散分配方式

  • 都要通过地址映射机构来实现地址变换

不同点

  • 页是信息的物理单位,用户透明,长度固定,分页是由于系统管理的需要而不是用户的需要

    段是信息的逻辑单位,用户课件,长度可变,为了能更好地满足用户的需要

  • 页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分。

    段的长度却不固定,决定于用户所编写的程序,通常由编译程序根据信息的性质来划分。

  • 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址

    分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。



#Java##学习路径#
全部评论
感谢同学的整理与汇总~京东卡已经在路上啦~😉 ---------------------- 邀请大家参加春招高频面试考点整理活动呀~ 总结面试高频考点,领100元京东卡!【技术/硬件专场】 技术/硬件专场: https://www.nowcoder.com/discuss/611345
点赞 回复
分享
发布于 2021-04-26 14:13

相关推荐

点赞 评论 收藏
转发
1 33 评论
分享
牛客网
牛客企业服务