关于测试工程师的一些面试心得

一 计算机网络

(1)TCP怎么保证可靠性传输,流量控制和拥塞控制解释

Tcp 协议保证数据传输可靠性的方式主要有 校验和、序列号、确认应答、超时重传、连接管理、流量控制和拥塞控制。 校验和:在数据传输过程中,将发送的数据都当做一个16位的整数,讲这些数据加起来,并且前面的进位不能丢弃,补在后面最后取反,得到校验和 发送方:在发送数据之前计算检验和,并进行校验和的填充。  接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。 序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。  确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。 超时重传 流量控制: TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。 TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输

(2)TCP长链接和短连接,优缺点

在http协议1.1版本之后,我们所使用的TCP连接都是属于长连接,其中header中有一个keep-alive字段来表明该连接是属于长链接。长链接可以复用,如果两个应用程序之间有新的数据需要传输,则直接复用这个连接,无需再建立一个新的连接

短链接是指http连接,是指客户端和服务器的一次性数据传输,数据传输完成之后就断开连接。

(3)TCP传输机制

建立可靠的TCP连接 三次握手,连续的ARQ协议连续ARQ协议规定,发送方没法送一个确认,就把发送窗口向前滑动一个分组的位置。当发送方收到第一个分组的确认,就把发送窗口向前移动一个分组的位置。如果已经发送了前5个分组,则现在可以发送窗口内的第6个分组。接收方一般都是采用累积确认的方式。也就是说接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。如果收到了这个分组确认信息,则表示到这个分组为止的所有分组都已经正确接收到了。流量控制、拥塞控制

(4)TCP和UDP区别,udp主要的应用

1.tcp传输需要建立tcp连接,是1对1进行传输 2.Udp是不需要建立连接,是可以1对1 也可以1对多进行传输 3.首部字节开销,udp开销较小 4.Tcp数据传输稳定,udp不稳定都是属于传输层的协议 (5)http和https区别 以及https加密的具体细节 https协议是通过ssl来实现数据传输的 主要体现在三个方面1.使用非对称的方式实现秘钥的协商 使用对称加密的方式实现数据传输在ssl握手的时候 服务器和客户端都需要向CA机构申请CA证书 验证双方身份3.数据完整性 在进行数据传输的时候 都要加上mac摘要并签名 接收和发送都需要加上

(5)cookie缓存策略

Expires属性,现在被max-age所代替, 当max-age为正数时,cookie会被浏览器持久化,写入到浏览器缓存中,当正数之间时,该连接可以被复用 当max-age为负数时,cookie不会被持久化,当关闭浏览器,连接就断开 当max-age为0时,表示删除cookie,cookie会从浏览器缓存中删除 1.domain属性 多个web服务器会共享这个cookie 2.path属性 同一个目录下和这个目录下的子目录都共享这个cookie 3.secure属性设置是否只能通过https来传递此条cookie 4.Size cookie大小。 5.http cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie

(6)在浏览器中输入网址,过程

浏览器在输入网址之后会进行DNS解析域名 首先在浏览器缓存中找所对应的IP地址若没有找到在操作系统中进行寻找,没有找到就在网络运营服务商中进行查询所对应IP ,得到IP之后进行三次握手 ,客服端向服务器发送一个SYN码,客户端处于SYN-SENT 状态。然后服务器收到SYN吗回复 SYN+ACK 报文,把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。客户端回复一个应答ack报文,三次握手建立成功 通过三次握手建立TCP连接,然后客户端请求服务端数据,通过接口返回数据,在前端页面展示效果。

应用层协议 http DNS TCP 属于传输层协议 IP属于网络层协议

(7)http和https 区别

https,是属于加密传输 ,试用对称加密的方式获取的秘钥key 试用非对称的加密方式进行数据传输。首先需要再CA机构进行申请CA证书。体现在 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥 数据完整性:内容传输经过完整性校验 身份认证:第三方无法伪造服务端(客户端)身份

(8)session和cookie区别

1. 存放位置,cookie是放在客户端上,session是放在服务器上 2. Session相对cookie更加安全,可以分析本地cookie来进行伪造请求 3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。 4.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

(9)tcp和udp区别

1. tcp是属于可靠性传输是一对一 传输 传输比udp可靠 2. 在传输开始之前,tcp传输需要建立链接 而udp不需要 3. Udp可以实现一对一、一对多传输 4. 传输方式,tcp面向字节流 udp面向报文 5. 首部开销,udp首部开销最小8字节 而tcp首部开销最小20字节

(10)三次握手过程

