网友面经总结

LINUX篇

1.管道的作用:

‘|’是管道命令操作符,管道的总用是将一个命令的正确输出作为下一个命令的输入。连续用管道符,意味着命令一的输出作为命令二的输入,命令二的输出作为命令三的输入,以此类推。

2.grep的作用

查询文本字符串
grep 【-r】[-d skip] abc 目录/* 查询某个目录下的 包含abc 的文件,-r 查询子目录 -d忽略子目录
-l 列出目录
// 精确查找
/

3.select , poll , epoll 区别

4.linux 找出一个文件后一百行

tail -n 100 filename

cat 前面
tac后面
more 分页显示
less分页显示 支持向前翻页
head头几行

2 C++篇

- 类

默认构造函数
默认析构函数
默认拷贝构造函数
默认赋值操作符
浅拷贝/深拷贝

- STL

STL
容器,算法,迭代器的关系
每个容器都有专属的迭代器,迭代器指向容器中的元素,算法通过迭代器操作容器中的元素

迭代器都有哪几种
迭代器有五种,分为input,output,forward,bidirectional,random access
vector deque 用的是random access
list , set multiset map multimap 用的是bidirectional
stack queue priority_queue 没有迭代器,因为上以上容器组装成形的

适配器有哪几种
适配器不是第一类容器,不支持迭代器,它是有底层容器组成的。
stack
可以由序列容器构成 list deque vector 默认情况是deque

queue
用qeque实现

priority_queue
可以用vector deque
默认用vector实现

如果要用STL实现得到前k个小的数用什么函数(我答的用sort。。。)
用multiset

然后又问sort实现机制是什么,时间复杂度最好和最坏是多少
sort 实现在普通的快速排序基础上又进行了改进
首先判断问题规模,如果小于阈值(16)则改用插入排序,若大于阈值,则给定一个最大递归深度depth_limit ,当小于这个深度时,用快速排序,否则用堆排序。
时间复杂度为nlogn

如果要实现最坏也是O(nlogn)复杂度的排序可以用什么(答了归并)
归并最稳定 且时间复杂度为nlogn

之后让详细讲了一下归并的过程,归并的不足(空间复杂度O(n))
空间复杂度为O(n)

问还有其他什么也能达到O(nlogn)(然后答了堆排序)
堆排序 归并 快速

详述一下堆排序的过程(建堆,更新一系列过程)。

- C++ 异常


C++异常主要目的是用来为了设计容错程序提供语言级支持
应在程序设计时添加异常,而不是以后再添加。
异常三元组
throw , try , catch
用throw + 异常特征 去抛出异常
用catch + 异常类型 去捕获并处理异常
而只有定义了try的 代码部分引发的异常才能被捕获,所以应在可能出现异常的代码处加上try去监测异常

throw 异常特征最好定义为一个类
1.传递信息
2.判断异常类型
3.知道如何去处理异常
catch + 异常类型 类型应为类对象的应用(虽然还是会产生副本) ,这样做对于所有派生类而言是个福利,应为它们可以共用 以基类对象为参数的catch块

异常规范是指
double fun ( double a) throw(user_def_excep)
throw() 部分,可以向其中添加异常
告诉用户使用 try块
让编译器添加执行运行阶段检查的代码,检查是否违反了异常规范

栈解退
当程序由于异常而终止,程序将释放栈中的内存,但不会释放栈中的第一个返回地址后停止,而是继续释放栈,知道找到一个位于try块中的返回地址,随后控制权将转到块尾的异常处理程序,而不是函数调用后的第一条语句,这个过程称为栈解退。
其中:异常出现的地方 到 try 块 之间的所有自动类型对象都将自动被释放

用catch {…..} 可以捕获任何异常

所有异常的基类 ——-exception
头文件 exception
有一个虚拟成员函数 what () 返回一个字符串
常用的基于exception 的异常类
1.stdexcept (头文件stdexcept)
定义了: logic_error 和 runtime_error 类
logic_error
domain_error
invalid_argument
length_error
out_of_bounds
表明可以通过编程修复的问题
每个类(构造函数的输入参数)能提供一个 类似于logic_error , 能被方法what返回的字符串 ;
runtime_error
range_error
overflow_error
underflow_error
表明无法回避的问题
每个类(构造函数的输入参数)能提供一个 类似于logic_error , 能被方法what返回的字符串 ;

2.bad_alloc异常和 new
对于使用new导致的内存分配问题,是让new 引发bad_alloc异常

未捕获异常和意外异常
未捕获异常
调用terminate(),terminate默认调用abort()
可以用setterminate(func),指定异常函数func

意外异常
调用unexcept () ,这个函数默认调用terminate() (默认abort())
可以用setunexcept(fun),指定terminate 要调用的函数

**

- C++内存模型

**
http://blog.csdn.net/cloud323/article/details/68921661关于内存模型的一篇文章
内存空间
堆,栈,全局变量区/静态变量区 , 常量区 , 代码区
.text –> .bss -> .data –> .heap –> .stack

内存模型
自动存储持续性
自动变量
寄存器(register)
静态存储持续性
连接性为外部的存储持续性变量
声明在函数外部
连接性为内部的存储持续性变量
声明在函数外部,且加static关键字
没有连接性的存储持续性变量
声明在函数内部,且加static关键字,只初始化一次
动态存储持续性
用new / malloc (C)分配内存
线程存储持续性

用函数的
存储持续性
作用域
连接性
来描述不同存储方式

C++的单定义规则
定义声明 分配内存
引用声明 extern ,不分配内存
全局变量默认连接性为外部,CONST全局变量为内部
static为内部

3.计算机网络篇

1.TCP 和 UDP 区别

tcp是传输控制协议,提供可靠的连接
UDP是用户数据报协议,不提供可靠连接,

tcp的传输单位称为TCP报文段
udp的传输单位称为用户数据报

tcp注重数据安全性
udp注重传输速度,对安全性没有保证

2.tcp三次握手 和四次握手

tcp三次握手
客户端向服务器发送SYN=1连接请求,序列号为seq=x
服务器接收到请求,对该请求回应:ACK=1 ,seq=x+1 ; 然后发送SYN=1 ,seq=y 与客户端连接。
客户端接收服务器请求包,对此进行确认ACK=1,seq=y+1
至此三次握手完成!

tcp四次挥手
客户端向服务器发送FIN=1 ,seq=x ,表示断开连接
服务器对此进行确认 ACK=1 ,seq=x+1 ;并发送断开信号 FIN=1 ,seq=y
客户端收到服务器的断开消息,对此进行确认 ACK=1 seq=y+1
至此 四次挥手完成,断开连接!

3.超时重传机制

TCP每发一个报文段,都会设置一个计时器,如果超过这个计时器设置的超时时间而该报文段还没有被确认,则重传这个报文段。
重传时间的确定:
通过数据链路层: 往返时延方差小,重传时间设置为往返时延最大值大一点就可以。
传输层:往返时延方差大。需要相应算法去决定
当没有报文段重传时,重传时间设为各个报文段的往返时延加权平均。每次更新都按照下式进行:
平均往返时延=a (旧的往返时延) + (1-a)(新的往返时延) ,a=7/8
重传时间=2×(平均往返时延)

当有报文段重传时,重传时间为旧的重传时间的两倍。

4.TCP怎么保证可靠性

1.校验和
2.序号 (将整个报文段划分为一个个字节组成的数据流,然后对每一个字节进行编号,在连接建立时,双方约定初始序号)
3.确认(确认是对接收到的数据的最高序号,即接收数据流中最大序号加1,表示下次期望接收到的序号)
4.定时器(用于重传)
5.否定确认
6.窗口和流水线

5.TCP滑动窗口协议

1.1byte等待协议
发送窗口=1 接收窗口=1

2.回退n步协议
发送窗口>1 接收窗口=1
一次连续发送n个数据帧,如果其中某个帧未确认,则从该帧开始往后的帧都进行重传

3.选择重传协议
发送窗口>1 接收窗口>1
提供一个缓冲区。一次发送n个数据帧,将这些帧放入该缓冲区,当某个帧未确认,则只需重传这个帧,然后将其作为一个整体传递给高层。

6.一个ip配置多个域名,靠什么识别?

http请求中的 host字段

7.了解哪些协议?
HTTP协议

NFS协议
DNS协议
UDP协议
FTP协议
SMTP协议
TLENET协议

8.TCP/IP头的长度

TCP头部最小长度为20字节,后面4N个字节可有可无
IP也为20个字节

4.操作系统篇

1.线程有哪些状态

创建状态 就绪状态
阻塞状态 运行状态 死亡状态

5.数据库篇

1.数据库的锁
锁是实现事物的关键,它可以保证事物的完整性和并发性
它可以使某些数据的使用者在某段时间不能访问某些数据或数据结构

分为 DML锁 (数据锁),DDL锁 (字典锁) , 内部锁和闩

DML锁
保护并发条件下数据的完整性
TM锁
表级锁
TX锁
事务锁或行级锁

DDL锁
用于保护数据库对象的结构,如表结构,索引等

内部锁和闩
保护数据库内部结构

2.数据库的索引,底层的数据结构,为什么要用b+树

索引是数据库中的一个排序的数据结构,用于快速查询和更新数据库表中的数据。

优点:
1.加快数据查询,更新
2.使用索引时,可以使用优化隐藏器提高性能
3.加快表与表的连接,特别是在实现数据的参考完整性上特别有意义
4.通过创建唯一索引,可以保证数据库表中行的唯一性

缺点:
1.建立索引也占用内存空间,当数据很大时,消耗内存较大
2.创建和维护索引需要时间,数据越大,时间越长
3.改变表,索引也可能要改变

6.学习方法篇

1.你是如何学习的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值