八股文总结

八股文总结

一、c++八股文

STL

1、什么是STL

STL包括容器、迭代器和算法
其中容器包括顺序容器(vector,list)和关联性容器(map,set)
算法包括排序算法和复制算法,包括容器特定的算法
迭代器的目的是在不暴露容器内部结构的前提下,实现对容器的遍历

3、hashtable的实现
  • 在STL中的hashtable通过开链法来解决哈希冲突,具体通过一个vector数组和链表来实现。
  • 当要插入元素时,首先计算出该元素的哈希值,然后将值映射到哈希表的索引。如果当前索引处没有元素,则将该值插入指向链表的头部。如果该处已经有其他元素,则插入该处链表的尾部,以此通过链表将元素穿起来。
  • 当要查找元素时,先计算出该元素的索引,然后遍历该处链表进行查找
  • 哈希表的大小在创建时进行确定,在容器中提供了一系列质数,因为质数能更好的分布哈希值,避免哈希冲突。当哈希表中的(哈希表元素个数/哈希表大小)超过阈值,则寻找下一个质数,创建新的vector数组,扩大哈希表,并进行元素转移
  • hashtable时c++98中的,在c++11标准中,改为unordered_map
4、slist的实现
  • slist为单向链表,其中每一个结点通过结构体实现,包括一个指针和一个元素
  • 所以结构体中只存储了下一个结点的指针,减少了一半的内存消耗
  • 单向链表不允许后退,所以设计了一种单向迭代器,
5、list的实现
  • list是双向链表,具体的实现可以分为节点定义和迭代器定义、构造函数定义、插入删除定义
  • 在结点定义中,在结构体内定义了前后指针和元素
  • 在迭代器定义中,为双向迭代器,通过模版定义了value_type,reference,pointer,difference_type,并且定义了一个node结点,表示当前迭代器指向的结点
  • 插入删除中,可以分别向前和向后插入删除
6、vector的实现
  • vector底层数据结构为连续的内存空间,和array类似。但array在定义时,空间大小就无法再更改。vector可以动态扩展内存。
  • 具体vector的内部维护了三个指针,即起始位置,最后一个元素位置,内存空间的最后一个位置。
  • 当元素数量超过最大容量时,将容量扩展为两倍,并进行元素复制。在这个过程中,通过迭代器和移动语义减少内存拷贝。
7、 stack和queue的实现
  • stack是一种先入后出的数据结构。由于它是单向开口的数据结构,所以很容易由list和deque这种双向开口的数据结构实现,只需要移除部分接口
  • 通过修改某个容器的接口,然后变成另外的结构,通常叫做adaptater(适配器),从而将其归为容器适配器
  • stack也可以使用list来构建,但是没有迭代器,不能进行遍历
8、++it和it++
  • 先++可以直接对this指针进行加法操作,然后返回this指针,不需要创建临时对象
9、list和vector的区别
  • vector具有连续的内存空间,并且可以实现o1的随机存取
  • list是双向链表,内存空间是不连续的,所以随机存取是on的,并且list的每一个节点都包含向前和向后的指针,所以资源消耗较大
  • 并且vector可以双向遍历
10、vector删除策略
  • 由于每次扩容的大小一定等于或大于之前的大小,并且每次分配的空间越多,平摊的时间复杂度低,所以将增长因子设为2,即每次 都翻倍增长,可以直观减少扩容的次数
11、迭代器删除元素
  • 顺序容器中,erase使删除迭代器及之后所有迭代器失效,然后返回下一个有效的迭代器
  • 关联容器中,erase只是被删除元素的迭代器失效,返回值为void,所以使用erase(it++)

c++11

2、左值引用和右值引用
  • 首先,介绍一些左值和右值:能够取地址的为左值,比如int a = 1 ,其中a为左值。
    而1为右值,不能取地址。右值又分为纯右值和将亡值。纯右值等同于c++98标准中的临时变量和不与对象相关的字面值。

  • 左值引用和右值引用都是引用类型,并不拥有引用对象的内存,所以需要在定义时进行初始化。

  • 左值引用只能用左值初始化,而常量左值是万能引用类型,可以用右值初始化。

  • 右值引用只能使用右值进行初始化,除非通过move将左值的资源进行搬移。

  • 右值引用的特点:
    右值引用的变量生命周期和该引用类型变量一样,相当于延长了寿命,比如将在函数作用域内实例化的类,在进行函数返回值传递

8、 shared_ptr

