大厂面试干货面经

前言:最近想去大厂体验一下生活,所以光速总结最高频大厂死亡连环面试问题。主要题目都是八股文和实战问题,少部分python。大部分摘自牛客各位大佬的面经,也感谢各位大佬的分享。题目无分类、无序。看到哪总结到哪。有的问题的答案是根据自己的理解总结的(极简总结方式,为了光速记忆),如有问题,请大家疯狂指正!

1.浏览器输入URL经历了那些过程?

DNS域名解析,建立tcp连接,发送一个http请求,服务器处理相关请求,返回响应数据,关闭tcp连接,浏览器解析HTML,前段渲染。

2.什么是DNS域名解析,怎么解析的?

DNS就是将主机名和域名转为ip地址。 步骤:查浏览器缓存,系统缓存,路由器缓存。然后查本地域名服务器,没有再向上查根域名服务器,接着顶级域名服务器。查到返回存储在本地缓存。

3.TCP三次握手,为什么不是两次?

客服端 ->syn->服务器 服务器 ->syn、ack->客户端 客服端 ->ack->服务器

因为在第一步如果syn阻塞了,客户端会超时重传,与服务器成功建立连接。而阻塞的请求过一段时间再次到达服务器,如果是两次握手,阻塞的消息就会造成错误连接。

4.TCP四次挥手,为什么不是三次?

客服端 ->fin->服务器 服务器 ->ack->客户端 服务器 ->fin->客户端 客服端 ->ack->服务器

服务器收到fin的时候。不能马上关闭, 可能还需要发完数据包,如果变为三次握手,客户端有可能收不到服务器没发完的数据。

5.TCP怎么保证数据安全的?

流量控制、拥塞控制、超时重传、确认应答、连接管理等

流量控制:发送过快,来不急接收,为防止丢数据,采取滑动窗口机制。为防止大部份时间都在等待引入滑动窗口。对于发送窗口:只要属于发送窗口范围的数据都可发送,不需要等待ACK。

拥塞控制:慢开始 从小到大量逐渐发送数据;快重传、快恢复:快重传是当发送方连续收到三个重复的ACK报文就会直接重传。

6.常见HTTP状态码 ?

100:临时响应。200:成功 301:永久重定向 302:临时重定向 404:未找到页面 500:大部分情况后端报错 503:服务器不可用 504:网关超时,服务器没有及时响应

7.什么事路由?

网络数据包发送到目的地址的路线。目的:更快,更高效。

8.PING的原理、traceroute原理:

ping: ICMP请求报文,如果接收方收到,会回数据包响应,可以根据icmp应答查看网络是否连通,时延是多少。

traceroute:发送ICMP差错报文其中封装了无法交付的UDP数据报。将TTL设置为1,2。。可获取路由信息。

ICMP属于报文格式:类型、代码、校验he、标识符、序列号、数据

9.HTTP ?

HTTP有两种:请求报文和响应报文

请求报文包括:     请求行(请求方法字段、URL字段、HTTP协议版本字段)、请求头(host、content- type、body的长度、从那个页面跳转过来的、cookie、编码格式等)、空行、请求数据

10.HTTP和HTTPS的区别?

http:简单、无状态、信息明文传输。端口 80

https:加密、SSL/TLS+HTTP协议、需要证书。端口 443

11. SSL握手过程 或 HTTPS加密过程?

客户端给服务器端发送 协议版本、客户端支持的加密算法、一个随机数1。
服务器端选择 加密算法,并向客户端发送一个服务器数字证书和一个随机数2。
客户端使用数字证书中的公钥,将随机数3加密发送给服务器。
服务器使用私钥对随机数字3解密。
服务器端和客户端通过事先协商好的加密算法,对这三个随机数进行加密生成“对话秘钥”(session key)即对称加密的秘钥,用于接下来整个对话过程的加密。

12.POST提交数据的四种编码方式?

x-www-form-urlencoded、form-data、json、xml

13. 进程之间的通信方式?

