我是靠谱客的博主 曾经铃铛,最近开发中收集的这篇文章主要介绍测开面经汇总测试计算机网络操作系统JAVA框架:Linux数据库Python智力题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

测试

计算机网络

操作系统

JAVA

Linux

数据库

Python

智力题


(答案为网络搜索结果整理汇总,因涉及到的源众多故不一一标明出处)

测试

功能、性能、安全、兼容性、易用性

1、微信发送语音的测试用例

2、黑盒测试与白盒测试的区别及方法 

3、搜索功能测试

4、视频通话功能

5、百度首页的测试用例设计

6、测试点赞功能。(抖音点赞,微信点赞)

7、抖音出现白屏是怎么回事

8、微信发红包

9、用户登录测试

10、App崩溃的原因

        (1)软件本身代码错误

          (2)  当前用户过多,App崩溃

        (3)内存容量不足,或方位到未授权的内存位置

        (4)网络变化影响到App的稳定

         (3)第三方服务,广告或软件弹出导致App崩溃

前提不同:白盒是已知程序的内部实现结构,黑盒是不考虑内部实现结果

测试方式方法不同

黑盒:等价类划分法-将程序所有可能的输入数据划分为若干个等价类。然后从每个部分中选取具有代表性的数据当做测试用例

        边界值分析法-输入和输入等价类中那些恰好处于边界、或超过边界、或在边界以下的状态。

        流程分析法(即场景分析)-每一条流程路径一条测试用例

        正交实验法-从因素及因素的取值采用正交来确定所有组合,从何覆盖所有情况。-适用于配置测试及多条件筛选

        状态迁移法-通过分析完成状态迁移图,根据状态迁移图完成状态转换树。按照一个分支一条用例编写。

        错误猜想法

白盒:

静态测试:不用运行程序的测试,包括代码检查、静态结构分析、代码质量度量、文档测试等等,它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具(Fxcop)自动进行。

动态测试:需要执行代码,通过运行程序找到问题,包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。

白盒测试中的逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。

<1>如果我打不开一个网页,是什么原因?

<2>unittest 的 fixture , setup和teardown的作用?

App安全测试

       

计算机网络

过程:

  • 客户端发送FIN报文给服务器端,并进入到FIN-WAIT1阶段,该FIN报文包括首部字段控制位FIN=1,序列号seq=u,告诉服务器我已完成我的数据传输工作,你这边如果还有数据可以继续传送; 
  • 服务器收到该FIN报文之后进入close-wait阶段,并返回一个确认报文给客户端,该确认报文包括首部控制位ACK=1,seq=v,ack=u+1。客户端收到该确认报文后进入fin-wait2状态,关闭从客户端到服务器端的数据传送。服务器端仍可向客户端传送数据; 
  • 服务器端完成对客户端的数据传送工作之后,服务器端向客户端发送FIN报文,该报文结构包括FIN=1,ACK=1,序列号为w,确认号为u+1,并进入Last-ACK状态; 
  • 客户端接收到该FIN报文后,返回确认报文,该确认报文包括首部控制位ACK=1,序列号为u+1,确认号为w+1,并进入time-wait阶段,等待2MSL后确认服务器端收到ACK报文正常断开连接后,客户端关闭。服务器端收到该确认报文,进入closed状态。

1、tcp四次挥手中的TIME_WAIT状态存在的理由 

