2021-07-20 诺瓦星云笔试复盘

1.使用https时,如何对性能进行优化

HTTPS访问速度优化

TCP Fast Open

HTTPS和HTTP使用TCP协议进行传输,也就意味着必须通过三次握手建立TCP连接,但一个RTT的时间内只传输一个syn包是不是太浪费?能不能在syn包发出的同时捎上应用层的数据?其实是可以的,这也是TCP Fast Open 的思路,简称TFO。

HSTS(HTTP Strict Transport Security)

作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务端返回一个HSTS的HTTP Header,浏览器获取到HSTS头部之后,在一段时间内,不管用户输入www.baidu.com还是http://www.baidu.com,都会默认将请求内部跳转成https://www.baidu.com。

Session Resume

顾名思义就是复用Session,实现简化握手。复用Session的好处有两个:
减少了CPU消耗,因为不需要进行非对称密钥交换的计算。
提升访问速度,不需要进行完全握手阶段二,节省了一个RTT和计算耗时。

2.TCP协议自上向下分为哪几层,每一层列举至少一个通信协议

在这里插入图片描述

3.ssh加密是什么

ssh是一种协议标准,也叫做安全外壳协议,主要为远程登录会话和其他网络服务提供安全性的协议。全称为Secure SHell,本质上是进行加密的shell。它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
在SSH安全协议的原理中, 是一种非对称加密与对称加密算法的结合
SSH数据传输时候基本上所有过程都是使用对称密钥来加密。只有在刚开始创建连接阶段和身份认证握手阶段才使用非对称加密
对称加密是一种加密类型,在加密和解密时候使用同一个密钥;非对称加密与对称加密的不同之处在于,为了在单个方向上发送数据,需要两个相关的一组密钥。其中一个密钥称为私钥,而另一个称为公钥。
在这里插入图片描述

4.epoll和select的区别

涉及到了I/O多路复用 先看牛客的讲解
再看

https://www.cnblogs.com/aspirant/p/9166944.html
https://blog.csdn.net/ysu108/article/details/7570571

5.什么是缓冲区溢出,有什么危害

在这里插入图片描述

6.简单描述段页式存储管理机制

https://blog.csdn.net/jinking01/article/details/107098437
这个讲的特别好 还没看完

7.互斥锁(mutex)机制,以及互斥锁与读写锁的区别

互斥锁

mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

读写锁

rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时,读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。适用于读取数据的频率远远大于写数据的频率的场合。

互斥锁和读写锁的区别:

1)读写锁区分读者和写者,而互斥锁不区分

2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。

Linux的4种锁机制:

互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒

读写锁:rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时,读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。适用于读取数据的频率远远大于写数据的频率的场合。

自旋锁:spinlock,在任何时刻同样只能有一个线程访问对象。但是当获取锁操作失败时,不会进入睡眠,而是会在原地自旋,直到锁被释放。这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源。

RCU:即read-copy-update,在修改数据时,首先需要读取数据,然后生成一个副本,对副本进行修改。修改完成后,再将老数据update成新的数据。使用RCU时,读者几乎不需要同步开销,既不需要获得锁,也不使用原子指令,不会导致锁竞争,因此就不用考虑死锁问题了。而对于写者的同步开销较大,它需要复制被修改的数据,还必须使用锁机制同步并行其它写者的修改操作。在有大量读操作,少量写操作的情况下效率非常高。

8.CAS无锁队列实现的原理

(这个牛客课里没有 自己背一下)
CAS的意思是Compare And Swap,从字面意思上面也可以知道实际就是对数据进行交换的一种原子操作。对应到CPU指令的话就是cmpxchg。
无锁队列的内部实现实际也是原子操作,可以避免多线程调用出现的不可预知的情况。主要的核心就是函数__sync_bool_compare_and_swap,返回值为bool型,原子交换操作成功返回true,失败返回false。
原子操作是指不会被 线程调度 机制打断的操作

9.单词反转在这里插入图片描述

在这里插入图片描述

10.

在这里插入图片描述

11.

在这里插入图片描述

12.引用和指针的对比

1、指针值是一个变量的地址,通过解引用指针可以对这个变量进行操作
引用是一个变量的别名,对引用的操作就是对变量本身的直接操作
2、指针在声明和定义的时候可以赋初值(某个他所要指向变量的地址),也可以根据需要设置为NULL
引用必须用变量初始化,以表示它是哪个变量的引用
3、指针传参世界为值拷贝方式,将指针值(变量的地址)拷贝给形参,然后通过这个地址来访问这个变量,再进行相关操作
引用传参时可以理解为直接给这个变量又取了一个别名,然后通过这个别名来操作这个变量
4、指针的的复制会再分配空间,32平台下,是四个字节,这里的复制指的是在定义一个指针,使得这个新指针也指向旧指针所指向的变量
引用的再次取别名并不会开辟空间,实际是变量的引用都不开辟空间,无论引用有多少个,始终只有变量最初被定义出来的时候分配的那一次空间
5、指针和引用的底层实现机制都是一样的

13.多态,重载和覆写的概念

多态

分为两类:静态多态(编译时多态)和动态多态(运行时多态)
  编译时多态体现在函数重载模板
  运行时多态体现在虚函数上。虚函数:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

重载

在这里插入图片描述

覆写

在这里插入图片描述

14.判断代码错误

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值