管道、信号、信号量、消息队列、共享内存、套接字socket

14.进程、线程、协程?

进程: 进程是系统资源分配和独立运行的最小单位;
线程: 线程是进程的一个执行单元,是任务调度和系统执行的最小单位;
协程: 协程是一种用户态的轻量级存在,协程的调度完全由用户控制。

15.进程与线程的区别?

进程是系统资源分配和独立运行的最小单位;线程是进程的一个执行单元,是任务调度和系统执行的最小单位;一个进程可以有多个线程,多个线程也可以并发执行。进程切换慢;线程快、效率高、代价小。

16.用户态和内核态?

所谓用户态和内核态针对是CPU

内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序
用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备 用户态下的 CPU 不允许独占
17.为什么要有用户态和内核态呢?

这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如设置时钟、内存清理,这些都需要在内核态下完成,如果随意进行危险操作,极容易导致系统崩坏。

18.TCP与UDP的区别?

TCP面向连接、可靠;UDP是无连接的、不可靠,
TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保  证可靠交付
TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP三次握手。UDP不需要

19.五种IO模型?

同步阻塞IO、同步非阻塞IO、IO多路复用、异步IO

20.数据库索引是什么?有哪些?

数据库索引就像是一本书的目录一样,使用它可以让你在数据库里搜索查询的速度大大提升。使用索引的目的就是,加快表中的查找和排序。索引的种类分为普通索引、唯一索引、聚集索引、主键索引、全文索引等。

优点:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。提高数据的搜索速度。

缺点:建立数据库的时候,需要花费时间去建立和维护索引。索引需要额外占用存储空间。

21.什么是事物?

数据库操作的最小不可分割单元。一致性、持续性、原子性、隔离性

22.mysql。 B树与B+树的区别?

B+ 树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。

为什么要用 B+ 树,为什么不用普通二叉树?

(1)为什么不是普通二叉树?

如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

(2)为什么不是平衡二叉树呢?

我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。

(3)为什么不是 B 树而是 B+ 树呢?

B+ 树非叶子节点上是不存储数据的,仅存储键值,B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么 B+ 树查找变得简单。B+树只需要去遍历叶子结点就可以实现遍历整棵树的。而在数据库中基于范围的查找是非常频繁的,而B树节点中不仅存储键值,也会存储数据。B树不支持这样的操作或者说效率比较低下。

2、B+树的查询效率更加稳定。任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

23.Hash 索引和 B+ 树索引区别是什么

B+ 树可以进行范围查询,Hash 索引不能。

B+ 树支持联合索引的最左侧原则,Hash 索引不支持。

B+ 树支持 order by 排序,Hash 索引不支持。

Hash 索引在等值查询上比 B+ 树效率更高。

24.聚簇索引和非聚簇索引?

聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。

在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。

在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系

25.脏读、幻读、不可重复读?

脏读:事务A对数据资源进行了修改,事务B读取了事务A修改后的数据。由于某些原因,事务A并没有完成提交,发生了RollBack操作,则事务B读取的数据就是脏数据。

不可重复读:事务B读取了两次数据资源,在这两次读取的过程中事务A修改了数据,导致事务B在这两次读取出来的数据不一致。

幻读:事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行。幻读和不可重复读有些类似,但是幻读强调的是集合的增减,而不是单条数据的更新。

26.ARP协议?

根据IP地址获取物理地址的一个TCP/IP协议。通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

27.进程的切换过程?何时发生?

进程:对操作系统来说,一个任务就是一个进程,本质上是一个执行的程序。

进程切换实际上就是被中断运行进程与待运行进程的上下文切换。

1.保存之前运行的进程上下文

2.调用准备运行的进程上下文

3.CPU使用权交换

进程切换何时发生?中断、异常、系统调用

28.中断处理流程?

1.中断请求 2.中断源识别 3.中断响应 4.中断处理 5.中断返回

29.中断和异常?

