面试总结
一、语言
1.运行时多态? 虚函数
2.指针和引用的区别?
1)指针是实体,引用是别名
2)引用只能在定义时被初始化一次,以后不可以改变,指针可以改变
3)引用不能为空,指针可以为空
4)需要为指针分配内存,引用不需要分配
3.为什么通常将析构函数定义为虚函数?
防止内存泄漏,可以先调用派生类的析构,再调用基类的析构函数
4.什么是多态?
收到相同的消息,产生不同的动作
二、算法与数据结构
1.写一个内存拷贝函数的实现
2.求中位数 快排实现
当划分函数返回的位置为n/2时,这时的值就是中位数
3.红黑树的定义与大概实现原理
红黑树是一种自平衡二叉查找树,在插入和删除时通过特定操作保持二叉查找树的平衡。节点是红或黑色。根节点是黑色。每个叶子节点是黑色。每个红色节点的两个子节点是黑色。从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
4.给出千万个记录,大到内存装不下,怎么找出前m个记录
先hash到mod个小文件中,然后对每个小文件加入内存,找到一个当前最大值,找m*mod次
三、操作系统
1.进程跟线程的区别
2.DMA:直接存储器访问
DMA传输将数据从一个地址空间直接复制到另一个地址空间。传输动作本身是由DMA控制器来实现和 完成的,DMA控制器掌控总线
3.生产者消费者,PV原语要求表现出进程互斥与同步
producer{
do{
P(empty);
P(mutex);
buffer[in] = nextp;
in = (in+1)%n;
V(mutex);
V(full);
}while(true);
}
consumer{
do{
P(full);
P(mutex);
nextc = buffer[out]%n;
out = (out+1)%n;
V(mutex);
V(empty);
}
}
4.创建进程到进程终止的过程
进程状态转换图
四、网络原理
1.ISO七层结构
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
2.IP层的作用
实现路由寻路
3.tcp和udp的区别
1)tcp需要建立连接,udp不需要
2)tcp可靠性高,窗口机制,重传机制,拥塞控制机制,upd可靠性不高,网络不好时容易丢包
3)tcp实现需要耗费较多时间,没有udp快
4.tcp的三次握手和四次挥手
三次握手:SYN,全双工。三次握手是为了防止失效的连接请求造成错误
四次挥手:
FIN结束标志。四次挥手是因为存在半关闭状态。2mls是为了让最后的ACK可以重新发送,插口对不被新的连接占用
5.滑动窗口的作用:流量控制
发送方根据收到的ACK当中期望收到下一个字节的序号n和窗口m,还有当前已经发送的字节序号x,算出还可以发送的字节数。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
6.拥塞窗口:cwnd以字节为单位,但是慢启动以报文段大小为单位增加。慢启动时,每次收到一个ACK后,cwnd就增加一个报文段大小字节。
7.当拥塞发生时(超时或收到重复确认),通常同时使用慢启动算法和拥塞避免算法。
需要维护拥塞窗口cwnd和慢启动门限ssthresh。对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。tcp输出不能超过cwnd和接收方通告窗口的大小。当拥塞发生时,ssthresh被设置为当前窗口大小(cwnd和接收方通告窗口大小的最小值,最少为2个报文段)的一半,如果是超时引起的拥塞,cwnd被设置为1个报文段(慢启动)。当新数据被对方确认,增加cwnd,如果cwnd小于等于ssthresh,则正在进行慢启动,否则进行拥塞避免。慢启动到一定程度后转为拥塞避免。拥塞避免算法要求每次收到一个确认时,将cwnd增加1/cwnd,加性增长。
8.糊涂窗口综合征
当发送端写进程产生数据很慢或接受端读进程读取数据很慢或者两者都有时,出现发送有效载荷很少的情况。
解决办法:
接收方不通告小窗口。除非窗口可以增加一个报文段大小或可以增加接收方缓存空间的一半。
发送方满足下面三种情况之一才发送数据:1.可以发送一个满长度报文段 2.可以发送至少是接收方通告窗口大小一半的报文段 3.能够发送手头的所有数据且不希望接收ACK或者连接禁止了Nagle算法
9.http
URL——统一资源定位符
URL一般由三部分组成:
1)协议 2)主机IP 3)资源位置
URI——统一资源标识符
URI一般由三部分组成:
1)访问资源的命名机制 2)存放资源的主机名 3)资源自身名称,路径表示
所有的URL都属于URI,但是不是所有的URI都是URL
http特点:
1)支持客户/服务器模式
2)简单快速,客户向服务器请求服务时,只需传送请求方法和路径
3)灵活,可以传输任意类型的数据
4)无连接,每次连接只处理一个请求,服务器处理完客户的请求,并收到客户应答后,即断开连接
5)无状态,对于事物处理没有记忆能力
10.http的query和response报文
请求由三部分组成:请求行、消息报头、请求正文
请求行格式:Method Request-URI HTTP-Version CRLF
请求方法:
GET 请求获取Request-URI标识的资源
POST 在Request-URI所标识资源后附加新数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器储存一个资源,用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器性能,或查询与资源相关的选项和需求
HEAD与GET方法都会返回响应消息报头。HEAD方法可以得到Request-URI所标识资源的信息,而不用传送整个资源内容。常用于检测超链接的有效性,以及最近是否更新。
响应也由三部分组成:状态行、消息报头、响应正文
状态行格式:HTTP-Version Status-Code Reason-Phrase CRLF
Status-Code表示响应状态码,Reason-Phrase表示状态代码的文本描述(原因短语)
状态代码有三位数字组成,第一个数字定义了响应的类别,有5种可能取值
1xx: 指示信息--表示请求已接收,继续处理
2xx: 成功--表示请求已被成功接收、理解、接受
3xx: 重定向--要完成请求必须进行更进一步的操作
4xx: 客户端错误--请求有语法错误或请求无法实现
5xx: 服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误、不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
五、数据库
1.sql语句
2.聚类函数
3.为什么要建立索引
六、linux命令和shell
1.cut 对于行进行操作
cut -d ':' -f 2 以':'为分隔符,切出第二部分的所有行
cut -c 12- 从第12字符往后的字符所有行
2.grep
grep '选取的串' 选出所有含有'选取的串'的行
grep -v '选取的串' -v表示反向选择
grep -n '串' -n显示行号
3.sort 字典序排第一部分
sort -t '分隔符' -k 3 以第三部分进行排序
sort -t '分隔符' -k 3 -n 以纯数字形式排第三部分
4.uniq -c 对每个重复的记录去重并且计数
5.wc -l 显示行数 wc -w 显示字数 wc -m 显示字符数
gdk,gdb,make
学学学 练练练 刷刷刷