面经啊啊啊啊啊啊
Posted 蚍蜉撼树谈何易
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面经啊啊啊啊啊啊相关的知识,希望对你有一定的参考价值。
面经
- C++
- 操作系统
- 网络
C++
对面向对象的理解。
面向对象的三大特性
讲一下多态
指针与引用区别
struct和类的区别?
- 关于默认访问权限:class中默认的成员访问权限是private的,而struct中则是public的。
- 关于继承方式:class继承默认是private继承,而struct继承默认是public继承
宏定义与常量定义的区别?
① 两者在代码生成时所被处理的阶段不同,宏的替换在预编译(预处理)阶段,而const 常量则在编译阶段才确定,并分配内存
②const常量有数据类型,而宏没有数据类型。编译器只对宏在预编译阶段进行替换,却没有类型及安全检查,所以在替换过程中可能会出现错误,但是编译器却可以对const所定义的常量进行类型和安全检查,由宏引起的错误一般调试不出来,而const常量可以。
描述一下一个类对象的内存结构
C程序的存储区有哪些?
栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
数据段:存放的是全局数据、与静态数据,全局数据又可分为已初始化的全局区(data)和未初始化的全局区(BSS);
代码段:可执行代码和只读常量(文字常量区);
内存映射段:文件映射、动态库、匿名映射
智能指针如何实现?(自查,未写)
用C++实现一个不能被继承的类
将构造函数和析构函数声明为私有函数,该函数就不可被继承。同时为了该类可以被实例化,在类中定义一个静态函数,返回初始化的一个类对象。
C++虚函数机制如何实现?
编译器为每个含有虚函数的类建立一个虚函数表,表中存放了该类的虚函数的入口地址,实例化带虚函数的类的对象时,编译器在对象中附加一个vpointer指针,该指针指向该类的虚函数表;不论类中有多少个虚函数,但仅给类的对象附加一个虚指针。(一般虚指针放在对象的开头位置)类中的虚函数入口地址通过vpointer加上一个偏移地址来获得。
malloc/free & new/delete的区别是什么?
- 编译时,New可以根据对象的类型,自动决定对象的大小;而malloc需要显式指定需要分配空间的大小。
- New返回指向正确类型的指针,不必进行强制类型转换;而malloc返回void *,必须进行强制类型转换,可能带来错误。
- 用new生成对象时,会调用构造函数, 用malloc则不会;同样,用delete删除对象时,会调用析构函数, 用free则不会.
- 如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。因此,new/delete必须配对使用,malloc/free也一样.
友元函数与友元类
单继承、多继承、虚拟继承区别
虚拟继承:主要是为了解决菱形继承的问题
public、protected、private区别
修饰成员函数或成员变量时:
protected、private均不可在类外被访问。
public:可被访问。
STL中迭代器失效
vector:
3.swap函数会造成迭代器失效。
string:
1.
什么是迭代器?
STL六大组件
static关键字
1、修饰函数的局部变量:
特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局
2、修饰全局函数和全局变量:
特点:只能在本源文件使用
3、修饰类里面的成员变量:
特点:和1差不多,定义多个static y,但只有一个y,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明)
4、修饰类的成员函数:
特点:f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用)
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
静态成员函数
2.静态成员函数的访问方式与静态成员的访问方式相同
3.普通成员函数可访问静态成员变量、也可以访问非静态成员变量
4.静态成员函数也会受到权限的约束
const关键字
https://blog.csdn.net/qq_45313714/article/details/117979894
extern"C"
C++内存分布
栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
数据段:存放的是全局数据、与静态数据,全局数据又可分为已初始化的全局区(data)和未初始化的全局区(BSS);
代码段:可执行代码和只读常量(文字常量区);
内存映射段:文件映射、动态库、匿名映射
struct 和class区别
struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!!!
区别1:
1.结构体成员默认属性与类的默认属性不同,结构体默认为公有,而类默认为私有。
2.类的默认继承方式为私有,而结构体的继承方式为公有。
3.struct不支持模板,而class支持模板
vector与list区别
智能指针
操作系统
进程间通信
进程、线程、协程概念?区别?
多进程与多线程对比
同步、异步、阻塞、非阻塞分别的含义?
同步:
异步:
看这里
阻塞: 调用IO方法的线程进入阻塞状态数据没到的话,线程阻塞,直到有数据来了唤醒
阻塞,就是这个时间段内的IO一直等待,应用程序不能做其他的事情
非阻塞:**做一件事如果是否成功没有马上得到反馈,就先放着。如果以后要知道是否真正成功了,那就自己得去询问。**比如你去汇款,现在说我要去汇款了,然后柜员说汇了,至于钱什么时候能到,那就要自己去问了,反正现在是得不到结果的。比如read(),现在设置为非阻塞之后呢,如果现在没有内容去读取,那么就返回说没有读到,至于数据什么时候来呢,你要去自己询问。所以配合非阻塞呢,一般是轮询。但是这样有个缺点,浪费了大量的CPU时间。
死锁
锁的本质:
乐观锁、悲观锁
静态链接与动态链接的区别
静态链接的过程就已经把要链接的内容已经链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;
而动态链接这个过程却没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,生成的可执行文件中并没有要链接的内容,所以当你删除动态库时,可执行程序就不能运行。
各自优缺点:
看这里
进程间通信的方式,各自有什么特点?
1,匿名管道
2. 命名管道
3. 消息队列
4. 共享内存
5. 信号量
6. 套接字
7. 信号
共享内存
管道
信号
套接字
共享内存可以在不同的进程间通信吗?socket是怎么样进行进程间通信的?
看上面
Linux的虚拟内存(进程虚拟地址空间)了解吗?
8、Linux多线程,同步怎么实现的?怎么保证线程安全?为什么要同步?
对临界资源采取加锁机制。POSIX信号量保证
添加链接描述
线程池
同上
内核态中的系统调用如果有多个线程同时调用,会阻塞吗?会发生什么?
不一定,若是对一块空间进行读操作的话,则不会阻塞。
内核态用用户态区别
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
mutex和lock()区别
网络
讲一下三次握手和四次挥手
三次握手
四次挥手
讲一下为什么是三次握手?而不是两次握手或者四次握手?
为什么建立连接要三次握手,释放连接的时候要四次
1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。
2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。
3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。
4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。
常见http状态码
常见状态码
499是由于超过客户端设置的请求超时时间,客户端主动关闭连接,服务器code为499。
500多是由于代码语法错误,导致CGI执行错误并且会把错误结果通知服务器,服务器则报500。
502是由于CGI由于在自身的执行时间要求内无法按时完成,则无法返回给服务器正常响应,此时服务器会返回502。
504是CGI在服务器设置的超时时间内无法按时返回响应,服务器则返回504。
499,502,504都会因为超时而产生,区别是超时超了谁的时,499是超了客户端本身的连接时间,502是超了CGI的执行时间,504是超了服务器本身的最大允许读取时间。
长短链接区别和适用场景
短链接:
短连接:指的是client端与server端进行通信时,此时先三次握手,建立连接,然后client端向服务器发送请求,服务器回复,此时进行四次挥手,断开连接。早期使用短连接,拿网页来说,早期的网页数据量较小,一次可以发送完,所以采用短连接可以做到管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段http 0.9
长连接:
client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。
首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。
如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:
1.客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
2.客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
3.客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
4.客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应
适用情况
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。
短连接:
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
简述http的生命周期
在浏览器输入一个url,回车后都经历了什么?
tcp链接与释放的过程,与udp的区别
tcp链接与释放的过程,与udp的区别(为什么是3次握手,4次挥手)
同上~~
一次tcp链接能发送多少次http请求(http1 http1.1 http2 的区别与联系)
1.http 1.0
默认一次tcp连接进行一次http请求之后就会断开(由于资源浪费,有些服务器支持通过配置支持多次)
2.http 1.1
请求头配置:Connection:keep-alive = true,只要tcp连接不断开(默认2小时),一直可以进行http请求,但是一个tcp连接同一时间只支持一个http请求
Connection:keep-alive = false,只能发一次http请求
3.http 2.0:多路复用技术Multiplexing,一个tcp可以并发多个http请求(理论无上限,但是一般浏览器会有tcp并发数的限制)
TCP协议如何提供安全可靠的服务?
简述下I/O多路复用技术
五层、七层网络模型
http
http与https区别
安全性上,HTTPS是安全超文本协议,在HTTP基础上有更强的安全性。简单来说,HTTPS是使用TLS/SSL加密的HTTP协议
申请证书上,HTTPS需要使用ca申请证书
传输协议上, HTTP是超文本传输协议,明文传输;HTTPS是具有安全性的 SSL 加密传输协议
连接方式与端口上,http的连接简单,是无状态的,端口是 80; https 在http的基础上使用了ssl协议进行加密传输,端口是 443
看这里
https的加密是怎么完成的?对称加密和非对称加密的区别?为什么要非对称加密呢?
对称加密:
缺点:容易被中间劫持,无法保证拿到的公钥是真正的服务器发给它的。
https底层采用的
非对称加密:
加密与解密采用不同的密钥。
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人–银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
特性:
(1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
(2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
DNS协议?DNS劫持
DNS协议:
DNS协议则是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。
DNS劫持:
一般而言,用户上网的DNS服务器都是运营商分配的,所以,在这个节点上,运营商可以为所欲为。
例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。
HTTP 1.0,1.1 对比
以上是关于面经啊啊啊啊啊啊的主要内容,如果未能解决你的问题,请参考以下文章