中断是指来自CPU执行指令以外的事件发生后,处理及暂停正在运行的程序,转去执行处理该事件的程序的过程

异常是指来自CPU执行指令内部的事件发生后,处理及暂停正在运行的程序,转去执行处理该事件的程序的过程

30.RESTful接口和传统接口有什么区别?

传统:请求方法只用get和post即可,url不唯一,同一操作可以对应不同的url,状态码比较单一,200最常见

rest:面向资源的,通过url就可以知道需要什么资源。简单,低耦合,数据简单,一般以xml和json作为数据交换。无状态的

31.为什么说http是无状态的?

HTTP 协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不受前面的请求应答情况直接影响。

32.http各个版本?

0.9版本:最初版本,仅支持GET,仅能请求访问html格式的资源

1.0版本:增加POST和HEAD请求方式,每次TCP连接只能发送一个请求,服务器响应后就会关闭这次连接,下一次需要再建立。

1.1版本:加入PUT,DELETE 。引入持久连接,TCP连接默认不关闭,可以被多个请求复用,一个TCP连接可以允许多个HTTP请求。

33.HEAD请求?

常被用于客户端查看服务器性能。检查资源有效性,检查超链接有效性,检查网页是否被篡改

34.磁盘数据读写流程DMA?作用?三种传输方式?

DMA带代CPU完成数据的转移可以减轻CPU的工作量,提升效率。

传输方式:内存到外设、外设到内存、内存到内存。

用户程序调用系统调用。
CPU进入内核态,操作系统会检查页缓存是否有数据。如果有CPU拷贝这些数据到用户空间;如果没有则触发缺页中断,需要向磁盘调页,即从磁盘加载数据到页缓存。
CPU向磁盘控制器发送读指令,并且告诉磁盘主存地址、要读取的数据长度、要从哪一个设备读
磁盘控制器开始准备数据,磁盘数据准备好则放入数据缓冲区,并且通知DMA引擎。
DMA引擎向CPU发送DMA请求,申请获取总线和主存的使用权,申请成功后,开始将缓冲区寄存器的数据拷贝到主存。
完成数据传输后,磁盘控制器中的中断机构向CPU发送中断信号,触发中断处理程序

35.内存泄漏和内存溢出的区别是什么?

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用, 系统已经不能再分配出你所需要的空间;内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但是内存泄漏次数多了就会导致内存溢出。

36.mysql的聚簇和非聚簇索引的区别是什么?

