此项目用于分类记录面试题以及自己的面试经历
- gdb的一些指令
设断点 b 删断点 d
单步执行:s n si ni
打印变量的值 p
显示汇编代码 display
显示寄存器的值 i r
打印栈信息i f 或者是bt(backtrace) 打印当前函数调用栈的所有信息
- 什么是进程、什么是线程
进程是拥有资源的基本单位、线程是CPU调度的基本单位;
进程是一段代码在某个数据集上的执行,是一个动态实体:
因创建而产生,因调度而运行,因等待资源或事件而等待,因完成任务而撤销,是一个程序在一定数据集上运行的全部动态过程;
线程是进程下能独立运行的更小的单位,线程的创建、终止、切换较快,线程之间共享资源,但不拥有系统资源;
- linux中top各参数的意义
- 什么是内存泄露,怎么判断是内存泄露
- 线程间如何通信
- 讲一下线程状态转移图
- 进程间通信方式
- 怎么查看进程的内存
- 三次握手
SYN = 1 | SEQ = x、 SYN = 1 ACK = 1 | ACKNUM = x + 1 SEQ = y、 ACK = 1 | ACKNUM = y + 1 建立连接的时候,服务器把SYN和ACK放在一个包内
- 四次挥手
FIN = 1| SEQ = x、ACK = 1| ACKNUM = x + 1、FIN = 1 | SEQ = y、ACK = 1| ACKNUM = y + 1
一端发送FIN包之后,处于半关闭状态,此时仍然可以接收数据包。如果有一端收到FIN包之后,需要回复对该包的ACK包,但可能这个时候还有数据没有发完,所以把剩下的数据发完之后,在发送一个FIN包,断开这个方向的连接
TIME_WAIT:第四次挥手,也就是客户端发出的ACK包可能丢失,客户端会等待一定时间(2个MSL,两个报文的存活最长时间),这个时间内没有收到服务器要求重传ACK的报文,则认定服务器正确接收并已经断开连接了
- UDP
不可靠在于UDP没有 确认 和 超时重传机制,没办法处理丢包的情况
也没有序列号的机制,没办法处理数据包乱序的情况;
无连接表示并不是通过握手创建连接
- TCP/UDP 主要区别、用在哪里
TCP:可靠的有连接 面向字节 传输效率低;UDP:不可靠无连接 面向报文 传输效率高
TCP: SMTP、TELNET、HTTP、FTP;UDP:DNS、DHCP、RIP、即时通讯、在线视频
- http状态码含义
200 – 请求成功 301 – 资源被永久转移 404 - 请求的资源不存在 500 – 内部服务器错误
- http请求过程做一个描述
- post和get的区别
本质上并无差别,都是TCP连接;
GET参数通过URL传递,也就是放在 开始行,POST的内容放在 请求主体;
GET产生一个TCP包,POST产生两个(头部header 和 数据data);
- cookie和session的区别
session是服务器端保存的一个数据结构,用来跟踪用户的状态;
cookie存储在客户端,是一串“识别码”,服务端可以通过根据cookie在数据库中该用户的活动记录。cookie是实现session的一种方式;
由于http是无状态协议,所以服务器需要一种机制来记录用户的状态,因此服务器要为特定的用户创建特定的session;
- 对http协议了解哪些内容
C/S模式
无连接:HTTP协议本身是无连接的,但使用了TCP连接
无状态:对事件处理没有记忆能力,同一个客户第二次访问同一个服务器上的页面,服务器响应与第一次响应相同
- http协议组成,get的url每部分划分及名称
开始行、消息报头(存放浏览器、服务器等信息)、请求正文
- 无法访问一个网站可能的原因
- DHCP工作原理
- ARP工作原理
通过目标IP查询目标设备MAC(发送过程、ARP缓存表、广播)
- 主机访问网站过程
- SPF算法原理、OSPF路由协议、OSPF几种特殊区域、LSA类型和内容
- HTTP1.1和2.0协议的区别
- java中的接口和C++里的什么类似
- 介绍红黑树
- 堆排序的原理
- BST
- hashmap原理
- hashmap原理
- hashmap为什么是2的幂次
- Forward和redirect的区别
RequestDispatcher类的forward()方法,浏览器只发出一次请求,Servlet会把请求转给其他信息资源处理,由第二个信息资源响应该请求
HttpServletRequest类的sendRedirect()方法,浏览器会发出两次HTTP请求,浏览器先发送一次请求给servlet1, servlet1高速浏览器”你去访问servlet2",浏览器会在向servlet2发送一次
- Synchronize关键字为什么jdk1.5后效率提高了
jdk1.5以后使用了CAS机制对synchronized进行了优化,之前,synchronized是阻塞同步,而挂起唤醒的操作比较耗时,而CAS是非阻塞同步,不会武断的将冲突进程挂起
- volatile 和 synchronized
v保证从内存中取数据,更改变量的值时也会直接写进内存,修改变量的可见性;
s可以保证内存的某个共享变量一次只由一个线程访问,就是上锁;
- String、StringBuffer、StringBuilder的区别
- Object类里有哪些方法
- hashcode、equals和==之间的区别
hashcode返回对象的hash值,对象相等,hashcode一定相等,反之不成立;
equals表示地址相同;
==仅指内容相同;
- 几种创建线程类的方法
继承thread类,重新run(),start开启线程
实现runnable接口
实现callable接口
- 简述list、set、map的区别
list列表 元素可以重复的动态数组;
set 集合 元素不能重复 没有get方法 只能用迭代器访问元素;
map 映射,key-value对集合,每个元素包括一个键对象和一个值对象;
- 说出arraylist,vector,linkedlist的存储型能和特性
arraylist:可以快速随机访问,但删除插入元素比较慢;
linkedlist:俩表,插入和阐述元素开销不大,但元素访问的开销比较大;
vector是线程安全的,因此开销比较大
- 对象序列化机制,java的序列化做什么用的 序列化id会出现哪些问题
- hibernate和ibatis区别
- hashmap、hashtable、hashset的区别,哪个key可以为空
hashset是基于hashmap,但value不重复;
hashtable线程安全,hashmap非线程安全;
hashmap键可以为null,但只能有一个;
- 集合加锁?synchronized与static synchronized的区别
- web设计中url怎么保存,参数怎么传递
- tomcat的session共享机制,优先加载什么库?为什么?
- struts2的实现原理
- JVM、JMM
- 垃圾回收(什么是垃圾回收,算法,GC怎么给内存分区)
- 虚拟机内存模型
分为线程栈和堆,原始类型本地变量存放在线程栈中,一个线程的本地变量对其他线程是不可见的,对象存放在堆中,可以被线程共享;
- 类加载机制(哪几种classloader?双亲委派模型是什么,为什么要这么做)
- 是否可以自己定义一个java.lang.String类,为什么?
- 线程池的使用时的注意事项
- 抽象工厂和工厂方法模式的区别
- 工厂模式的思想
- 单例
- 懒汉饿汉双检锁
- 其他:策略、门面、桥接、观察者模式
- Spring的IOC、AOP原理
- Spring中autowire和resource关键字的区别
- MVC
模型:数据的存储,数据处理的规则
视图:将模型的数据显示给客户看,UI
控制器:流程控制,接收来自客户端的请求,把请求按照一定的规则转换进行转换,再交给模型和视图处理
将UI显示,业务逻辑,流程控制很好的分离开来,使得程序的开发更好分工,以及程序更加容易维护和扩展
- C、C++内存机制:
data区:初始化了的全局变量和静态变量;
bss区:未初始化的全局变量和静态变量存放在这;
栈:用于存放本地变量,内部临时变量,函数参数以及有关上下文的连续的内存区域;
堆:动态内存分配,malloc、new;不连续的内存区域;
代码区
- 静态局部变量的特点
静态局部变量是定义在函数内部的变量,只在函数内部可见;
在函数调用中,变量的值不会丢失;
- C++的多态,写一个简单多态的用法
多态是一个接口的多种实现,同一个方法可以有不同的实现
把不同的子类对象都当作父类来看,屏蔽不同子类对象之间的差异,写出通用的代码)
函数重载、函数覆盖(参数相同,子类函数覆盖同名同参父类函数,父类函数必须是虚函数)、函数隐藏,派生类函数隐藏同名同参数
虚函数
- C++中malloc和new的区别
- C++的内联是什么
- 堆和栈的区别
- 函数调用过程
- 硬件断点和软件断点
- 三角形的三边,判断等腰三角形,然后是等边三角形
先判断是否为三角形;三边不等则为普通三角形;三边相等则为等边,其余均为等腰
- 给你一个QQ群,怎样测试其中一个群成员发送消息,其他成员都收到消息了
服务器端测试是否收到以及是否发出
登入几个群成员的客户端,查看是否成功接收)
- 登入了qq账号,如果是会员的话就显示一个红灯,如果不是会员的话灯就不亮,怎样对这个简单的用例设计测试场景?
- 有一个抽奖的程序,一等奖概率是10%,二等奖概率是20%,其余是三等奖,这样一个抽奖的程序你会怎样进行测试用例的设计
- 设计一个对地铁闸机的测试用例
- 针对一个登入页面设计测试用例
界面测试:布局是否合理、控件的长度高度是否符合要求
功能测试:正常输入、非空检查、错误校验、安全性、验证码、输入密码时,大写键盘开启的时候有提示信息
性能测试:时间、CPU占用、网络带宽、内存、磁盘IO、耗电量
压力测试:同一时刻最大登入的用户数量
安全性测试:SQL注入攻击、XSS攻击、防止暴力破解
易用性测试:
兼容性测试:
- 针对之前做过的一个项目,通过访问接口进行压力测试,具体实现方式
- 整型转字符串
先判断数字有几位,除以10 ,先取商,在取余数,直到商为0;
重复上述过程,取到余数后 + '0';
- 写内存拷贝,源地址不能破坏
如果源数据拷贝后的数据有地址重叠,则从后向前复制
- 单链表就地翻转
头插法
- 深拷贝和浅拷贝
- 给定一个数组,求最大连续子序列的和
- 你有20元钱,每瓶汽水一元钱,两个空瓶子可以换一瓶饮料,写程序判断可以最多买多少瓶
- 数据库常用指令
- 乐观锁、悲观锁
- 数据库事务ACID是什么,数据库优化
- 关系型数据库MYSQL
- 非关系型Redis,Redis的过期策略
- xss注入问题
XSS攻击,一些网站对输入框没有做严格的检查,攻击者在web页面的输入框写入js的脚本,受害者访问时,js脚本会被执行,攻击者利用这个可以获取很多受害者信息例如cookie,可以据此展开会话劫持
- CSRF跨站点请求
受害者点击进入攻击者设计好的网站,这个网站会执行恶意脚本,可能会获取受害者的一些信息例如cookie,用来伪造HTTP的POST报文,提交表单,恶意篡改受害者信息等。
- 常见的安全漏洞
- RSA、HTTPS SQL注入 硬件安全部分
RSA加密:非对称密钥,安全性基于大数分解难题;甲方用乙方的公钥对信息加密之后,传输给乙方,乙方用自己的私钥解密。
RSA签名:用私钥签名,公钥验证;甲方用自己的私钥对要传输的数据签名,生成签名字段附加在要传输的数据上,整体再用乙方的公钥加密,乙方接收后,用自己的私钥解密,提取签名字段,并用甲方公钥解密,与数据部分对比,验证是否一致
HTTPS:加密请求、私钥、数字证书、公钥
HTTPS:握手过程验证数字证书和传输对称密钥。网站向浏览器发送 数字证书,浏览器对证书进行验证,验证无误后,浏览器用数字证书里的公钥加密对称密钥,传送给网站,网站用自己的私钥解密,之后数据传输都用对称密钥加密,非对称密钥确保对称密钥的安全传输。
SQL注入:本质是把用户输入数据作为代码执行。比较常见的验证SQL漏洞是否存在的方式是构造简单的条件语句,根据返回页面是否发送变化,来判断SQL语句是否得到执行。防御:限制数据类型。
- 共享变量是不是安全的,怎么解决?
多线程情况下,访问共享变量的顺序不同,可能造成错误的结果,应该使用信号量进行同步访问共享变量
- 堆溢出和栈溢出shellcode怎么写
- windows下hook方式,inline hook
- dep保护原理
- ALSR怎么破
- 虚表、虚表指针,及如何hook虚函数
- 对称加密、AES、DES
- RSA密钥生成过程
- 堆喷的各种奇淫技巧
- 对腾讯的认识
- 对自己今后的职业规划
- 你认为测试和开发什么关系
- 你认为优秀的测试工程师应该具备哪些条件
- 为什么选择测试岗位