主要实现方法通过引用计数实现,当引用计数为0时,智能指针指向的对象进行析构

  • 可以通过构造函数初始共享智能指针
  • 也可以通过make_share();初始化
9、weak_ptr

弱智能指针可以通过空的weak_ptr实例化,也可以 通过share_ptr实例化。
当通过share_ptr实例化时,他只负责监管共享智能指针的资源,而不会增加其引用计数。并且weak_ptr可以通过lock成员函数,获取原始指针 。通过lock返回原始指针可以避免拷贝构造。

10、move和forward
  • 当需要得到一个右值引用时,不可以通过左值来进行初始化。而可以通过move函数,转移资源
  • 当右值引用命名后,本身已经变成左值引用,如果要在函数间进行转发,且不使用拷贝构造,则使用forward,如果T为左值引用,则转发为左值。如果为非左值,转发为右值。
11、auto、decltype
  • auto 实现函数返回值拷贝复制的自动推演
  • decltype实现函数返回值类型的自动推演 decltype(fun) a;
12、null和nullptr
  • 在c中,null为空指针,但是在c++中会被隐式转换为int 0,所以通过nullptr自动推导环境空指针类型。
13、lambda函数

是内联的匿名函数,编译器会自动生成一个闭包类,并返回一个闭包实例。。可以通过作用域捕获闭包内的变量。

二、计算机网络八股文

2.1、键入网址到网页显示,期间发生了什么

1、http
  • 刚开始输入的是url连接,最开始的http是访问数据时请求的协议。//后面是服务器名称 /后面是访问服务器的文件地址
  • 解析url之后,根据这些信息发送http请求报文,变成http数据包
2、dns
  • 得到http数据包之后,需要通过域名,查询目标地址的ip
  • 客户端首先发送dns请求给本地的域名服务器,查询缓存
  • 本地域名服务器依次询问根域名服务器、顶级域名服务器、权威域名服务器
  • 查询到ip之后,客户端和目标建立连接
3、协议栈
  • 应用程序通过调用socket库,委托协议栈工作。
  • 协议栈上半部分通过tcp、udp协议接受应用层的委托进行收发数据
  • 协议栈下半部分用ip协议控制网络包收发操作
  • ip中包含arp协议,查询对应ip的mac地址
4、tcp
tcp报文格式
  • 首先需要源端口号和目标端口号
  • 数据包的序号
  • 确认号,防止丢包
  • 状态位:syn:发起连接,ack:回复,,rst:重新连接,fin:结束连接
  • 窗口大小,用来进行流量控制。通过双方约定窗口缓存大小,防止撑死饿死。并且通过控制自身发送速度进行拥塞控制。
tcp三次握手
  • 在http传输数据之前,通常需要tcp建立连接,这个过程就是三次握手
  • 首先服务端开启监听
  • 客户端发送syn请求,进入syn-sent状态
  • 服务端接受syn,返回syn,并且发送对syn的ack,进入syn-rcvd状态
  • 客户端接受syn和ack,发送对于服务端syn的ack,进入established状态
  • 服务端接受ack后,进入established状态
tcp分割数据
  • mtu:一个网路包的最大长度
  • mss:出去ip和tcp头部,剩余容纳数据的最大长度
  • 数据被划分为mss长度,加上tcp头部,然后送给ip模块进行发送
tcp报文生成
  • tcp协议中的两个端口号,浏览器监听的端口号是随机生成。web服务器端口号(http为80)
  • 在建立好连接之后,生成tcp报文,tcp报文其中的数据部分就是http头部和数据段
5、ip
ip报文头部
  • 源地址ip和目标地址ip
  • 协议号。由于http由tcp传输,所以协议号为06
6、mac
mac包头格式
  • mac头部是以太网使用的头部,包含接收方和发送方的mac地址
  • 发送方mac地址
  • 接收方mac地址
  • 协议类型:ip协议0800. arp协议0806
arp协议
  • arp协议会在以太网中通过广播的形式,对所有设备询问ip
  • 在linux中,通过arp -a查看缓存
  • arp协议只能请求同一个子网中路由器的mac地址
7、出门-网卡
  • 通过网卡将数字信号转换为电信号
  • 网卡驱动获取网络包之后,将其复制到网卡内的缓存
  • 最后在开头加上报头和起始帧分界符
  • 在末尾加上检测错误的帧校验符fcs
  • 然后变成电信号