区分聚族索引和非聚族索引非常简单,只要判断数据跟索引是否存储在一起就可以了。innodb存储引(擎在进行数据插入的时候,数据必须要跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一键,没有唯一键就使用6字节的rowid,因此跟数据绑定在一起的就是聚筷索引,而为了避免数据冗余存储,其他的索号1的叶子节点中存储的都是聚族索引的key值,因此innodb中既有聚族索引!也有非聚族索引1,而myisam中只有非聚族索列。

myisam中叶子结点的data存储的是当前索引所在的磁盘地址,然后根据地址查询该条数据。

innodb中叶子结点的data存储的是一整条数据值,不需要回表。

37.mysql的隔离级别有哪些?

READ UNCOMMITTED 读未提交
在这个隔离级别,所有事务都可以"看到“未提交事务的执行结果。会产生脏读、幻读、不可重复读的情况,不安全。
READ COMMITTED 读已提交
大多数数据库系统的默认隔离级别 (但是不是MySQL的默认隔离级别),一个事务开始时,只能"看见”已经提交事务所做的改变,—个事务从开始到提交前,所做的任何数据改变都是不可见的。会产生幻读、不可重复读的情况。
REPEATABLE READ 可重复读
MySQL数据库默认的隔离级别。该级别解決了READ UNCOMMITTED隔离级别导致的问题。它保证同一事务的多个实例在并发读取事务时,会”看到同样的"数据行。不过,这会导致另外一个辣手问题"幻读”。InnoDB和Falcon存储引擎通过多版本并发控制机制MVCC解决了幻读问题。
SERIALIZABLE 可串行化
该级别是最高级别的隔离级。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。效率比较低。

38.怎么处理MySQL的慢查询?
1、开启慢查询日志,准确定位到哪个sql语句出现了问题
2、分析sql语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写
3、分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引表
4、如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表

39.简述mysql中索引类型有哪些,以及对数据库的性能的影响?
普通索引:允许被索引的数据列包含重复的值
唯一索引:可以保证数据记录的唯一性
主键索引:是一种特殊的唯一索号1,在一张表中只能定义一个主键索引1,主键用于唯一标识一条记录,使用关键字primary key来创建
联合索引:素引可以覆盖多个数据列
全文泰引:通过建立倒期家引1,可以报大的提升检泰效率,經决判斷字段是否包会的问题,是目前理索引歡使用的一种关键技术
索引可以极大地提高数据的查询速度
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。但是会降低插入、删除、更新表的速度,因为在执行这些写操作的时候,还要操作索引文件
索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要简历聚族索引,那么需要的空间就会更大,如果非聚族索引很多,一旦聚筷索引改变,那么所有非聚筷索引都会跟着变

40.mysql为什么需要主从同步?
1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,因此采用读写分离操作。
2做数据的热备
3、架构的扩展。业务量越来越大,i/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘i/0访问的频率,提高单个机器的i/0性能.

41.mysql的索引结构有哪些?

mysql中使用较多的索引有hash索引,B+树索引,innodb的索引实现为B+树,memory存储引擎为hash索引。
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,叶子结点有双向指针连接,在B+树上检索效率稳定,而且基于索引的范围扫描时,也可以利用双向指针快速左石移动,效率非常高。
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值,前提是键值都是唯一的。但是哈希索引无法进行范围查询。
哈希所有也没办法利用索引完成排序,以及like这样的部分模糊查询
哈希索引也不支持多列联合索引的最左匹配规则
B+树索引的关键字检索效率比较平均,不像B树那样波动大,在有大量重复键值情况下,哈希索引的效率也是极低的,因此存在哈希碰撞问题。

42.索引的原理?
索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等
本质都是:通过不断地缩小想要获取数据的范国来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

43.死锁的四个必要条件?

1.互斥条件:一个资源每次只能被一个进程使用

2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;

3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;

4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;

44.如何提升TCP性能?

增大TCP的初始拥塞窗口,增加传输数据。

采用慢启动

像HTTP1.1中引入了长连接,通过在请求头中的keep-alive保持连接。

45.快重传和快恢复?

快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未接收到的报文段,而不必等待那个报文段设置额重传计时器超时。

快恢复:当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。

46.python中range和xrange的区别?

1.range和xrange都是在循环中使用,输出结果一样。
2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。
3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。

47.虚拟地址怎么转换为物理地址的?

1:确定页号。2:确定块号地址。3:确定页内地址。4:物理地址 = 块➕页

48.MySQL日志?

MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。

binlog主要是备份、redo log主要是防止宕机进行恢复、undo log想要保证事务的原子性,就需要在发生异常时,对已经执行的操作进行回滚,在MySQL中恢复机制是通过undo log(回滚日志)实现的

49.DNS传输层用TCP还是UDP?

1.使⽤A查询请求某个域名对应的IP地址时使⽤UDP。
2.如果响应报⽂长度⼤于512字节,则UDP仅返回前512字节,并设置报⽂⾸部“参数”字段的“截断”位。客户端在收到这个响应后,会使⽤TCP重新发送原来的请求。
3.如果⼀次查询的名字很多,则客户端可能会直接使⽤TCP。
4.在主域名服务器和辅助域名服务器之间进⾏区域传送时使⽤TCP。

50.用户态和内核态的区分

所谓用户态和内核态针对是CPU,是不同权限的资源范围

内核态可以执行一切特权代码
用户态只能执行那些受限权限的代码
51.为什么要区分用户态和内核态?

如此设计的本质意义是进行权限保护。
限定用户的程序不能乱搞操作系统,如果人人都可以任意读写任意地址空间软件管理便会乱套.

52.我们总说用户态和内核态切换的开销大,那么切换的开销具体大在哪里呢?

具体来说有以下几点

保留用户态现场(上下文、寄存器、用户栈等)
复制用户态参数,用户栈切到内核栈,进入内核态
额外的检查(因为内核代码对用户不信任)
执行内核态代码
复制内核态代码执行结果,回到用户态
恢复用户态现场(上下文、寄存器、用户栈等)

53.UDP如何保证可靠性传输?

UDP的可靠性,其实是借鉴TCP可靠性传输的策略,并且化繁为简取其精华。首先我们需要了解TCP是如何保证可靠性的。常见保证可靠性的策略有哪些?

(1)ACK机制
(2)重传机制
(3)序号机制
(4)重排机制
(5)窗口机制

54.TCP与HTTP的区别?

TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。把 IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。 TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。 

55.如何排查DNS解析出错?

1.查看域名状态

2.通过DNS服务器PING几台计算机

3.NSLookup命令可以确定正在使用哪个DNS服务器

56.HTTP的请求报文和响应报文包含哪些部分?

请求报文包含3部分。

请求行:请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。协议名称及版本号。

请求头:HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。与缓存相关的规则信息,均包含在header中

请求体:要传递的干货

响应行:报文协议及版本; 状态码及状态描述;

响应头:响应报文头,也是由多个属性组成;

响应体:即我们真正要的“干货”

57.HTTP协议中的Content-Length?

Content-Length 是一个实体消息首部,用来指明发送给接受方的消息主体的大小Content-Length == 实际长度:正常显示。Content-Length < 实际长度:在http的响应体中直接被截取了Content-Length > 实际长度:服务端/客户端读取到消息结尾后,会等待下一个字节,自然会无响应直到超时。

58.TIME_WAIT和CLOSE_WAIT的区别?

四次挥手时,先发送FIN报文就会处于TIME_WAIT状态,这个是为了处理第三次挥手时,对方没有收到第四次挥手,从而多次发送第三次挥手(FIN报文)的情况,经过2MSL之后这个状态就会结束。CLOSE_WAIT这个是被动关闭连接方才有的状态。被动方收到FIN报文会立即返回ACK报文表示已接收到断开请求。如果被动关闭连接方还有数据要发送就会进入CLOSE_WAIT状态。

59.什么引起线程切换?

时间片轮转
线程阻塞
线程主动放弃时间片
60.线程切换的开销?

1.直接开销

(1)用户态与内核态的切换

        线程切换只能在内核态完成,如果当前用户处于用户态,则必然引起用户态与内核态的切换。(“用户态与内核态的切换”具体带来什么成本???)

(2)上下文切换

        前面说线程(或者叫做进程都随意)信息需要用一个task_struct保存,线程切换时,必然需要将旧线程的task_struct从内核切出,将新线程的切入,带来上下文切换。除此之外,还需要切换寄存器、程序计数器、线程栈(包括操作栈、数据栈)等。

(3)线程调度算法

        线程调度算法需要管理线程的状态、等待条件等,如果根据优先级调度,则还需要维护优先级队列。如果线程切换比较频繁,该成本不容小觑

间接开销:缓存缺失, 切换进程,需要执行新逻辑。如果二者的访问的地址空间不相近,则会引起缓存缺失

61.Linux的调度器代码什么时候有机会执行?

1. 调用有可能引起调度的调用,从用户态看来,很多系统调用都可以引起调用。内核中最容易引起调度的是schedule()函数,很多其他函数也会调用schedule(),这些函数也会引起调度。引起调度调度器就有机会进行调度判断

2. 中断,无论是IO中断还是时钟中断

3. 异常

62.中断处理过程的五个阶段?

1、中断请求阶段;2、中断判优阶段,有硬件判优和软件判优两种方法;3、中断响应阶段,CPU向中断源发出中断响应信号;4、中断服务阶段;5、中断返回阶段,返回到原程序的断点处,恢复硬件现场,继续执行原程序。

63.如何理解同步和异步?

同步与异步是指访问数据的机制,同步一般指主动请求并等待IO操作完成的方式。
异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知。
同步和异步最大的区别就在于:同步需要等待,异步不需要等待

64.如何理解阻塞与非阻塞?

阻塞与非阻塞是描述线程在访问某个资源时,数据是否准备就绪的一种处理方式。当数据没有准备就绪时:
阻塞:线程持续等待资源中数据准备完成,直到返回响应结果。
非阻塞:线程直接返回结果,不会持续等待资源准备数据结束后才响应结果。

从线程的角度考虑 ,当前线程被挂起,不再抢夺CPU资源时, 则称为线程被阻塞。线程阻塞后,不能做其他操作只能等待。相对应的,非阻塞意味着无须挂起当前线程,可以去执行其他操作。

65.建立索引的原则有哪些?

建立唯一索引。唯一索引能够更快速地帮助我们进行数据定位;
为经常需要进行查询操作的字段建立索引;
对经常需要进行排序、分组以及联合操作的字段建立索引;
在建立索引的时候,要考虑索引的最左匹配原则(在使用SQL语句时,如果where部分的条件不符合最左匹配原则,可能导致索引失效,或者不能完全发挥建立的索引的功效);
不要建立过多的索引。因为索引本身会占用存储空间;
如果建立的单个索引查询数据很多,查询得到的数据的区分度不大,则考虑建立合适的联合索引;
尽量考虑字段值长度较短的字段建立索引,如果字段值太长,会降低索引的效率。

66.python 中的装饰器和闭包?

装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函,并返回包装后的被装饰的函数。@a 就是将 b 传递给 a(),并返回新的 b = a(b)
一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。装饰器就是一种的闭包的应用。通过nonlocal改写父函数中的变量

67.python的内存管理机制?垃圾回收机制?

简单来说python的内存管理机制有三种

1)引用计数:引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。