(1)允许老的重复分节在网络中消失(等待timewait断开的原因

TCP大致通过一个四元组来标记一条连接,分别是:源IP、目的IP、源端口、目的端口。假设在一次连接中,部分报文因为某种原因滞留在路由网络中,然后这次连接断开了,再然后客户复用了端口,开启了和当前服务器一次新的连接。此时可以看见,因为客户端复用了端口,而且客户端和服务器短期内IP都不会变,而且服务器通常只会又有一个端口监听。因此当前连接的四元组和上次连接一样。此时假如上一次连接中滞留的报文又恢复传播,那就会进入当前连接中,因为这些报文本不属于本次连接,这可能造成数据混乱。因此,客户端发送了最后的ACK后,本次连接不会再有新的报文产生了,我们只需要在TIME-WAIT阶段等待1 MSL时间,就能让网络上所有滞留报文失效。

(2)实现终止TCP全双工连接的可靠性 (为什么是2msl)

若客户端发送完ACK后直接断开closed,此时ACK在发送过程中丢失,此时服务器回重新发送FIN但客户端已关闭不合理。ACK最长传播时间和等待客户端到服务端滞留报文失效时间共为1 MSL。最坏情况下,ACK经历了1 MSL才到达服务端,假如在ACK到达前一瞬间,服务端重传了FIN并发生了滞留,需要等待1 MSL才可让其失效。因此,在最坏情况下,需要2 MSL才可让双向的滞留报文失效。1 MSL+1 MSL= 2 MSL

2、输入一个链接,到页面展示会发生什么      

  • 1、输入地址(www.baidu.com)
  • 2、域名解析(DNS)
  • 3、TCP连接(三次握手)
  • 4、客户端发起http请求
  • 5、服务器响应请求
  • 6、浏览器解析html
  • 浏览器解析URL对应的IP地址

DNS解析过程,浏览器缓存—>操作系统缓存—>本地DNS—>根据转发模式选择迭代还是递归查询 

  • 浏览器向服务器发送一个HTTP请求报文

传输层上建立TCP连接,网络层用到了IP协议(负责在网络层传输数据),还会用到RIP或者OSPF进行路由选择,然后用ARP协议解析IP地址对应的MAC地址,使得数据能够在数据链路层上进行传输(不应该是最后到物理层传输吗)。 

HTTP请求方法有哪些(post/get/head/put/delete) 

  • 服务器请求处理并返回一个HTTP响应报文

HTTP响应报文的结构,状态码 

  • 服务器返回一个HTML响应,浏览器收到HTML响应并渲染界面

3、DNS的工作原理

       第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器
  第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
  第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址
  第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
  第五步:重复第四步,直到找到正确的纪录。
  第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

4、 DNS劫持

DNS劫持是破坏域名系统(DNS)查询解析的做法。

(1)通过恶意软件覆盖计算机的TCP/IP配置以指向受攻击者控制的流氓DNS服务器

(2)通过修改受信任的DNS服务器的行为使其不符合互联网标准的实现

5、HTTP的请求报文的形式

6、GET和POST的区别

区别:
(1)传送方式:get通过地址栏传输,post通过报文传输。GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
(2)传送长度:get参数有长度限制(受限于url长度),而post无限制
(3)GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

(4)GET请求只能进行url编码,而POST支持多种编码方式。

(5)GET请求会被浏览器主动cache,而POST不会,除非手动设置。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

(6)对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

(7)get不能改变服务器的数据,一般用于从服务器获取数据,是幂等的;post可以改变服务器的数据,不是幂等的;

7、POST还支持的编码类型

application/x-www-form-urlencoded  

multipart/form-data

application/json

text/xml

8、端口的概念

在网络通信过程中,需要唯一识别通信两端的端点,就是使用端口识别运行于某主机中的应用程序如果没有引入端口,则只能通过 进程号进行识别。进程号是系统动态分配的,不同的系统会使用不同的进程标识符,应用程序在运行之前不知道自己的进程号,如果需要运行后再广播进程号则很难 保证通信的顺利进行。而引入端口后,就可以利用端口号识别应用程序,同时通过固定端口号来识别和使用公共服务,如HTTP和FTP等。顺便提供几个常用的保留端口:TCP常用保留端口:FTP(21),HTTP(80),SMTP(25),POP3(110);UDP常用保留端DNS(53),TFTP(69),SNMP(161)。

9、MYSQL的端口号

mysql的默认端口是3306,可以编辑用户目录下的.my.cnf文件进行修改,

10、HTTP请求方法

GET:获取服务器资源
POST:提交信息给服务器
PUT:传输文件 
HEAD:和GET方法一样,但是只返回响应头部,作用是确定URL的有效性和资源更新的时间
DELETE:删除指定的资源
OPTIONS:查询请求服务器指定的资源所支持的方法
TRACE:用来确认连接过程中发生的一些操作
CONNECT:建立连接渠道,用于代理服务器
PUT但是由于Http/1.1的PUT方法不带验证机制,存在安全性问题,所以一般的网站都不用这个方法来进行文件传输。

Delete该方法也不带认证机制,所以一般网站并不会对它进行开放使用。

11、HTTP状态码从1到5是什么意思

500(服务器内部错误)    服务器遇到错误,无法完成请求。
501(尚未实施)    服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502(错误网关)    服务器作为网关或代理,从上游服务器收到无效响应。
503(服务不可用)    服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504(网关超时)    服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505(HTTP 版本不受支持)    服务器不支持请求中所用的 HTTP 协议版本。


12、TCP和UDP的区别及应用场景

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

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

13、TCP如何保证可靠传输

(1)应用数据被分割成 TCP 认为最适合发送的数据块。

(2)TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

(3)校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

(4)TCP 的接收端会丢弃重复的数据。

(5)流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)

(6)拥塞控制: 当网络拥塞时,减少数据的发送。

(7)ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

(8)超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

14、HTTP和HTTPS的区别

HTTPS 协议(Hyper Text Transfer Protocol Secure),是 HTTP 的加强安全版本。HTTPS 是基于 HTTP 的,也是用 TCP 作为底层协议,并额外使用 SSL/TLS 协议用作加密和安全认证。默认端口号是 443.

即:(1)https的端口是443,而http的端口是80,且两者的连接方式不同;

        (2)http传输是明文的,而https是用ssl进行加密的,https的安全性更高;

        (3)https是需要申请证书的,而http不需要。

15、HTTPS的加密过程

(1)客户端先从服务器获取到证书,证书中包含公钥

(2)客户端将证书进行校验

(3)客户端生成一个对称密钥,用证书中的公钥进行加密,发送给服务器

(4)服务器得到这个请求后用私钥进行解密,得到该密钥

(5)客户端以后发出后续的请求,都使用这个对称密钥进行加密。

