4、HashMap机制
5、HashMap扩容过程以及安全问题
6、TCP拥塞机制
https://www.cnblogs.com/ppzhang/p/10506237.html
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制的方法:
1.慢开始
2.拥塞避免
3.快重传
4.快恢复
7、如果没有拥塞机制会怎样
8、TCP流量控制
https://www.cnblogs.com/ppzhang/p/10506237.html
所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。
什么方式进行流量控制?
利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。
9、TCP怎么保证安全机制
校验和 确认应答+序列号 超时重传 流量控制 拥塞控制
1. 停止等待协议 :每发送完一个分组,就停止发送,等待对方确认,收到确认后再发送下一个分组。
2. 连续ARQ协议
利用滑动窗口,位于滑动窗口内的所有分组都可以连续的发送出去,而不需要逐个等待对方的确认。A每收到一个确认,就把发送窗口向前滑动一个分组的位置。B采用累积确认的方式,对按序到达的最后一个分组发送确认(就是最后这个分组的编号),就表示这个分组之前的所有分组都收到了。
(1)优点:信道利用率高,容易实现,即使确认丢失,也不必重传。
(2) 缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
10、TCP头部字段
https://blog.csdn.net/weixin_44198965/article/details/90083126
16位源端口号、16位目的端口号、32位序号、32位确认序号、4位首部长度、保留(6位)、6位标志域、16位窗口、16位校验和、16位紧急指针、32位选择和填充
11、TCP什么时候发送复位包
1、请求超时 2、 请求的链接地址不存在
12、如果客户端请求服务端请求不通怎么做
13、TCP心跳包机制
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
心跳检测步骤:
1.客户端每隔一个时间间隔发生一个探测包给服务器
2.客户端发包时启动一个超时定时器
3.服务器端接收到检测包,应该回应一个包
4.如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5.如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了
心跳包的发送,通常有两种技术:
1、应用层自己实现的心跳包
2、TCP的KeepAlive保活机制
14、操作系统虚拟内存
虚拟内存使得应用程序认为它拥有连续的可用内存,这样一来,就在逻辑层面上扩大了内存容量。但是实际上,只是把比较常用的内存片段取出来了而已,还有部分资源是放在磁盘存储器上的。需要的时候再进行数据交换。
调度方式有,分页式,段式,段页式。比较流行方式是段页式,他结合了前两者的优点,以页为单位替换,以段为单位使用。
常见的替换替换算法有4种,随机算法,先进先出算法,LRU算法,最优算法。 比较常使用的是LRU算法,他在redis里也有使用,当redis的内存满了的时候就是使用LRU算法替换掉旧内存。
15、虚拟地址和物理地址转换
https://blog.csdn.net/qq_39755395/article/details/78380942
分页内存管理
将虚拟内存空间和物理内存空间皆划分成大小相同的页面,例如4KB、8KB和16KB等。并将页作为内存空间的最小分配单位,一个程序的一个页面(虚拟页面)可以存放在任何一个物理页面中。
一个程序发出的虚拟地址由虚拟页面号和页内偏移值两部分组成
16、进程和线程区别
- 进程是资源分配最小单位,线程是程序执行的最小单位;
- 进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;
- CPU切换一个线程比切换进程花费小;
- 创建一个线程比进程开销小;
- 线程占用的资源要⽐进程少很多。
协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。从技术的角度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
协程与线程的区别:
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
2) 线程进程都是同步机制,而协程则是异步。
3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。
6)线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。
17、为什么需要进程,他存在的意义
从理论角度看,是对正在运行的程序过程的抽象;从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
18、进程切换怎么实现的
进程调度由操作系统内核进行,目的是合理分配系统资源,令每个进程都能获得执行时间。进程调度由schedule函数负责,该函数是操作系统内核函数,并非系统调用,只能在内核态中由内核代码主动调用。
19、数据库索引结构
20、辅助索引和覆盖索引、聚族索引
21、数据库锁机制(乐观锁和悲观锁、表锁和行锁)
22、意向锁
https://blog.csdn.net/arkblue/article/details/53895150
23、什么情况会造成数据库的死锁
1、一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。
24、那种语句会造成数据库死锁
25、主从复制
26、红黑树的实现
https://blog.csdn.net/tanrui519521/article/details/80980135
27、一范式、二范式和三范式
- 第一范式: (1NF) 实体表中的数据(字段)不可再分; 对数据项(字段)的要求是具备独立性,不可再分;
- 第二范式:(2NF) 1、每张表必须要有主属性(主键)唯一,该表上的其他字段都可以由该字段来推导其相关内容;2、其它属性数据项(非主键)要完全依赖于主属性(主键);
- 第三范式:(3NF)所有的非主属性(非主键)都直接由其它表的主属性(主键)推导生成,而不需要传递依赖。
28、所有排序的思路
https://www.cnblogs.com/onepixel/articles/7674659.html
冒泡排序:它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成;
时间复杂度:O(n2)
选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
时间复杂度:O(n2)
快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有.
时间复杂度:O(nlogn)
归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
时间复杂度:O(nlogn)
堆排序: 是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
时间复杂度:O(nlogn)
桶排序: 是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
时间复杂度:O(n+k)
29、为什么堆排序比快排慢
https://blog.csdn.net/every__day/article/details/86580883
第一、堆排序访问数据的方式没有快速排序友好。
对于快速排序来说,数据是顺序访问的。而对于堆排序来说,数据是跳着访问的
第二、对于同样的数据,在排序过程中,堆排序算法的数据交换次数要多于快速排序。
30、哪种排序比快排快
桶排序
31、上电过程,程序如何跑起来的