1.客户端向服务器发送一个SYN码,表示请求建立连接。此时客户端进入到SYN-SEND状态

2.服务器收到这个SYN吗,并回复一个SYN+ACK报文 ,表示收到请求建立连接,并确认连接,此时服务器进入到SYN-RECVD状态

3.客户端再回复一个ACK报文,表示收到服务器发送的确认连接的ACK报文, 三次握手建立成功

(11)为什么不是两次握手,就建立连接

如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话, 服务器端是不知道客户端有没有接收到服务器端返回的信息的。

是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志, 表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

(12)四次挥手

1.客户端向服务器发送一个Fin码,表示请求断开连接,此时客户端不再向服务器发送数据,可以接收服务器的数据 这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

2.服务器向客户端发送一个TCP报文 内容包含一个标记位ACK 表示收到客户端发送的断开连接的请求,服务器进行colse-wait状态

3.服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文, 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。

4.客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中: 标记位为ACK,表示“接收到服务器准备好释放连接的信号”

(13)为什么建立连接可以一次性传输,断开连接要在第二次 第三次进行传输

建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。 释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文, 经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文

(14)在四次挥手中,最后一次客户端为什么要进入到time-wait状态

可靠的断开TCP连接,对于那种因为网络原因导致迟来的TCP报文有足够的时间被识别和丢弃

(15)为什么足够time-wait状态是2MSL?

1、保证服务端的连接能够正确关闭 2、防止收到历史数据,从而导致数据错乱的问题。

操作系统:

(1)进程、线程、协程特点和区别

进程是资源单位,线程是最小的执行单位,协程是基于线程之上是由程序员自己控制的线程也被成为用户空间线程。 协程是为了解决,线程在处理那种I/O操作时,等待数据库返回,没有充分利用CPU进行计算而是处于空转状态,也会带来大量的线程上下文切换所带来的开销。线程的上下文的切换是由操作系统进行处理的,当前流行的办法就是异步回调,让出目前的线程调度,来处理下一任务的方式,可以避免频繁的上下文切换所带来的资源时间、浪费。

(2)进程的调度方式,各自优缺点

进程的三种状态:

1、等待态:等待某个事件的完成; 2、就绪态:等待系统分配处理器以便运行 3、运行态:占有处理器正在运行

调度方式:

剥夺方式:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给他的处理机,将之分配给其他进程,剥夺原则有:优先权原则、短进程优先原则、时间片原则。 非剥夺方式:分配程序一旦吧处理机分配给某进程后便让他一直运行下去,知道进程完成或发生事件而阻塞时,才把处理机分配给另一个进程。

进程调度算法有:

1、先来先服务调度算法(FCFS,first come first served):谁第一个排队,谁就先被执行,在它执行过程中,不会中断它; 2、短作业优先调度算法(SJF,shortest job first):对预计执行时间短的进程有限分配处理机,通常后来的短进程不会抢先正在执行的进程;对长进程非常不利,可能长时间得不到执行。 3、最高响应比优先法(HRRN,highest response radio next):对于FCFS和SJF的平衡,FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF只考虑了执行时间而未考虑等待时间的长短,因此两种算法在某种极端的情况下会带来某些不便。HRRN通过综合这两种情况算出响应比R,根据响应比完成调度。优点:长作业也有机会投入运行,缺点:每次调度前要计算响应比。 4、时间片轮转法(RR,Round-Robin):采用剥夺方式,每个进程被分配一个时间段,按照在队列中的顺序交替执行;不利于处理紧急作业。 5、多级反馈队列(multilevel feedback queue): UNIX使用这种调度算法 ;进程在进入待调度的队列等待时,首先进入优先级最高的Q1中等待;首先调度优先级高的队列中的进程。若高优先级队列中已经没有调度的进程,则调度次优先级队列的进程;同一队列中的各个进程按照时间片轮转调度;在低优先级队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(剥夺

(3)僵尸进程、孤儿进程

当进程退出但是父进程并没有调用wait或waitpid获取子进程的状态信息时就会产生僵尸进程

孤儿进程则是指当一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

(4)死锁出现的原因和以及如何避免

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。系统要求申请进程: 1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完; 2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程PA,使用资源的顺序是R1,R2; 进程PB,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。 采用有序资源分配法:R1的编号为1,R2的编号为2; PA:申请次序应是:R1,R2 PB:申请次序应是:R1,R2 这样就破坏了环路条件,避免了死锁的发生

(5)什么是事务,什么是并发

1.脏读:事务A读取了事务B更新、未提交的数据,然后B回滚操作,那么A读取到的数据是脏数据(没有用的数据)

2.不可重复读:事务 A 多次读取同一数据,结果读取的数据不一致,也就是说不支持重复读,重复读会有错误。 原因是 事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据不一致。

3.幻读:事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。 需要表锁才能隔离,所以大都数数据库都 没有将幻读隔离。

Linux:

(1)查找java进程所占内存(cpu)并按照升序进行排序

ps -auxw --sort=%MEM |grep java

(2)查找txt结尾的文件并进行删除

find /i -type name "*.txt" -exec rm -rf {} \

(3)怎么查找一个日志文件中某个词

cat 文件 |grep 词

数据库:

(1)索引的优缺点

1、大大加快数据的检索速度; 2、创建唯一性索引,保证数据库表中每一行数据的唯一性; 3、加速表和表之间的连接; 4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。 缺点: 1、索引需要占物理空间。 2、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

(2)数据库死锁的原因,怎么解决

产生原因: 1、由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。

2、数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11 中,最小锁为 2K 一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。

解决措施: 1、不同的存储过程、触发器、动态 SQL 语句段按照不同的顺序同时访问多张表。

在系统实现时应规定所有存储过程、触发器、动态 SQL 语句段中,对多张表的操作总是使用同一顺序。如:有两个存储过程 procedure1、procedure2,都需要访问三张表 table1、table2 和 table3,如果 procedure1 按照 table1、table2 和 table3 的顺序进行访问,那么,procedure2也应该按照以上顺序访问这 3 张表。

2、在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered)。

