5-23京东面经总结

Const修饰指针的两种方式

常量指针和指针常量以及指向常量的常指针,常量指针指的是指针指向的内容为常量,不能改变;指针常量指的是指针本身是一个常量,
不能改变指向的对象。指向常量的常指针所指向的内容以及指针本身的值都不能改变。
链接

引用和指针的区别及引用的底层实现

引用相当于给被引用对象起了一个别名,而指针存储的内容是指向对象的地址。
指针可以有多级,引用只能有一级。
sizeof返回内容不同,自增++的结果不同。
引用必须初始化所引用的对象,不能为空,并且引用的对象不能更改。
指针不一定要初始化所指向的对象,可以为空指针并且可以指向不同的对象。
引用相对于指针来说更加安全,不存在内存泄漏的问题。
链接

引用的底层实现仍为指针,占用内存
链接

虚函数表简单介绍

链接

虚基类表简单介绍

作用:为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
底层实现原理:底层实现原理与编译器相关,一般通过虚基类指针实现,即各对象中只保存一份父类的对象,多继承时通过虚基类指针引用该公共对象,从而避免菱形继承中的二义性问题。
链接
链接

智能指针

auto_ptr weak_ptr unique_ptr shared_ptr线程安全性
链接

移动构造函数

对于程序执行中的临时变量,往往只起到传递值的作用,并在传递之后进行销毁,而且接受传递值的对象要进行拷贝构造的过程。因此在使用临时变量初始化新对象时,可以将其包含的指针成员指向的内存资源直接移交给新对象,无需再拷贝一份,提高了初始化的效率。
链接

堆和栈的区别

栈中存储的一般是局部变量,堆中存储的是程序员开辟空间后存放的内容。
堆区空间需要人为手动申请和释放,栈区由系统管理。
栈区自上而下生长,堆区自下而上生长。
分配方式不同,堆区动态分配,栈区有动态分配和静态分配两种方式。
栈相对于堆区来说效率更高。
链接

unordered_map线程安全

unordered_map不是线程安全的,主要在于多个线程同时插入或修改相同键值的值时引起冲突。

TCP,UDP区别

tcp是面向连接的协议,在连接之间需要进行三次握手,在断开连接时需要进行四次挥手,而UDP直接发送消息,无需连接的步骤。
tcp是一对一的连接协议,udp可以一对一,一对多或者多对多。
tcp通过序列号ack,滑动窗口等机制保证报文的可靠传输,遇到报文乱序或者丢失会触发重传机制,udp不保证报文的可靠传输。
tcp是流式协议,报文没有边界,但是通过一系列机制保证连续可靠传输,udp是报式协议,报文有边界但是不保证完整传输。
tcp通过流量控制,拥塞控制保证网络拥塞时的可靠传输,udp不根据网络拥堵情况调整传输。
tcp相对于udp首部开销较大,tcp首部20字节+选项,udp首部只有固定的8字节。
tcp数据超过MSS则在tcp层进行分片,udo在IP层根据MTU分片。

详细见笔记

三次握手,四次挥手,time_wait状态,2MSL作用

三次握手:第一次握手是客户端主动发起连接,发送syn标志位+当前客户端的初始序列号,发送完毕后客户端的socket转变为syn_send状态,客户端在收到syn报文后,发送ack确认标志位+syn请求连接标志位=客户端的初始序列号+1+服务端初始序列号,状态转变为syn_recv,在收到服务端的ack后,客户端回复ack确认标志位+当前序列号后转变为establish状态,同样服务端收到对端发来的ack后转变为establish状态。
四次挥手:第一次挥手主动断开链接方发送FIN标志位+当前的序列号sep,状态转变为FIN_WAIT1。被动断开连接方收到对端的FIN后,仍有事务没处理完毕时,发送ack回复对端的FIN标志+本端当前的序列号,状态转换为CLOSE_WAIT状态。主动断开方收到此次的ack后状态转换为FIN_WAIT2等待对端处理完毕后发送FIN。在被动连接方事务处理完毕准备断开连接时,会向对端发送FIN标志位,状态转变为LAST_ACK,等待对方的ack回应。主动断开方收到此FIN后回复ack标志位并且状态转变为TIME_WAIT,经过2MSL变为CLOSE,断开完毕。在被动连接方收到最后一个ack时状态也由LAST_ACK转变为CLOSE,至此断开连接的过程结束。

