3.6 模拟面试

1.讲一下tcp的拥塞控制

答:在网络中传输数据,吞吐量过小浪费带宽,吞吐量太大会发生丢包问题,这个时候就需要用到拥塞控制,来根据当前网络环境动态的发送适合当时的吞吐量大小

  TCP的拥塞控制算法总共有四个  慢开始,拥塞避免,快重传,快恢复

  慢开始:目的是为了大概测试出网络的拥塞情况,开始拥塞窗口是1,也就是只能一次发送一个报文,然后接收端每回复一个报文,就可以将窗口+1,也就是1 2 4 8...的指数性的增长,然后会设置一个阈值,代表<这个值的前一段是安全区域,可以放心的指数性的增长,不会出现丢包,如果>=阈值了就执行拥塞避免算法

  拥塞避免:代表当前的区域处于很容易丢包的大小区域了,这个时候每次发一次窗口大小的数量包窗口只是+1(慢开始是*2),如果出现丢包了就去执行快重传

  快重传:这个算法主要目的就是快一点告诉发送端已经丢包了,而不是等包的时间过完,等超时重传机制来告诉发送端丢包了,具体原理如果接收端发现当前接受的包序号不得行的时候,就发送一个丢包的前一个包的序号给发送端,代表他的后一个包没收到,连续三次收到不是这个序号的包后,三次确认。发送端就知道丢包了,然后使用快恢复

  快恢复:快恢复也就是不要一棒子打到底,不要把窗口一下一夜回到解放前的缩成只有一个包大小,而是缩当前的一半,阈值(此时是代表当前窗口大小)也缩一半,然后再次进行拥塞避免算法,然后就是这样一直重复了

 

2.左值引用和右值引用的区别

答:左值引用:主要指向于有名字的对象,也就是有自己内存地址的,属于持久性对象

  右值引用:主要指向于匿名性对象,生命周期运算完就挂的,用&&强行续命,右值引用主要用于函数传参,有移动语义,完美转发的应用场景,可以用move将对象强行变成右值引用

 

3.四种cast强制类型转换的区别和使用 

答:static_cast: 用于类之间的类型转换,上行转换安全(因为子类肯定都有父类的内存部分),下行转换没有动态类型检查不安全(会直接转,造成错误指针),用于内置类型转换,会有一些简单的类型检查,主要用于非多态的操作,内置类型的隐式转换操作

  dynamic_cast:    用于有亲缘关系的转换, 父类子类之间,上行转换安全,下行转换有动态类型检查安全(转换错误会返回空指针,这个就可以判断出来,方便程序员找错,因为动态类型检查信息是在虚函数指针里面才有,所以主要要基类有虚函数才能使用),兄弟类之间也可以进行转换

  const_cast :主要用于const属性的增删

        reinterpret_cast:作用和C语言的强制类型转换差不多(),是从底层编译就开始修改的,极度不安全

4.讲一下智能指针

答:在智能指针出现之前只能通过普通指针去对内存进行操作,但是容易出现忘记释放内存的场景,这样就会造成内存泄漏,C++11提出了智能指针,里面用到了rall资源管理机制,目的就是利用类的析构函数自动释放,shard_ptr  底层就是用类,里面包含一个指针,一个计数器,如果通过拷贝或者赋值操作,计数器都会+1,最后析构的话,如果计数器为0代表没有指针指向就释放内存

weak_ptr 一个弱引用,实际上不会有计数的增加,主要目的用于解决shard_ptr的循环引用问题,循环引用问题会导致最后无法析构掉内存

5.futurethread了解吗 

答:  不了解 

 呃,没用过,我写程序实验后再来完善答案

6.tcp/ip四层模型和osi七层模型具体是哪些

答:tcp/ip      网络接口层   网络层     传输层     应用层

  OSI     物理层  数据链路层   网络层   传输层   会话层   表示层   应用层

 

7.建立TCP服务器的各个系统调用

 答:先盗个图

 呃,没用过,我写程序实验后再来完善答案

 

8.进程间消息通讯方式