2)垃圾回收

        1.引用计数:同上

        2.标记清除:先标记对象,再清除对象。即先检测,再回收。可以解决循环引用的问题

        3.分代回收:分代回收是建立在标记清除的基础上的。我们不可能一直去标记清除,会带来很大的开销。就要想办法减少标记清除的频率。就将对象分为三代,根据阀值回收

3)内存池:当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。

68.python新式类和旧式类?

object 是 Python 为所有对象提供的父类,默认提供一些内置的属性、方法;可以使用 dir 方法查看 新式类自动继承 object 类,拥有 object 类的属性、方法 。旧式类没有继承 object 类

69.py2和py3的继承方式不同?

python2中经典类和新式类的继承方式不同,经典类采用深度优先搜索的继承,新式类采用的是广度优先搜索的继承方式

python3中经典类和新式类的继承方式都采用的是都采用广度优先搜索的继承方式

70.什么是哈希冲突?如何解决哈希冲突?

在采用哈希函数对输入域进行映射到哈希表的时候,因为哈希表的位桶的数目远小于输入域的关键字的个数,所以对于输入域的关键字来说,很可能会产生一个关键字映射到同一个位桶中的情况,这种情况就就叫做哈希冲突。

1.开放定址法 2.再哈希法 3.链地址法 4.建立公共溢出区