time_wait状态的作用:1.保证被动连接方能够收到最后一次的ack,保障客户端和服务端的正常断开。
2.避免历史消息被相同的四元组错误接收。

由于这个ACK报文段可能会丢失,使得处于LAST_ACK状态的服务器得不到对已发送FIN报文段的确认,从而会触发超时重传。服务器会重发FIN报文段,客户端能保证在2MSL时间内收到来自服务器的重传FIN报文段,从而客户端重新发送ACK应答报文段,并重置2MSL计数。
假如客户端不等待2MSL就之间进入CLOSE状态,那么服务器会一直处于LAST_ACK状态。
当客户端发起建立SYN报文段请求建立新的连接时,服务端会发送RST报文段给客户端,连接建立的过程就会被终止。

2MSL的作用:MSL是报文最大生成时间,TIME_WAIT等待的2MSL时间,可以理解为数据报一来一回所需要的最大时间。2MSL时间是从客户端接收到FIN后发送ACK开始计时的。如果在这个时间段内,服务器没有收到ACK应答报文段,会重发FIN报文段,如果客户端收到了FIN报文段,那么2MSL的时间将会被重置。如果在2MSL时间段内,没有收到任何数据报,客户端则会进入CLOSE状态。也即至少允许报文丢失一次。

链接
链接

https和http的区别,加密过程

1.http是明文传输,存在安全风险问题,https加入了TLS层安全协议使报文加密传输。
2.http在tcp三次握手之后便可以进行传输,https需要在三次握手之后进行TLS四次握手建立连接。
3.http默认端口80,https默认端口443
4.https需要向CA证书权威机构申请证书,保证服务器身份的可信性。
混合价目实现信息的机密性,摘要算法保证消息的完整性,将服务器公钥放入数字证书保证消息的合法性。

加密过程:
采用混合加密的方式。四次握手:clienthello 客户端发送TLS版本,随机数以及支持的密码套件列表。
serverhello服务端发送TLS版本,随机数,确认的密码套件列表,以及数字证书。
客户端拿到数字证书后使用CA公钥确认证书的真实性,然后从证书取出服务器的公钥发送加密报文,发送随机数,加密算法改变通知,客户端握手结束通知以及对之前数据的摘要以进行校验。
服务端计算出本次通信的会话密钥,发送加密算法改变通知,服务端握手结束通知,以及对之前发送所有数据的摘要以进行校验。
链接

数据库索引的作用,索引的种类

索引的作用:加速表查找的效率,提高数据库的性能。

数据库索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录行的数量,数据库索引就是数据库的数据结构,进一步说则是该数据结构中存储了一张表中某一列的所有值,也就是说索引是基于数据表中的某一列创建的。

索引的种类:主键索引,唯一索引,常规索引,全文索引。聚集索引,二级索引
链接

哈希索引和B+树索引的优势

哈希索引查找效率较高,但是不支持范围查询,需要建立哈希映射函数。
B+树索引支持范围查询,需要建立B+树数据结构。
哈希索引只支持等值查询,不支持模糊匹配,多列联合查询,无法利用索引避免排序运算。
链接

什么时候索引会失效?什么样的列不能用来做索引

在索引列上进行操作,字符串类型字段使用时不加引号,模糊查询时使用头部模糊匹配,使用or分隔开的条件有不为索引的字段,Mysql评估使用索引比全表扫描更慢的情况。

查询操作较少,增删改操作较多的列。值比较少的类。修改性能大于查询性能的列。
链接

线程间通信方式

条件变量,信号量,互斥锁,读写锁等。
链接

条件变量和互斥锁介绍

互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。在互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥锁加锁,其它线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。
条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用。
当条件不满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说条件变量被用于线程间的同步;当条件不满足的时候,允许其中的一个执行流挂起和等待。

死锁概念,解决方法

一组进程中,每个进程都在等待其他进程持有资源的释放,因而永远无法得到资源,无法继续执行。
产生条件:持有并等待条件,环路等待条件,互斥条件,不可剥夺条件
解决方法:获取不到资源时及时释放已拥有资源,获取资源时一次性获取所有需要的资源,资源有序分配法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值