8、送别-交换机
  • 电信号到达网线接口,交换机将电信号转换为数字信号
  • 检查fcs校验错误,然后放到缓存
  • 交换机网卡不具有mac地址,所以不需要判断终点mac地址
  • 在交换机中的mac地址表查询记录和交换机的端口号
  • 如果缓存中没有该mac地址,或者mac地址为广播地址,则向所有端口转发数据包
9、出镜-路由器
路由器基本原理
  • 路由器为三层网络设备,每个端口都有mac地址和ip地址
  • 路由器接到以太网包后,查询路由表,然后从相应端口发送
路由器接收操作
  • 电信号到达网线接口部分,然后转为数字信号,通过fcs进行错误校验
  • 如果校验没有问题,则进而检查mac头部,如果确认是发送给自己,则存入缓存
路由器输出
  • 完成接收之后,去掉原始mac头部。然后替换为自己的mac头部
  • 路由器通过数据包的ip头部内容进行转发操作
  • 通过路由表查询转发目标
  • 将目标ip地址和路由表中每条ip的子网掩码按位相与,然后再找ip
发送操作
  • 首先通过路由表的网关列判断对方的地址
  • 如果网关是iip地址,则这个ip地址就是下一个目标,还需要寻找下一个路由器
  • 如果网关为空,则ip头部中的接收方ip就是目标地址
  • 在发送的过程中,变化的一直都是mac地址
10、到达服务器
  • 服务器首先确认mac头部,确认mac地址值为服务器
  • 然后打开ip头部,确认ip地址是服务器
  • 然后再打开tcp头部,确认数据包的序列号。。如果该数据包正确,则返回ack。
  • 然后检查tcp头部中的端口号,发现http正在监听此端口号,所以将数据包发送给http进程
  • 然后http进程看到数据包内容为请求页面,然后将页面封装为http响应报文,重新发送给客户端
11、客户端拆快递
  • 客户端收到相应报文之后,交给浏览器渲染页面
  • 客户端要离开时,向服务器发起tcp四次挥手,然后断开连接

2.2、linux系统如何收发网络包

2.2.1 osi网络模型

  • 一共有七层
  • 为了解决不同设备网络互联的兼容性问题,国际标准化组织制定了osi网络模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
  • 应用层:给应用程序提供统一接口
  • 表示层:把数据转换为兼容其他系统的格式
  • 会话层:负责建立、管理和终止表示层实体之间的通信会话
  • 传输层:负责端到端的数据传输
  • 网络层:负责数据的路由转发、分片
  • 数据链路层:负责数据的封帧和差错检验、mac寻址
  • 物理层:负责物理网络传播数据帧

2.2.2 tcp/ip网络模型

  • 应用层:向用户提供一组应用程序:http、dns、ftp
  • 传输层:负责端到端的通信,如tcp、udp
  • 网络层:负责网络包的封装、分片、路由转发,如ip
  • 网络接口层:负责网络包在物理网络中的传输、比如封帧、差错检验,通过网卡传输网络帧

2.2.3 linux网络协议栈

  • 应用程序通过系统调用,和socket层进行数据交互
  • socket层下面是传输层、网络层和网络接口层
  • 最下方是网卡和网卡驱动

2.2.4linux接收网络包的流程

  • 如果每次接收网络数据包,都通过中断来处理,则会造成cpu挤占
软中断
  • 因此linux内核引入了napi机制,通过中断和轮询的方式接受数据包。即通过中断唤醒数据接收的服务程序,然后poll轮询数据。
  • 在cpu收到硬件中断请求后,调用相应的中断函数,然后暂时屏蔽中断,开启软中断。
  • 内核中的线程从ringbuffer中获取一个数据帧,用sk_buffer表示,然后送入协议栈进行逐层处理
协议栈
  • 数据包首先进入网络接口层,检查报文的合法性,并且找出该网络包的上层协议,然后去掉帧头和帧尾,交给网络层
  • 网络层取出ip包,确定转发去向,然后查看上一层协议是tcp还是udp,送给传输层
  • 传输层取出tcp头或者udp头,根据四元组(源ip,源端口,目标ip,目标端口)作为标识,找出对应的socket,把数据放入socket的缓冲区
  • 应用层程序调用socket接口,将内核的socket缓冲区数据拷贝到应用层缓冲区,唤醒用户进程

