oppo面经整理
作者:三嘎
链接:https://www.nowcoder.com/discuss/464862?type=2&channel=-2&source_id=discuss_center_discuss_hot
来源:牛客网
2. 拥塞控制。
拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。这种现象跟公路网中经常所见的交通拥挤一样,当节假日公路网中车辆大量增加时,各种走向的车流相互干扰,使每辆车到达目的地的时间都相对增加(即延迟增加),甚至有时在某段公路上车辆因堵塞而无法开动(即发生局部死锁)。
解决拥塞的两条思路
增加网络可用资源;
减少用户对资源的需求
TCP的拥塞控制方法由4个核心算法组成。
“慢启动”(Slow Start)
“拥塞避免”(Congestion avoidance)
“快速重传 ”(Fast Retransmit)
“快速恢复”(Fast Recovery)
3. 输入一个网址,计算机响应的全过程?其中三次握手经历了哪些过程?
1、DNS解析
2、TCP连接
3、发送http请求
HTTP请求报文的方法是 get ,如果浏览器存储了该域名下的 Cookies,那么会把 Cookies放入 HTTP请求头里发给服务器,用于识别用户信息
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
4、服务器处理请求
服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件。
5、浏览器解析 html 代码,并请求 html 代码中的相关资源
浏览器拿到 index.html 文件后,就开始解析其中的 html 代码,遇到 js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上 keep-alive 特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序。
6、浏览器解析渲染页面
最后,Chrome 浏览器利用自己内部的工作机制,把请求到的静态资源和 html 代码进行渲染,渲染之后呈现给用户。
7、连接结束
4. TCP三次握手、四次挥手详细过程,为什么是四次挥手?
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
5. 说一下close_wait和time_wait。????????
6. 一个MSL一般为多长时间?
一分钟
7. 说一下粘包和分包。?
服务端与客户端没有约定好要使用的数据结构。Socket Client实际是将数据包发送到一个缓存buffer中,通过buffer刷到数据链路层。因服务端接收数据包时,不能断定数据包1何时结束,就有可能出现数据包2的部分数据结合数据包1发送出去,导致服务器读取数据包1时包含了数据包2的数据。这种现象称为粘包。
8. HTTP是采用长连接还是短链接?新版的HTTP呢?
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
9. C++的特性?C++11的特性有哪些?
1、auto auto让编译器通过初始值来推算变量的类型。
2、nullptr取代了NULL,专用于空指针
3、for
4、lambda表达式-----------使用lambda表达式统计字符串个数,以及大写字母个数
5、override、final
6、右值引用
7、move构造函数
8、容器初始化
11. 智能指针?auto_ptr的用法?shared_ptr的用????????????????
12. 左值右值的概念?
变量是左值,可以出现在赋值语句的左边;数字字面值是右值,不能出现在赋值语句左边
详细:左值可以出现在赋值语句的左边或者右边,即,左值也可以当右值用,右值只能出现在赋值的右边,、
左值表示程序有特定的名字引用到这个值,右值表示程序中没有特定的名字引用这个值。
变量是左值,因此可以出现在赋值语句的左边;数字字面值是右值,因此不能被赋值。实际上,左值是一个存储地址,是一块内存要存储数据所要操作的地址;而右值是是一个具体的数据或者数值,也就是内存存储的数据内容。
13. 关键字volatile的作用?
volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。
14. 字符串是以什么结尾的? \0
15. strlen(“\0”)和sizeof(“\0”)的输出分别是什么?0、2
16. 基类和派生类中,构造函数和析构函数的执行顺序?
构造是先基类后派生,析构是先派生后基类。一个形象的比喻就是盖房子,盖的时候从下网上,拆得时候从上往下
17. 多态是如何实现的?18. 虚函数是什么?
多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual也是虚函数。
虚函数的实现:虚函数是加了virtual关键词之后的类成员函数。在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。
19. 虚函数表存放在C++的哪部分内存中? 因为不改变,所以放在常量存储区
20. 派生类中,虚函数表是否和基类的虚函数表相同?
21. 判断这句话是否正确:数组名是常量指针。
数组名不是指针,永远也不是,但在一定条件下,数组名可以转换为指针。数组到指针的隐式转换
22. 如何保证线程安全。
1、对象的生与死不能由对象自身拥有的mutex(互斥器)来保护;
2、如何避免对象析构时可能存在的race conditon(竞态条件)是C++多线程编程面临的基本问题, C++借用shared_ptr和weak_ptr完美解决;
3、shared_ptr和weak_ptr是实现线程安全的Observer设计模式的必备技术;
23. 如何查看一个进程。ps
24. 你知道哪些Linux常用命令?
25. 进程和线程的区别?
26. vector、list、map、unordered的用法和区别。
27. 会设计模式吗?简述工厂模式和单例模式
28. 会MySQL吗?答曰:不会。
29. 会redis吗?答曰:不会。