1.线程与进程的区别与联系:
https://blog.csdn.net/qq_37791134/article/details/81516023
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
在消耗方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
2.Python中is与==的区别
==比较操作符:用来比较两个对象是否相等,value做为判断因素;
is同一性运算符:比较判断两个对象是否相同,id(对象间的唯一身份标识)做为判断因素。
3.python中哪些数据结构用了哈希表
python中的这些东西都是哈希原理:字典(dictionary)、集合(set)、计数器(counter)、默认字典Defaut dict)、有序字典(Order dict).
使用哈希表可以进行非常快速的查找操作,查找时间为常数,同时不需要元素排列有序;python的内建数据类型:字典,就是用哈希表实现的。
4.快排的过程。
快排的思想是分而治之。
在序列中选择一个基准数,遍历序列中的所有数,比基准数大的数放在右侧,比基准数小的放在左侧
左侧和右侧成为子序列,对子序列分别重复步骤1,进行递归式重复,直到子序列只有一个数为止。
5.TCP的三次握手、四次挥手
三次握手(Three-Way Handshake)即建立TCP连接,需要客户端和服务端总共发送3个包以确认连接的建立。
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态(请求连接),等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态(确认连接请求)。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态(代表一个打开的连接),完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
SYN:同步标志
ACK:确认标志
RST:复位标志
FIN:结束标志
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
建立TCP连接时的第二次握手中,服务端收到建立连接请求后,把ACK(确认标置)和SYN(同步标志)放在一个包里发送给客户端。..而关闭连接时,当服务器收到客户端的FIN(结束标志)报文时,仅仅表示客户端不再发送数据了但是还能接收数据,服务器也未必全部数据都发送给对方了,所以服务器可以立即close,也可以发送一些数据给对方后,再发送FIN报文给客户端来表示同意现在关闭连接,因此,己方ACK(确认标志)和FIN(结束标志)一般都会分开发送。
6.CPU核数怎么查看/负载怎么看
查询核数:
cat /proc/cpuinfo| grep “cpu cores”| uniq
查询CPU个数:
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l
uptime命令。
7.linux如何取出文本最后一列
使用awk -F’,’ ‘{print $NF}’ 来获取。
8.Struct 和 Union有下列区别
Union: 共用体
Struct:结构体
两者的区别:
1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量。
2:对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的
3:内存分配不同
union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小
9.Linux,多线程编程
编写Linux下的多线程程序,需要使用头文件pthread.h。
多线程程序在运行时同一个进程的线程之间进行切换
10.软件测试的基本流程:
1.需求分析阶段:阅读需求,理解需求,分析需求点,参与需求评审会议。
2.测试计划阶段:主要任务就是编写测试计划,参考软件需求规格说明书,项目总体计划,内容包括测试范围,进度安排,人力物力分配,整体测试策略的制定。
3.编写测试用例:适当的了解设计,搭建测试用例框架,根据需求和设计编写测试用例。
4.测试执行阶段:搭建环境准备数据,执行冒烟测试(预测试)然后进入正式测试(系统测试、回归测试、交叉测试、自由测试),bug管理直到测试结束。
5.输出测试报告:输出测试报告,确认是否可以上线。
测试方法有很多:
黑盒测试(不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,检测每个功能是否都能正常使用,也称功能测试)
白盒测试(结构测试,检查程序的内部结构)
灰盒测试(介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段)
动态测试(输入一组预先按照一定的测试准则构造的实例数据来动态运行程序),
静态测试(人工的模拟技术对软件进行分析和测试)
性能测试,压力测试,安全性测试,兼容性测试等
5.虚函数
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。
6.栈与队列的区别,应用,效率
1、队列先进先出,栈先进后出。
2、对插入和删除操作的"限定"不同。栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
3、遍历数据速度不同。
栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。
队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影响数据结构,速度要快的多
栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。、
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。
堆栈其实是堆和栈,都是内存的不同区域。
7.对面对对象的理解
面向对象编程,实际上就是类的实例化过程。以对象作为基本程序结构单位。也就是说一切都是类、一切都是对象。
面向对象的三大特征 继承,封装,多态
一 继承
继承概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。子类是父类更加详细的分类。是一种特殊化与一般化的关系,是is-a的关系,class dog 继承于 animal,就可以理解为dog is a animal。
目的:实现代码的复用。
结果:继承后子类自动拥有了父类的属性和方法,子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。
二 封装
概念:封装就是将信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。
好处:(1)实现了专业的分工。模块化,将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。
三、多态
概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
理解:**子类以父类的身份出现,但做事情时还是以自己的方法实现。**子类以父类的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的, 是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。
“面向过程”和“面向对象”的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
8.TCP报文字段、IP报文字段
TCP报文段分为首部和数据两部分。
首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N是整数)。因此TCP首部的最小长度是20字节。
首部固定部分各字段如下:
源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。
序号:占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”。
确认序号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到。
数据偏移:占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。故TCP首部的最大长度为60字节。
保留:占6位,保留为今后使用,目前置为0;
紧急URG:当URG=1,表明紧急指针字段有效。这时发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。
确认ACK:当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
推送PSH:接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文。
终止FIN:用来释放连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
窗口:占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据。
检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP数据报一样,在计算检验和时,也要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样,但要将伪首部第四个字段中的17 改为6(协议号),把第5字段中的UDP长度改为TCP长度。
紧急指针:占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。
IP数据包由报头和数据两部分组成。报头的前一部分是固定长度,共20字节。在报头的固定部分的后面是可选部分——IP选项和填充域。
首部各字段如下
1、版本:占4位,指IP协议的版本。
2、报头长度:占4位,该字段的单位是32位字(1个32位字长是4字节),因此当IP报头长度为1111时,报头长度就达到最大值60字节。当IP分组的首部长度不是4字节的整数倍是,就需要对填充域加以填充。最常用的报头长度为20位(报头长度值为0101),这时不使用任何选项。
3、区分服务(服务类型):占8位,在一般情况下都不使用这个字段。
4、总长度: 指报头和数据之和的长度,单位是字节。总长度字段为16位,故IP数据报的最大长度为65535。
每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU。当IP数据报封装成链路层的帧时,此数据报的总长度不能超过对应MTU的值。若数据报长度超过对于MTU的值,就将数据报进行分片处理,此时数据报首部中的“总长度“字段是指分片后的每一个分片的报头长度和数据长度之和。
5、标识:占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并赋给标识字段。当数据报进行分片处理后,每个分片的标识值都与原数据报的标识值相同,则在接收端具有相同标识值的分片就能最终正确的重装成为原来的数据报。
6、标志:占3位,但目前只有两位有意义。
最低位记为MF。MF=1即表示后面”还有分片“的数据包。MF=0表示这已是若干数据包片中的最后一个。
中间位记为DF,意思是”不能分片“。只有当DF=0时才允许分片。
7、片偏移
占13位。表示每个数据报的分片在原数据报中的相对位置。片偏移以8个字节为偏移单位,即每个分片的长度一定是8字节的整数倍。
8、生存时间:占8位。表示数据报在网络中的寿命。最初以秒为TTL值为单位,现在以跳数为单位,则目前的最大数据为255.
9、协议:占8位,指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给那个处理过程。
TCP对应协议字段值6;UDP对应协议字段值17
10、首部校验和:占16位,该字段只校验数据报的报头,但不包括数据部分。
11、源地址:占32位
12、目的地址: 占32位
9.多线程是什么,锁的种类
多线程是指从软件或者硬件上实现多个线程并发执行的技术。
能够在同一时间执行多于一个线程,进而提升整体处理性能。
在一个程序中,这些独立运行的程序片段叫作“线程”
互斥锁:用于保护关键的代码段,以确保其独占式的访问。
自旋锁: 应用在实时性要求较高的场合(缺点:CPU浪费较大)
读写锁(共享-独占锁):应用场景—大量的读操作 较少的写操作
条件锁:条件锁就是所谓的条件变量
10.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个只出现一次的数字
用异或来实现,一个数异或两次相当于没有异或。
异或(第一次碰见这个数据加,第二次碰见这个数据减)
https://blog.csdn.net/Hots3y/article/details/90347685
11.写一句SQL语句
SQL 语句对大小写不敏感。SELECT 等效于 select。
SELECT 列名称 FROM 表名称
SELECT LastName,FirstName FROM Persons
12.测试开发的理解
利用测试工具按照测试方案和流程对产品进行功能和性能测试,
甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。
执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。
为了发现程序中的错误而执行程序的过程
评定软件质量的一种方法
13.怎么理解TCP/IP协议
TCP/IP 协议栈是一系列网络通信协议的总和,它定义了电子设备如何连入因特网,以及数据如何传输。
TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心,一个主机的数据要经过哪些过程才能发送到对方的主机上。 探索一下这个过程:
链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;
传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;
应用层:定义数据格式,并按照对应的格式解读数据。
当用户通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;
紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;
然后网络协议加上了双方的IP地址,确认了双方的网络位置;
最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。
而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。