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吗?答曰:不会。

你可能感兴趣的:(oppo面经整理)