2.2.5 linux发送网络包

  • linux中应用程序调用socket接口,所以会进入内核态中的socket发送缓存,兵拷贝应用数据为sk-buffer
  • 网络协议栈从socket缓冲区去除skbuffer,兵按照tcpip协议栈从上到下处理
  • 如果采用的是tcp传输,则会拷贝一个skbuffer,保证可靠传输。当收到对方ack之后,进行内存释放。
  • 在tcpip协议栈中,通过增加skbuffer-》data的内容来添加首部
  • 传输层添加tcp首部之后,网络层填充ip头部,进行超过mtu分片
  • 网络接口层获得mac地址,然后添加帧头帧尾,然后把skbuffer送入网卡的发送队列
  • 触发软中断,通知发送网络包。网卡驱动从发送队列读取skbuffer,挂在到ring-buffer中,然后将skbuffer映射到网卡可以访问的内存dma区域,进行真实发送
  • 网卡设备出发硬件中断,内存释放发送队列中的skbuffer和ringbuffer
  • 收到ack,释放原始skbuffer

2.3 http常见面试题

2.3.1 http概念

  • 超文本传输协议
  • http是在计算机世界中的协议,用计算机语言建立了计算机交流通信规范(两者以上),以及相关控制和错误处理方式(规范)
  • http协议是双向协议
  • 超文本包括图片、文字、视频的混合体,比如html,其中有超链接可以进行超文本跳转
    总结:http是在计算机世界里,专门在两点之间传输文字、图片、视频等超文本数据的约定和规范

2.3.2 http常见状态码

协议处理的中间状态,实际用到少

1xx信息响应类
2xx成功响应类
  • 200 ok:一切正常
  • 204 no content:一切正常,响应头没有body数据
3xx重定向响应类
  • 301:moved permanently:永久重定向,资源已经不存在,需要使用心得url访问
4xx客户端错误响应类
  • 400 bad request:客户端报文有错误,笼统错误
  • 403 forbidden:服务器禁止访问资源
  • 404 not found:请求资源,服务器中没有
5xx服务器错误响应类
  • 500 internal server error:笼统错误
  • 502 bad gateway:服务器作为代理时返回的错误,表示服务器正常,但是后端服务器错误

2.3.3 http常见字段

  • host字段:指定同一台服务器上的不同网站
  • content-length字段:指定服务器回应的数据长度,超过则算为下一次回应
  • connection字段:常见于客户端和服务器使用http长连接,指定首部字段为keep-alive
  • content-type:指定服务器回应格式
  • accept:客户端告诉服务器,自己接收数据格式
  • content-encoding:指定服务器文件压缩方式
  • accept-encoding:告诉能接受的压缩方式

2.3.4 get和post的区别

根据rfc规范:

  • get的语义是从服务器获取指定资源
  • post的语义是根据请求负荷(报文的body部分),对指定的资源做出处理
  • get请求由于是已读的,所以是安全和幂等的,可以保存为书签
  • post可以写入数据,所以是不安全和非幂等。不可以存为书签

2.3.5 http1.1的优点

  • header+body的报文格式,易于理解
  • http可以自定义和扩充,osi网络模型下层可以随意变换。
  • 具有跨平台的优越性

2.3.6 http1.1的缺点

  • 无状态:虽然无状态可以减轻服务器负担,但是在进行连续性操作时,造成了麻烦。解决办法一般由服务器注册并下发cookie,然后下一次客户端请求带上cookie
  • 明文传输:可以通过抓取内容,造成信息暴露
  • 无验证:可能访问伪装的淘宝网站
  • 无法验证报文完整性:可能被加上广告信息

2.3.7 http1.1性能

http基于tcp/ip,主要采用请求-应答的通信模式

  • 长连接:在最初的http中,需要多次建立tcp连接。而http1.1提出了长连接的方式,减少了重复建立、断开tcp造成的额外开支。只要任意一端没有明确提出断开连接,则保持tcp连接状态
  • 管道网络传输:通过建立长连接,可以解决请求的队头阻塞。但是由于发送响应必须按照请求顺序,所以还是会有响应的队头阻塞。
  • 一般的http没有使用管道网络传输。

2.3.8 http和https

2.3.8.1 区别
  • http是超文本传输协议,是明文传输。https在http网络层和tcp网络层之间加入了ssl/tls安全协议,实现加密传输
  • https除了tcp三次握手之外,还需要ssl和tls的握手过程,才可以进行加密报文传输
  • https需要向ca证书权威机构申请数字证书,需要证明服务器身份