71.内网穿透?

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。

72.C/S架构和B/S架构的区别?
(1)C/S架构的程序需要安装客户端软件,而B/S架构只需要一个浏览器即可。

(2)C/S的客户端更加友好,支持的技术非常多,支持很多,也就意味着功能非常丰富;B/S只是依赖一个局限的前端技术。

(3)C/S的维护成本高,B/S维护成本低。

(4)B/S架构的程序对服务端性能要求更高,程序在服务端,C/S架构可以将部分的压力转移到客户端

73.什么是DMA方式?它与中断方式的主要区别是什么?
DMA是直接存储器存取。DMA传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。它和中断的主要区别在于,DMA只需要CPU在开始和完成传输时进行干预,其他时候不需要CPU干预。

DMA方式,外部设备与计算机主存之间直接进行数据交换,而无需经过CPU。中断需要CPU停下手中的工作,保护现场去处理中断。

74.BIO、NIO、AIO区别?

网络IO模型有BIO、NIO、AIO 

BIO:同步阻塞IO。
NIO:同步非阻塞IO。
AIO:异步非阻塞IO。

BIO:同步并阻塞,服务器启动一个连接一个线程,适用于并发量要求不高的场景。(当你5岁时,做事还不懂的变通,你妈妈让你去烧两壶水,你那时还比较单纯(一根筋),你就先坐一壶水,就在这一直等着,也不敢动,烧开一壶,再去烧下一壶)
NIO:同步非阻塞,服务器实现模式为一个请求一个线程,适用于高并发量要求的场景 。(当你长大一点了8岁的时候,学了一点知识聪明了的时候,你妈妈又让你去烧两壶水,你就会把两壶水都坐上,哪壶水烧开了,你就去处理哪壶水)
AIO:异步非阻塞 ,服务器实现模式为一个有效请求一个线程 ,技术不算成熟,应用场景不算多。(当你12岁的时候,你妈妈让你烧两壶水,你和你妈妈提意见要买一个烧开水自动提示的水壶,然后你把两壶水坐上之后,自己打游戏去了,烧开水之后,水壶提示你水开了需要去处理了)