答: 管道:无名管道 有亲缘关系才能使用    有名管道,没有这要求,是unix早期的通讯方式

   消息队列:是通过把东西写到内核,然后再去内核取的一种做法,取得时候不一定要按先来先取

   信号量:只能传输很少得东西,一般用来同步互斥的作用

   共享内存:是进程之间共享一块儿区域,是通信最快的方式,但是要注意进程访问内存得同步问题,所以一般和信号量搭配使用

 

 

9.进程和线程的区别

答:线程之间是共享进程间的所有东西的,然后自己有少量的栈和寄存器的内存

  进程是资源分配的最小单位(在线程出现之前是最小,然后因为可以分配资源给线程,所以变了身份),线程是调度的最小单位

  线程上下文切换开销小,因为是共享同一进程区域的,不同进程下的线程切换会引发进程切换

 

10.了解过类型萃取吗

答:类型萃取是用类模板的特化实现的,是可以通过特化来判断出当前是什么类型,然后执行不同的事情,比如可以是类是要一个一个赋值,内置类型memset赋初值完事儿

 

 

11.tcp滑动窗口的原理

 答:窗口大小限制了发送端可以发数据包不用等回复确认就又可以发,发送端和接收端会在三次握手的时候交流窗口大小,然后窗口内的数据包才可以发送出去,接收端每回复确认一个包,发送端就可以把窗口平移一下,这也是叫滑动窗口的原因,如果发送端给接收端发包的时候出现丢包,就会采用快重传

 

12.TCP两次握手有什么问题

答:首先TCP建立连接的三次握手    客户端发送syn,服务端回复一个ack,一个syn,客户端再回复一个ack    

现在假设两次握手,客户端发送的syn包在路上迷失,客户端就会超时重传,然后服务端回复一个ack 建立连接,但是那个迷路的包也到了,那么服务端也会建立连接,这个无效的连接就会一直占用服务器资源,第三次握手就可以发送包对客户端进行确认,是否要建立,然后客户端发现不对就可以说不是

 

 

13. 反转一个链表

答:用建立链表的头插法,把这个节点一个一个的用来建立新的链表,具体要用三个指针

14.索引的底层实现(B+树,为何不采用红黑树,B树)

答:先说为什么B树比红黑树好,B树结构是一个多路平衡查找树,每个节点存放了几个值,按此顺序存放,几叉其实就代表划分了这么多个区间,在区间里面查找值,虽然实际上在内存中查找的比较数是要比红黑树多的,但是这些比较次数在磁盘IO面前都可以忽略不计,所谓的磁盘IO也就是系统对内存分成一个一个的内存块,程序每次读入一个内存块的时间是很多的相比内存中的比较来说,B树和B+树

一般都是用于数据库的索引,在海量数据的时候索引的数量也是非常大的,不能直接读入内存中,只能是一个节点一个节点的读入,所以红黑树的比较次数虽然少,但是加载的节点数量比B树多。B树的节点存放多少个值看系统的内存块大小而定,因为B树更加矮胖,所以比红黑树优秀

B+ B树的区别  B+是实际数据都是存放在叶子节点的,非叶子节点只是一个简单的索引,因为非叶子节点只是存放索引,不用存放其他更多的值,所以可以存放的索引更加多,就使得树更加的矮胖,使得加载的节点更加少,还有就是B+树的叶子是用链表相连接的,这个链表作用主要体现在select的范围查询,只要先找到上界位置,然后沿着链表遍历即可,B树的话还要中序遍历,加载的节点更加多

15.七只老鼠,一百瓶药水,其中有一瓶是毒药,毒发时间为一天,使用一天时间检测出毒药

答:这个我就贴一个官方解答了

对100瓶毒药进行二进制编码,0000001,0000010,...,1100100

老鼠分别为A,B,C,D,E,F,G

A老鼠喝编码格式为1xxxxxx的药水

B老鼠喝编码格式为x1xxxxx的药水

C老鼠喝编码格式为xx1xxxx的药水

D老鼠喝编码格式为xxx1xxx的药水

E老鼠喝编码格式为xxxx1xx的药水

F老鼠喝编码格式为xxxxx1x的药水

G老鼠喝编码格式为xxxxxx1的药水

最后查看老鼠死亡情况,假如E和F死亡,说明0000110为毒药。

猜你喜欢

转载自www.cnblogs.com/Lis-/p/12431707.html
3.6
今日推荐