对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除操作。

3、表中的记录少,且单条记录较短,被访问的频率较高。

对单张表中记录数不太多,且在交换期间 select 或 update 较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。 如:系统配置表或系统参数表。在定义该表时添加如下语句: with max_rows_per_page=1

4、整张表被访问的频率高(如代码对照表的查询等)。

在存储过程、触发器、动态 SQL 语句段中,若对某些整张表 select 操作较频繁,则可能在 该表上与其他访问该表的用户产生死锁。对于检查账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在 select 命令中使用 at isolation read uncommitted 子句的方法解决。该方法实际上降低了 select 语句对整张表的锁级别,提高了其他用户对该表 操作的并发性。在系统高负荷运行时,该方法的效果尤为显著。 例如: select*from titles at isolation read uncommitted

5、对流水号一类的顺序数生成器字段,可以先执行 update 流水号字段+1,然后再执行 select 获取流水号的方法进行操作。

(3)drop delete truncate 三者区别

(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。    TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

(2)表和索引所占空间。

   当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,    DELETE操作不会减少表或索引所占用的空间。    drop语句将表所占用的空间全释放掉。 (3)一般而言,drop > truncate > delete

(4)应用范围。

    TRUNCATE 只能对TABLE;         DELETE可以是table和view (5)TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。 (6)truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。 (7)delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。 (8)truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚 (9)在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。 (10) Truncate table 表名 速度快,而且效率高,因为:  truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。  (11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。  (12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

(4)数据库的事务隔离级别

(1)原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。 (2) 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。 打个比方,你买东西这个事情,是不影响其他人的。 (3)隔离性(Isolation) 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。 关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。 (4)持久性(Durability) 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。 打个比方,你买东西的时候需要记录在账本上,即使老板忘记了那也有据可查。

(5)对MQ的理解

问题点:服务的接口http协议 同步调用 客户端会超时。阻塞等待 一旦超时 就会触发重复触发 。异步的操作 mq来实现落地的。

(6)MQ宕机消息会消失吗?

宕机不会消失 ,放在硬盘,解决消息堆积,生产者和消费者的速率是不匹配的
消费者变成集群 批量消费

python:

(1)python装饰器作用 含义

详细看这个,个人理解: https://www.cnblogs.com/testling/p/14706157.html

(2)python并发编程

subprocess模块为子进程的创建和通信提供了API。这特别适合运行与文本相关的程序,因为这些API支持通过新进程的标准输入输出通道传送数据。threading模块为并发操作提供了一系列高级的,面向对象的API。

  1. p = Process()   p.start()向操作系统提交创建进程的任务   p.join()   p.daemon = True 必须放在start()前面,否则报错
  2. class MyProcess(Process):           def run(self):

(3)python闭包,迭代器

例如: 这种函数被叫做内嵌函数 def count(): a = 1 b = 1 def sum(): c = 1 return a + c # a - 自由变量 return sum

迭代器: https://www.cnblogs.com/louyefeng/p/9430415.html

全部评论

相关推荐

5 19 评论
分享
牛客网
牛客企业服务