2.3.8.2 https解决了什么问题
  • http具有窃听风险、篡改风险、冒充风险
  • https通过混合加密的方式保证信息的机密性:服务器给客户端发送公匙和数字证书,客户端通过公匙加密一组会话密匙,此后和服务器通过会话密匙进行对称加密的通信
  • https通过摘要算法解决篡改风险:通过哈希函数,求得该内容的哈希值。然后通过私匙加密,公匙解密的方式,对哈希值加密,防止身份冒充。
  • https可以通过数字证书认证机构ca的密匙,来加密自己的公匙,彻底防止冒充
2.3.8.3 https是怎么建立连接的
  • ssl/tls基本流程:客户端向服务器所有并验证公匙、客户端通过公匙和密匙协商算法rsa生产会话密匙、双方采用会话密匙进行加密通信
2.3.8.4 https一定安全可靠吗
  • 在电脑中毒,被植入了网站的根证书,骗过了浏览器的数字签名验证,是可以被监听的
  • 操作人自己接收了假基站的网站证书,则会被监听
  • 具体流程为,假服务器给客户端发送公匙和数字证书,客户端接受了证书。取出密匙,产生了随机数,通过公匙加密,发送给中间人,中间人通过私匙解密,然后双方都有随机数,通过算法生产对成会话密匙,之后就通过这个密匙进行对称加密。

2.4 tcp三次握手和四次挥手

2.4.1 tcp报文头格式

  • 序列号:在tcp建立连接时,由计算机生成的随机数作为初始值,随后通过syn包发送给接收端。每发送一次,序列号叠加一次数据字节数,解决网络包乱序问题
  • 确认应答号:由接收端发送,当发送端收到确认应答号时,默认之前的数据包都成功发送,防止丢包问题。
  • 控制位:ack为1时,确认应答字段有效。当syn为1时,希望建立连接,进行序列号初始化。rst为1时,表示tcp连接异常,需要断开。fin为1时,表示之后不会有数据发送。

2.4.2 为什么需要tcp协议

  • 网络层中的ip层是不可靠的,不保证网络包的序号和完整,所以需要传输层中的tcp可靠传输
  • tcp保证数据包是无损坏、无间隔、非冗余和按序的

2.4.3 什么是tcp

tcp是面向连接、可靠的、基于字节流的传输层通信协议

  • 面向连接:只能进行一对一的连接
  • 可靠的:无论网络链路变化,保证报文可以到达接收端
  • 基于字节流:当网络包超过mtu长度之后,会被拆分为多个tcp报文段,若接收方不知道消息边界,则无法进行有效消息传输。并且由于tcp传输是有序的,所以当前一个tcp报文没有收到,后续报文也不会给应用层,而是自动丢弃。

2.4.4 tcp连接

要完成tcp的连接,需要达成序列号、socket、窗口大小这三个共识

  • socket:由ip和端口号组成
  • 序列号:解决乱序问题
  • 窗口大小:用来做流量控制

通过tcp四元组可以唯一的确认一个连接,四元组分别为源地址、源端口、目标地址、目标端口

  • tcp最大并发数,理论上等于客户端ip数*客户端端口数。但是会受到服务端操作系统内存限制和文件描述符限制。

三、操作系统八股文

1、进程、线程、协程的区别和联系

  • 进程是资源分配和拥有的基本单元,线程是程序执行的基本单元,协程是线程内部调度的基本单元
  • 进程运行起来就是可执行文件,在进程运行期间可能会打开多个线程。
  • 进程和线程的操作者是操作系统,协程的操作者是用户

2、线程和进程的比较

  • 线程启动速度快,轻量级
  • 不同的线程共享堆、静态变量、全局变量、引用、指针,但是不共享栈。
  • 线程的销毁只需要处理pc值、状态码,通用寄存器值等,但是进程销毁需要销毁task——struct结构体

3、外中断和异常有什么区别

  • 外中断是由cpu指令以外的事件引起,例如io输入输出完成,时钟中断。
  • 异常时cpu指令引起的,例如数组越界。

4、多线程的概念

  • 用户态的多线程模型中,同一个进程可以有多个线程,例如一个聊天,一个上传文件。
  • 线程依赖
  • 同步互斥(资源共享问题)

5、多进程的概念

  • 进程时资源分配的基本单元
  • 进程结构由代码段、堆栈段、数据段组成。其中代码段时静态的二进制代码,可以共享。
  • 父进程创建子进程之后,实际上除了pid其他都一样
  • 子进程和父进程共享全部数据,但是通过写时复制的机制拷贝的,可以通过execv函数重新加载代码段,进行分离。例如shell命令,就是通过shell进程fork一个子进程,然后通过execv重新加载代码段。