(6)服务器收到这个密文也用这个密钥进行解密。

16、TCP三次握手系列

TCP报文结构

TCP报文结构

 TCP连接常规过程

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

过程描述:
        客户端向服务器端发送一个同步报文,该TCP报文的首部控制位SYN=1,序列号随机,这里定为x。客户端发出报文后进入SYN-SENT状态; 

  • 服务器接收到报文进入到SYN-RECIVED状态,并返回一个确认报文给客户端,该TCP报文的首部控制位SYN=1,ACK=1,序列号为y(随机),确认号为x+1 

  • 客户端接收到服务器端传来的确认报文后进入到established状态,并传送一个确认报文的确认给服务器,该报文的首部字段控制位ACK=1,序列号为x+1,确认号为y+1,此时可以携带数据部分。服务器端接收到该报文后进入到established状态

为什么是三次

(1)原因一:防止重复连接

网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。

客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。如果是两次握手的话,不能判断连接是否是历史连接

(2)原因二:同步初始化序列化

TCP通信的双方必须要各自维护一个序列号,通信双方必须要发送各自的初始化序列号才给对方,通过对方的ACK报文确定SYN报文已经接收

三次握手过程中可以携带数据吗?

结论:第一次、第二次握手不可以携带数据,第三次可以携带数据

 首先带有SYN标志的过程包是不可以携带数据的。假如第一次握手可以携带数据的话,如果有人要恶意攻击服务 器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接 收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

半连接队列与全连接队列

在TCP进行三次握手时,Liunx会为其维护两个队列:半连接队列,也叫syn队列;全连接队列,也叫accept队列

在客户端发起第一次连接时,服务端会将其加入到syn队列中,并且响应客户端syn+ack报文,等到客户端发送ack应答报文时,服务端将该连接从半连接队列中取出,并新建一个新的连接,加入到accept队列当中。等待进程调用accept请求时,将该连接取出来

在这里插入图片描述

SYN攻击 

SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击

预防SYN攻击

(1)增大半连接队列

(2)开启tcp_syncookies功能
开启tcp_syncookies就可以在不使用syn半连接队列的情况下建立连接
syncookies在接收到客户端的syn报文时,计算出一个值,放到syn+ack报文中发出。当客户端返回ack报文时,取出该值验证,成功则建立连接,将这个连接的信息放进全连接队列中。

(3)减少ack+syn报文的重传次数
因为我们在收到syn攻击时,服务端会重传syn+ack报文到最大次数,才会断开连接。针对syn攻击的场景,我们可以减少ack+syn报文的重传次数,使处于syn_recv状态的它们更快断开连接

17、UDP报文结构

优点:
1、不需要建立连接(不需要三次握手)
2、简单(传输开销小,报文首部短)
3、快,吞吐效率高(不需要等、重传,最多受限于带宽和性能)
缺点:
不可靠(容易丢包)

18、OSI七层模型及其对应的协议

  • 物理层。通过媒介传输比特,确定机械及电气规范。 
  • 数据链路层。将比特组装成帧和点到点的传递。 
  • 网络层。负责数据包从源到宿的传递和网际互连。 
  • 传输层。提供端到端的可靠报文传递和错误恢复。 
  • 会话层。建立、管理和终止会话(绘画协议数据单元)。 
  • 表示层。对数据进行翻译、加密和压缩。 
  • 应用层。允许访问OSI环境的手段。
OSI层功能设备对应TCP/IP协议
应用层用户接口、应用程序(文件传输,电子邮件,文件服务,虚拟终端)网关

TFTP,HTTP(超文本传输协议),HTTPS(超文本传输安全协议),SNMP,FTP(文件传输协议),SMTP(电子邮件传输的协议),DNS(域名解析协议)

Telnet:使用远程计算机上所拥有的本地计算机没有的信息资源,是常用的远程控制Web服务器的方法

表示层数据的表示、压缩和加密(数据格式化,代码转换,数据加密)网关XDP(外部数据表示协议),LPP(轻量级表示协议)
会话层会话的建立和结束(解除或建立与别的接点的联系)网关SSL(安全套接字层协议)/TLS(传输层安全协议),RPC(远程过程调用协议)
传输层提供端对端的接口网关TCP,UDP
网络层为数据包选择路由,寻址路由器、三层交换机IP(互联网协议),ICMP(互联网控制信息协议),RIP(路由信息协议),OSPF(开放最短路径优先协议),BGP,IGMP(互联网组管理协议)
数据链路层保证误差错的数据链路,传输有地址的帧以及错误检测功能交换机、网桥、网卡SLIP,CSLIP,PPP,ARP(地址解析协议),RARP(逆向地址解析协议),MTU
物理层传输比特流,以二进制数据形式在物理媒体上传输数据集线器、中继器ISO2110,IEEE802,IEEE802.2

19、http请求连接的过程

HTTP 是应用层协议,它以 TCP(传输层)作为底层协议,默认端口为 80. 通信过程主要如下:

(1)服务器在 80 端口等待客户的请求。

(2)浏览器发起到服务器的 TCP 连接(创建套接字 Socket)。