75. BIO为什么是同步阻塞IO,他阻塞的是谁跟谁之间的关联?
首先在网络编程中,客户端给服务端发送消息大约分为两个个步骤。
1、发起连接。
2、发送数据。
在BIO中每一个连接都需要分配一个线程来执行,假如A客户端连接了服务器,但是还没有发送消息,这个时候B客户端向服务器发送连接请求,这个时候服务器是没有办法处理B客户端的连接请求的。

76. NIO他是怎么实现一个线程处理多个连接请求和多个请求数据的呢?

NIO会将获取的请求连接放入到一个数组中,然后再遍历这个数据查看这些连接有没有数据发送过来

77 .AIO有什么特点呢?

AIO是异步非阻塞,他对于客户端的连接请求和发送数据请求是用不同的线程来处理的,他是通过回调来通知服务端程序去启动线程处理,适用于长连接的场景。

78. 什么是生产者消费者模型

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

79.单例模式?

单例,顾名思义,就是单个实例。整个应用程序只需要一个实例即可。避免用户new多个没用的对象。提高了系统性能。

优点:

  1. 提供了对唯一实例的受控访问。
  2. 由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
  3. 允许可变数目的实例。
  4. 避免对共享资源的多重占用。

缺点:

  1. 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
  2. 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
  3. 单例类的职责过重,在一定程度上违背了“单一职责原则”

懒汉模式:重点是。系统运行初期并不把该单例对象实例化,而是等第一次使用的时候再进行实例化。就像你平时懒得学习,非要等到考前才学一样

饿汉模式:重点是饿,也就是饥渴。还没到用的时候,就先实例化了,等到用的时候直接就可以用了。就像平时对知识很饥渴,学好了,然后直接面试就行了。

80.那些地方用到了单例模式?


应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显
示。
Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
 

81.设计模式的六大原则

  • 开放封闭原则(Open Close Principle)

  • 里氏代换原则(Liskov Substitution Principle)
  • 依赖倒转原则(Dependence Inversion Principle)
  • 接口隔离原则(Interface Segregation Principle)

  • 单一职责原则

82.什么是设计模式?
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

83.工厂模式分类?

  • 工厂模式分为简单工厂、工厂方法、抽象工厂模式,利用工厂模式可以降低程序的耦合性

84.负载均衡、分类?​​​​​​​

负载均衡其实就是任务的分发,使得任务能按照你的预想分配到各个计算单元上,它能提高服务对外的性能,避免单点失效场景