6、进程控制的概念

  • 进程调度实际上,是内核选择进程控制块的过程。被选择的进程控制块,包含了一个进程的基本信息
  • 上下文切换就是切换当前的运行状态、包括通用寄存器、状态寄存器、程序计数器等
  • 完整的上下文切换流程为,用户态的一个进程,由于系统调度或实时间片,进入内核态执行内核指令,完成上下文切换后回到用户态,就切换到了进程B

7、进程调度算法

  • 先来先服务:不利于短服务
  • 短作业优先:长任务可能饿死
  • 最短剩余时间优先:是最短作业优先的抢占版本。当来了新进程的时候,和当前运行进程的剩余时间进行对比,优先运行最小的。
  • 时间片轮转:所有进程按照FCFS排序,然后每次调度时给cpu分配时间,当时间片运行完之后,把当前进程送往队列末尾,继续把cpu时间分配给队首的进程。
  • 优先级调度:给每个进程分配优先级

8、linux下进程通信方式

  • 套接字,用来做不同机器中进程的通信
  • 信号,通知某个进程时间已经发生
  • 信号量,本身是一个计数器,可以用来控制多个进程对共享资源的访问

9、虚拟技术

虚拟技术主要分要时间复用和空间复用

  • 多个进程在一个处理器上,采用了时分复用的方式,对时间切片进行轮流处理
  • 虚拟内存使用了空分复用,将物理内存抽象为地址空间,每个进程都有自己的地址空间,并且每个地址空间在使用时被写入到内存中。即不需要讲地址空间中的每一页都映射到物理内存 ,使得有限内存运行大程序成为可能。

10、进程状态的切换

*就绪状态、运行状态、阻塞状态

  • 就绪状态和运行状态可以互相转换。
  • 阻塞状态是缺少运行资源而从运行状态转化来的,资源不包括cpu时间

11、什么是内存

内存是用来存储数据的硬件、多个程序执行时,都需要将数据放入内存,所以需要给内存中的存储单元编地址。
内存地址自从0开始,每个地址对应一个字节的存储单元。

12、线程锁

  • 互斥锁
    给操作加上一层pthread_mutex_lock,如果这个锁被其他进程持有,则该线程会被阻塞,通过上下文切换,将其放入等待队列,然后cpu空出执行其他任务。
  • 条件变量
    通过设置一个Pthread_con让进程处于等待状态,然后判断条件变量。注意在修改和查询条件变量是加上互斥锁

13、回收线程

  • pthread_join,主线程调用该方法,可以等待子线程退出 并回收资源,但主线程等待期间被阻塞
  • pthread_exit ,子线程执行,结束当前进程
  • pthread_detach,都可以执行,执行后线程分离,自行完毕释放

14、零拷贝

  • 传统的文件传输系统,由cpu发起文件传输请求给磁盘控制器。磁盘控制器将数据放到磁盘缓存区,产生中断。cpu进行文件传输,将其写入用户缓存区。
  • mmap+writer,可以将数据从内核缓存区直接带入用户缓存区,然后通过write写入socket进行发送
  • sendfile系统调用函数。不进入用户态,直接将内核缓存区数据放入socket

15、socket

  • socket函数,创建网络协议巍峨ipv4,传输协议为tcp的额socket,然后调用bind绑定服务端ip和端口,通过listen进行监听。
  • 服务端通过accept获取客户端连接。客户端通过connect发起链接。
  • 然后进行tcp三次握手

数据库八股文

mysql结构

1、select执行流程

  • 先通过tcp三次握手与server建立连接
  • 然后查询mysql中的缓存,如果存有该sql命令的缓存结果,则直接返回
  • 如果没有缓存,则通过解析器,根据字段关键字生成语法树,检查语法
  • 通过预处理器查询表的存在
  • 通过优化器生成查询计划
  • 通过执行器执行对应的引擎接口

2、执行器调用存储引擎

  • 全表查询
    执行器第一次查询,会调用read_first_record指针,然后由于全表查询,调用存储引擎的全扫描结构,让存储引擎读取表中的第一条记录,返回给执行器进行条件判断,如果满足条件,则将这条数据返回客户端,然后通过while查询下一条记录

3、索引下推

  • 在联合索引中,如果没有完全覆盖字段,则会进行从联合索引中的id字段,进行回表查询。
  • 但是在5.6之后的版本中,如果判断语句中包含了联合索引中存在的字段,会先执行判断,然后再回表
  • unsing index condition

你可能感兴趣的:(java,开发语言)