(3)服务器接收来自浏览器的 TCP 连接。

(4)浏览器(HTTP 客户端)与 Web 服务器(HTTP 服务器)交换 HTTP 消息。

(5)关闭 TCP 连接。

在这里插入图片描述

20、 HTTP 与 HTTPS 的区别

  • HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
  • 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
  • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
  • http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
  • HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

 21、SSL非对称加密技术 及数字证书

22、 Session和Cookie的区别?

session和cookie是什么:

首先它们都是用于给无连接的http提供身份认证的功能 

  • cookie是服务器在本机存放的小段文本,并随每一个请求发送至同一服务器。cookie分为会话cookie(不设置过期时间,关闭浏览器窗口cookie即失效,保存在内存中)和持久cookie(设置过期时间,关闭再打开浏览器cookie仍存在,直至达到过期时间)。类似于检查通行证(即请求报文中附带的cookie)来确定用户身份 

  • session则一般是利用session id实现的(session id是浏览器第一次发送请求时服务器自动生成的唯一标识,并返回给浏览器),cookie中携带该session id,客户端根据该session id将session检索出来。类似于在服务器上建立一个客户档案,客户来访时需要查询客户档案

区别 

(1)数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。

(2)安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

(3)服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

(4)数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

(5)信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

23、滑动窗口原理

(1)在窗口中的包会不断发送,直到将窗口中的包全部发送完

(2)已收到ACK确认的包,窗口向后移动。

(3)若超过了阈值时间则需要重传包

作用:   

 (1) 提供TCP可靠性:对发送的数据进行确认
 (2)流量控制:窗口大小随链路变化

24、拥塞控制是和滑动窗口的区别

滑动窗口:是接收端进行的流量控制。流量控制是为了控制发送方的发送速率,保证接收方来得及接收信息。发送方和接收方都有一个缓存队列,接收方发送确认报文的时候都会携带上要求发送方的流量窗口大小。当接收方的缓存队列已经满的时候,接收方在发送确认报文的时候,会减小窗口大小,是发送发下一次发送更少的数据。因为这个窗口时动态改变大小的,所以叫滑动窗口。
拥塞控制:也是对流量 的控制,是发送方主动发起的。拥塞控制主要是解决网络中的流量过大超过了资源所能利用的部分,对所有的主机、路由器 造成影响。

25、HTTP 协议一共有五大特点

(1)支持客户/服务器模式。