负载均衡常见的有:软件负载均衡、硬件负载均衡、DNS负载均衡。

85.讲一下什么是负载均衡,什么是轮询策略、随机策略、哈希策略?

负载均衡可以分为两种

  • 一种是请求负载均衡,即将用户的请求均衡地分发到不同的服务器进行处理;
  • 另一种是数据负载均衡,即将用户更新的数据分发到不同的存储服务器。

轮询策略

轮询策略是一种实现简单,却很常用的负载均衡策略,核心思想是服务器轮流处理用户请求,以尽可能使每个服务器处理的请求数相同。

随机策略

随机策略也比较容易理解,指的就是当用户请求到来时,会随机发到某个服务节点进行处理,可以采用随机函数实现。

哈希和一致性哈希策略

无论是轮询还是随机策略,对于一个客户端的多次请求,每次落到的服务器很大可能是不同的,如果这是一台缓存服务器,就会对缓存同步带来很大挑战。尤其是系统繁忙时,主从延迟带来的同步缓慢,可能会造成同一客户端两次访问得到不同的结果。解决方案就是,利用哈希算法定位到对应的服务器。

86.悲观锁和乐观锁?

悲观锁

顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。

乐观锁

反之,总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据

使用场景:乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。​​​​​​​

87.HTTP各版本的区别?

HTTP:HTTP协议是超文本传输协议的缩写,是用于从万维网传输超文本到浏览器的传输协议。

HTTP基于TCP/IP通信协议来传递数据(HTML文件,图片文件、查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

HTTP0.9: HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。
HTTP1.0: 增加了请求方式POST和HEAD;不再局限于0.9版本的HTML格式,根据Content-Type可以支持多种数据格式,但是1.0版本的工作方式是每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。

HTTP1.1: 1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。解决了1.0版本的keepalive问题,1.1版本加入了持久连接,一个TCP连接可以允许多个HTTP请求;加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率

HTTP2.0:

(1)二进制传输:http2.0将请求和响应数据分割为更小的帧,并且它们采用二进制编码(http1.0基于文本格式)。多个帧之间可以乱序发送,根据帧首部的流表示可以重新组装。

(2)Header压缩:Http2.0开发了专门的“HPACK”算法,大大压缩了Header信息。

(3)多路复用:http2.0中引入了多路复用技术,很好的解决了浏览器限制同一个域名下的请求数量的问题。多路复用技术可以只通过一个TCP链接就可以传输所有的请求数据。

(4)服务端推送:HTTP2.0在一定程度上改不了传统的“请求-应答”工作模式,服务器不再完全被动地响应请求,也可以新建“流”主动向客户端发送消息。(例如,浏览器在刚请求html的时候就提前把可能会用到的JS,CSS文件发送给客户端,减少等待延迟,这被称为“服务端推送Server Push”)

HTTP3.0: HTTP3.0的底层支撑协议QUIC基于UDP实现,又含TCP的特点,实现了又快又可靠的协议。QUIC (Quick UDP Internet Connections), 快速 UDP 互联网连接。QUIC是基于UDP协议的。

88.CPU的工作过程?

CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。

89.什么是微服务?
维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。

90.TCP/IP五层模型?

分为:应用层,传输层,网络层,链路层,物理层
其中上层需要遵循下层的协议,下面四层的协议是网络早期设计的,上层应用需要下层所提供的网络来完成自己的需求.

应用层:负责进程间的沟通;可自己定义,或者使用一些知名协议 -------HTTP;文件传输协议(FTP)等。网络编程主要就是针对应用层.

传输层:负责两台主机之间的数据传输, 能够确保数据可靠的从源主机发送到目标主机.;------- TCP/UDP协议,

网络层:负责地址管理与路由选择;转发设备–>路由器;--------IP协议(有源端IP,对端IP信息)。

链路层:负责设备之间的数据帧的传送和识别. 

物理层: 负责光/电信号的传递方式. 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值