(2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。

(3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。

(4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

(5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

26、HTTP协议和Socket区别,哪个协议更高效? 

(1)很多情况下,需要服务端主动向客户推送数据,保持客户端与服务端数据的实时与同步。但HTTP无法满足这一需求,Socket可以满足。

原因如下:

  • HTTP连接使用“请求—响应”方式。不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务端才能回复数据。 

    若建立的是HTTP连接,则服务端需等到客户端发送一次请求后,才能将数据传回给客户端。 

  • 此时若双方建立的是Socket连接,服务器就可直接将数据传送给客户端; 

    Socket连接一旦建立,通信双方即可相互发送数据内容,直到双方连接断开。 

(2)创建Socket连接时,Socket可支持不同的传输层协议(TCP或UDP)。而HTTP只能基于TCP。

  • Socket不仅能走TCP,还能走UDP。当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。 
  • 同HTTP不同的是,HTTP只能基于TCP。 

(3)Socket效率高,至少不用解析HTTP报文头部的一些字段。

27、什么是IP地址和MAC地址?为啥有了IP地址还需要MAC地址

  • MAC地址是网络中每个设备都有的唯一网络标识,全世界唯一。 
  • IP地址只是逻辑上的标识,任何人都能随意修改,因此不能具体标识一个用户,但MAC地址固化在网卡里,防止被盗用。 
  • 但是如果只用MAC地址的话,因为MAC地址无序杂乱,没有明显规则,难以查找。但是IP是分层的,类似通讯地址,可以根据其网络号找到子网再定义主机,逐级查找,每个设备需要存储的信息较少

28、MAC地址与IP地址的区别

  • 长度不同,IP地址一般为32位(IPv6 128位),MAC地址则是48位 
  • 分配依据不同,IP地址分配基于网络拓扑,能够根据需要改动设备的IP地址,但是MAC地址的分配是基于制造商,在网卡中烧录好,一般不轻易改变 
  • 寻址协议层不同,IP地址应用于网络层,MAC地址应用于数据链路层(数据链路层基于MAC地址转发数据帧,数据链路层的交换机根据其MAC地址记录表中的MAC地址及其对应的端口,将其发送到MAC地址对应的端口,否则广播;网络层则根据IP地址转发报文,路由器根据路由表转发到对应端口,否则发送默认路由)

操作系统

1、进程通信的方法 :管道、消息队列、共享内存、信号量、信号、Socket

2、 进程与线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享进程的方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

3、多进程和多线程区别

多进程:操作系统中同时运行的多个程序

多线程:在同一个进程中同时运行的多个任务

多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

4、僵尸进程、孤儿进程、守护进程

孤儿进程: 子进程未运行结束,父进程却提前计数,这时子进程将会成为孤儿进程被init进程收养。init进程会完成对孤儿进程的回收工作,孤儿进程对系统没有危害。
僵尸进程: 子进程运行结束,父进程没有为SIGCHLD信号设置处理函数,或者调用wait()/waitpid()函数对其进程回收,成为系统中的僵尸进程。僵尸进程会占用系统中有限的进程号,导致系统无法创建新进程。因此,僵尸进程对系统有危害

僵尸进程的危害:僵尸进程会一直占用进程号,僵尸进程过多,可能导致进程号被耗尽使得系统无法创建新得进程。

5、页面置换算法

(1)最佳页面置换算法(optimal OPT)

淘汰的页面是以后再也不用或者相比较而言长时间不用的页面。现实中是无法实现的

(2)先进先出页面置换算法(first in first out, FIFO)

置换时 选择在内存中驻留时间最长的页并淘汰之,即淘汰的页面是最先进入的

(3)最近最久未使用页面置换算法(least recently used, LRU)

将 “ 最近的过去 ” ,作为 “ 最近的将来 ” ,选择最近最久未用的页面予以淘汰

6、死锁的四个必要条件

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

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

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

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

7、解决死锁的方法

解决死锁的方法可以从多个角度去分析,一般的情况下,有预防,避免,检测和解除四种
预防死锁:破坏死锁的四个条件中的一个或多个来预防死锁。但不能破坏互斥条件,其他三个都可。

        破坏请求和保持条件:一次性申请所有资源,之后不再申请资源,如果不满足资源条件则得不到资源分配。
        破坏不可剥夺条件:当一个进程获得某种不可抢占资源,提出新的资源申请,若不能满足,则释放所有资源,以后需要,再次重新申请。
        破坏循环等待条件:对进程进行排号,按照序号递增的顺序请求资源。若进程获得序号高的资源想要获取序号低的资源,就需要先释放序号高的资源。

避免死锁:和预防死锁的区别就是,在资源动态分配过程中,用某种方式阻止系统进入不安全状态。比如银行家算法。

        将系统的状态分为 安全状态 和 不安全状态 ,每当在未申请者分配资源前先测试系统状态,若把系统资源分配给申请者会产生死锁,则拒绝分配,否则接受申请,并为它分配资源。(利用银行家算法)
检测死锁:允许系统在运行过程中发生死锁,但可已设置检测机构及时检测死锁的发生,并采取适当措施加以清除。
解除死锁:发生死锁后,采取适当措施将进程从死锁状态中解脱出来。解除死锁主要方法:资源剥夺法,撤销进程法,进程回退法。

(1).资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
(2)终止(撤销)进程:强制将一个或多个死锁进程终止(撤销)并剥夺这些进程的资源,直至打破循环环路,使系统从死锁状态中解脱出来。撤销的原则可以按照进程的优先级和撤销进程代价的高低进行。
(3)进程回退:让一个或多个进程回退到足以避免回避死锁的地步,进程回退时资源释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

8、操作系统常用的调度方法

  • 先来先服务调度算法(FCFS)
  • 短作业/短进程优先算法(SJF/SPF)
  • 时间片轮转调度算法(RR)
  • 高响应比优先调度算法(HRRF)
  • 多级反馈队列调度算法(MLFQ)

JAVA

Java与Python的区别

1、接口和抽象类的区别  

A:成员的区别
抽象类:
构造方法:有构造方法,用于子类实例化使用。
成员变量:可以是变量,也可以是常量。
成员方法:可以是抽象的,也可以是非抽象的。

接口:
构造方法:没有构造方法
成员变量:只能是常量。默认修饰符:public static final
成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract (推荐:默认修饰符请自己永远手动给出)
jdk1.8可以写以default和static开头的具体方法

B:类和接口的关系区别
类与类:
继承关系,只能单继承。可以多层继承。

类与接口:
实现关系,可以单实现,也可以多实现。
类还可以在继承一个类的同时实现多个接口。

接口与接口:
继承关系,可以单继承,也可以多继承。

C:体现的理念不同
抽象类里面定义的都是一个继承体系中的共性内容。
接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。

2、多态的底层原理

多态(通过声明父类的引用变量来使用子类对象)的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。动态绑定的实现主要依赖于方法表,当需要执行时是查找堆上真正创建的对象的类的方法。

3、线程池

线程池的作用:

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

创建线程池:建议通过 ThreadPoolExecutor创建,明确线程池的运行规则,规避资源耗尽的风险

        (1)方式一:通过构造方法实现,对线程池进行不同的设置

        (2)方式二:通过 Executor 框架的工具类 Executors 来实现

  • FixedThreadPool : 固定线程数量的线程池。
  • SingleThreadExecutor: 只有一个线程的线程池。
  • CachedThreadPool: 线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。

线程池原理:

 

 4、StringBuilder类 和 StringBuffer类的区别

  • StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储

  • StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储

5、什么情况下会产生内存泄漏

 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已无用。即无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间浪费。

内存泄漏的情况

(1)长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。

静态集合类

public class MemoryLeak {
    static List list = new ArrayList();
 
    public void oomTests() {
        Object obj = new Object();
        list.add(obj);
    }
}

 单例模式

因为单例的静态特性,它的生命周期和JVM的生命周期一样长,所以如果单例对象如果持有外部对象的引用,那么这个外部对象也不会被回收,那么就会造成内存泄漏。 

内部类持有外部类

如果一个外部类的实例对象的方法返回了一个内部类的实例对象。这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象也不会被垃圾回收,从而导致内存泄漏。

(2)各种连接

 在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用的时候,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。

(3)变量不合理的作用域

变量不合理的作用域。一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为null,很有可能导致内存泄漏的发生。

(4)改变哈希值

对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象

(5)缓存泄漏

 一旦把对象引用放入到缓存中,就很容易遗忘。对于这个问题可以使用WeakHashMap代表缓存,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值。

(6)监听器和回调

如果客户端在你实现的API中注册回调,却没有显示的取消,那么就会积聚。需要确保回调立即被当作垃圾回收的最佳方法就是只保存它的弱引用,例如将他们保存为WeakHashMap中的键。

6、 - [ ] 申请内存的整个申请流程
- [ ] 堆是怎么申请内存的

7、JAVA语言的特性:封装性、继承性、多态性和抽象性

8、面向对象三大特性: 封装, 继承, 多态

9、java的输入输出流类型:字节流和字符流

10、反射

赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。动态代理的实现也依赖反射。注解 的实现也用到了反射

11、代理模型:使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

静态代理和动态代理的对比

(1)灵活性 :动态代理更加灵活,不需要必须实现接口,可以直接代理实现类(CGLIB动态代理独有),并且可以不需要针对每个目标类都创建一个代理类。另外,静态代理中,接口一旦新增加方法,目标对象和代理对象都要进行修改,这是非常麻烦的!

(2)JVM 层面 :静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。而动态代理是在运行时动态生成类字节码,并加载到 JVM 中的

JDK 动态代理和 CGLIB 动态代理对比

(1)JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。

(2)就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显。

12、自己实现一个测试函数相比,JUnit有什么特别之处

13、Java异常处理机制

 14、Java的垃圾回收机制

 >>哪些对象需要被回收

        (1)引用计数法:给对象中添加一个引用计数器;每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。

        (2)可达性分析算法
通过一系列的称为 "GC Roots" 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。此算法解决了上述循环引用的问题。

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 本地方法栈(Native 方法)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 所有被同步锁持有的对象

>> 垃圾收集算法

  1. 标记-清除算法:标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。效率问题、空间问题(标记清除后会产生大量不连续的碎片)
  2. 复制算法:将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
  3. 标记整理算法:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
  4. 分代收集算法:

    只是根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

    比如在新生代中,每次收集都会有大量对象死去,所以可以选择”标记-复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

15、Apache和Nginx区别

        两者都是web服务器

         Apache:稳定、对动态请求处理强,但同时高并发时性能较弱,耗费资源多。

         Nginx:高并发处理能力强、擅长处理静态请求、反向代理、均衡负载。

16、四层负载均衡和七层负载均衡区别在哪里

四层负载均衡具体实现方式为:通过报文中的IP地址和端口,再加上负载均衡设备所采用的负载均衡算法,最终确定选择后端哪台下游服务器。以TCP为例,客户端向负载均衡发送SYN请求建立第一次连接,通过配置的负载均衡算法选择一台后端服务器,并且将报文中的IP地址信息修改为后台服务器的IP地址信息,因此TCP三次握手连接是与后端服务器直接建立起来的。

七层服务均衡在应用层选择服务器,只能先与负载均衡设备进行TCP连接,然后负载均衡设备再与后端服务器建立另外一条TCP连接通道。因此,七层设备在网络性能损耗会更多一些。

17、正向代理与反向代理概述

正向代理代理的是客户端,需要在客户端配置,我们访问的还是真实的服务器地址

反向代理代理的是服务器端,客户端不需要任何配置,客户端只需要将请求发送给反向代理服务器即可,代理服务器将请求分发给真实的服务器,获取数据后将数据转发给你。隐藏了真实服务器,有点像网关。

18、服务器上Nginx状态

使用ps -ef|grep nginx命令查询进程在进行筛选,即可查看nginx的状态。

19、JAVA内存区域在这里插入图片描述

 20、常见的垃圾回收器

21、CMS收集器和G1收集器的区别

22、为什么强引用会造成内存泄漏?

内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放。结果导致一直占据该内存单元,我们和程序都无法再使用该内存单元,直到程序结束,这是内存泄露。

强引用:只有要时存活状态,就不会回收。直到程序结束。

软引用:在系统 将要发生内存溢出异常之前会进行回收

弱引用:在下一次垃圾收集被回收

而强引用只有要时存活状态,就不会回收。直到程序结束。在程序中长生命周期的对象持有短生命周期对象的引用,此为强引用故无法被回收导致内存泄漏。

 23、int与Integer的区别

24、创建线程的三种方法的区别

一共有三种方式

第一种继承Tread类,重写run方法。使用时仅需

        1创建对象,

        2调用start方法

第二种实现Runnable接口,重写run方法。使用时

        1创建对象

        2将对象作为构造器参数传入Tread类实例对象,此对象为真正的线程对象,

        3调用线程对象的start()方法启动线程

第三种实现Callable接口,重写call()方法。使用时

        1创建创建callable接口实现类的对象

        2将此实例对象作为FutureTask构造器参数,创建FutureTask对象

        3将FutureTask的对象作为Tread类构造器参数,创建Tread对象。

        4、启动Start()FutureTask对象的get方法可以获取子线程结束的返回值。

区别(1)第一种继承Tread的方式,因java为单继承,继承便不能继承其他类。不如实现接口灵活。

(2)线程池只能放入实现Runable或callable类线程

        不能直接放入继承Thread的类。因为Tread实现线程时,线程和线程所要执行的任务是捆绑在一起的。而线程池用我们利用池中线程去执行任务。任务和线程不能是一对一绑定的。

(3)第二种与第三种的主要区别,call()有返回值且可以抛出异常。而run()不可以。

25、父类子类的实例化顺序

       ( 1) 父类中静态成员变量和静态代码块

        (2) 子类中静态成员变量和静态代码块

        (3) 父类中普通成员变量和代码块,父类的构造函数

        (4) 子类中普通成员变量和代码块,子类的构造函数

26、关于内存溢出和内存泄漏

(1)内存泄漏与内存溢出的区别:

        内存溢出是指:程序在申请内存空间时没有足够的内存空间。分为上溢和下溢

        内存泄漏是指:是程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重。内存泄漏最终会导致内存溢出。

(2)内存泄漏的内类

                1':常发性内存泄漏。发生内存泄露的代码会多次执行,且每次执行都会导致一块内存泄漏。

                2':偶发性内存泄漏。发生内存泄漏的代码只有在某些特定的环境或操作过程下才会发生。

                3':一次性内存泄漏。发生内存泄漏的代码只会执行一次

                4':隐式内存泄漏。程序运行的过程中不停的分配内存,但直到结束的时候才释放内存。因释放资源不及时可能最终导致耗尽系统的所有内存。

(3)内存溢出和内存泄漏重点排查点

        1':检查数据库查询中是否一次获取了全部查询。因一般上线前数据库数量少,上线后数据库数量多,若一次取太多数据到内存就会引起内存溢出。

        2':检查代码是否有死循环或递归调用。

        3':检查是否有大量循环长生新对象实体

        4':检查list,MAP等集合对象是否有使用完未清除的问题。list,map等集合对象始终存有对对象的引用使GC不能回收这些对象。

27、为什么重写equals就要重写hashcode方法

hashcode默认生成的code为每个对象内存地址信息相关内容,故每个对象的hashcode都不一样。equals重写后值相等的hashcode就应该是相等的,与原hashcode内容不符。

 

框架:

Spring

1、@Autowired 和 @Resource 的区别是什么?

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
  • 当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource可以通过 name 属性来显示指定名称。

2、Bean的生命周期
        (1)通过构造器创建 bean 实例(无参数构造)
        (2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
        (3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
        (4)bean 可以使用了(对象获取到了)
        (5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

3、IOC控制反转

        控制 :指的是对象创建(实例化、管理)的权力

        反转 :控制权交给外部环境(Spring 框架、IoC 容器)

4、

MyBatis

1、延迟加载

2、

Linux

1、怎么在文件里查找特定单词

2、Linux的硬链接和软链接

linux系统中inode号是一一对应的关系。

硬链接:可以用不同的名称访问同一个文件(故不同名称看到的文件内容是一致的),必须在同一个分区,删掉一个相当于只是删掉了别名,此文件还是在。

软连接:可以不在一个分区,只有一个最本质的源文件。删掉源另一个也就失效了。源文件有100M 链接文件可能只有几十K。链接文件只是访问源文件的一个跳板。

(1)软连接,以路径的形式存在。类似于Windows操作系统中的快捷方式。硬链接,以文件副本的形式存在。但不占用实际空间

(2)软连接可以 跨文件系统 ,硬连接不可以

(3)软连接可以对一个不存在的文件名进行连接

(4)软连接可以对目录进行连接。硬链接普通用户不可以对目录进行链接,超级用户可以

(5)软链接节省空间资源

数据库

1、数据库的索引类别

(1)主键索引(Primary Key) 数据表的主键列使用的就是主键索引。一张数据表有只能有一个主键,并且主键不能为 null,不能重复。

(2)二级索引又称为辅助索引。唯一索引,普通索引,前缀索引等索引属于二级索引。

  1. 唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
  2. 普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
  3. 前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
  4. 全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。

2、聚簇索引与的非聚簇索引

聚簇索引:即索引结构和数据一起存放的索引。主键索引属于聚集索引。

非聚簇索引:即索引结构和数据分开存放的索引。二级索引属于非聚集索引。

3、SQL优化

4、四大事务ACID 

事务:由一组sql语句组成的逻辑处理单元,事务具有以下4个属性,通常简称事务的ACID属性。

  • 原子性(Atomicity):
    事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行。

  • 一致性(Consistent):
    在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须正确的

  • 隔离性(Isolation):
    数据库系统提供一定的隔离机制,保证事务在不受外部并发操作的影响的“独立”环境执行。这意味着事务处理过程中间状态对外部都是不可见的,反之亦然。

  • 持久性(Durable):
    事务完成后,它对于数据的修改时是永久的,即使出现系统的故障也能保持。

5、事务隔离级别

  • 脏读(Drity Read)
    某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

  • 不可重复读(Non-repeatable read)
    在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(update 和 delete 引起)

  • 幻读(Phantom Read)
    在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。(由 insert 引起)

6、锁的类型

(1)表级锁和行级锁  

  • 表级锁: MySQL 中锁定粒度最大的一种锁,是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM 和 InnoDB 引擎都支持表级锁。
  • 行级锁: MySQL 中锁定粒度最小的一种锁,是针对索引字段加的锁,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

(2)共享锁和排他锁

        不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类:

  • 共享锁(S 锁) :又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
  • 排他锁(X 锁) :又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。

(3)意向锁

        意向锁是表级锁,共有两种:

  • 意向共享锁(Intention Shared Lock,IS 锁):事务有意向对表中的某些加共享锁(S 锁),加共享锁前必须先取得该表的 IS 锁。
  • 意向排他锁(Intention Exclusive Lock,IX 锁):事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的 IX 锁。

意向锁之间是互相兼容的   

IS 锁IX 锁
IS 锁兼容兼容
IX 锁兼容兼容

意向锁和共享锁和排它锁互斥(这里指的是表级别的共享锁和排他锁,意向锁不会与行级的共享锁和排他锁互斥)。

IS 锁IX 锁
S 锁兼容互斥
X 锁互斥互斥

(4)乐观锁和悲观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

7、 数据库索引失效的原因

8、查找学生中成绩前三的信息

SELECT * FROM test 
WHERE couse = '数学'
ORDER BY score DESC
LIMIT 3

9、InnoDB与MyISAM存储引擎的区别
(1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
(2)InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
(3)InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的
是数据文件的指针。主键索引和辅助索引是独立的。
(4)InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

(5)innodb默认表锁,使用索引检索条件时是行锁,而myisam是表锁(每次更新增加删除都会锁住表)。

  • MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站,存储操作日志。
  • Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如 OA自动化办公系统。

10、一个日志表,字段是用户id、视频id、日期、观看开始时间、观看结束时间,找到观看不同视频次数前5名的用户,注意同一个视频多次观看只算一次

SELECT person_id, count(DISTINCT video_id) as cnt
FROM video_table
GROUP BY person_id
ORDER BY cnt DESC
LIMIT 5

11、回表

如果直接用主键查找,用的是聚集索引,能找到全部的数据。如果我们是用非聚集索引查找,如果索引里不包含全部要查找的字段,则需要根据索引叶子节点存的主键值,再到聚集索引里查找需要的字段,这个过程也叫做回表。

Python

1、python高效于java相比优缺点

2、什么是静态语言和动态语言,Pyhton属于哪种?

3、python的动态内存

4、python的深浅拷贝

5、python的字典是怎么实现的?

6、python的垃圾回收机制

7、python支持多线程

标记清除和引用计数机制比,能解决什么问题?

分代回收的思想,举例

8、装饰器的代码执行顺序

# 执行顺序为:python解释器启动执行装饰器@outter这一行
# 当碰到@函数名时,会调用@后面的函数并且把下面的函数作为参数穿进去
# 如:outter(index),并执行这个函数,会返回wrapper,就是wrapper的内存地址
# 所有函数index就变成了wrapper(wrapper伪装成了index),下面是正式调用index
# 因为index已经变成了wrapper,所以会直接调用wrapper
# 并且执行完会返回到函数调用处,接着往下执行

9、python单例模型实现

智力题

1、25个人,每5个人一个跑道,最少经过几次比赛,得到前三名

25个人,每5个人一个跑道,最少经过几次比赛,得到前三名

第一步:25个人分成5组,每组5人,分别比赛,得出每组的第一名,并对第一名进行排序,为A1, B1, C1, D1, E1;

第二步:,A1, B1, C1, D1, E1进行一次比赛,得出第一名,假设为A1,此时经过6轮比赛,得出第一名;

第三步: 找第二名第三名;首先第一步中D1, E1排除,同时排除对应组所有成员;剩A1, B1, C1三组

第四步: 第二名可能人员是A2,B1; 第三名可能人员是A2,A3, B1,B2, C1

第五步: 综合第四步猜猜,A2,A3, B1,B2, C1进行一轮比赛,得出第二名第三名,此时总共经过7轮比赛;


 

最后

以上就是曾经铃铛为你收集整理的测开面经汇总测试计算机网络操作系统JAVA框架:Linux数据库Python智力题的全部内容,希望文章能够帮你解决测开面经汇总测试计算机网络操作系统JAVA框架:Linux数据库Python智力题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部