狂feng
Java后端
·2025-04-19
复习第十一天 什么是软中断、什么是硬中断? 软中断:软件中断,需要请求内核的服务,(网络传输、文件读取等),从用户态切换到内核态(上下文切换) 硬中断:硬件中断,网卡、硬盘、计时器等发起的中断,优先级高,却要进行上下文切换,根据中断向量,通过中断向量表,找到对应的中断处理程序进行执行。 什么是分段、什么是分页? 分段和分页都是内存管理技术 分页:页的大小是固定的,将物理内存和逻辑内存分成大小相同的页或页框,会存在内部碎片 分段:段的大小不固定,根据程序的逻辑功能进行划分(代码段、程序段、堆栈段),会出现外部碎片 段页式:先按程序的逻辑进行分段,然后再进行分页,使用(段号,页号,页内偏移量)来表示逻辑内存,通过其找到对应的物理内存。 说下你常用的 Linux 命令? cd ls mkdir cp mv tar -zxvf tar -zcvf chmod 777 ps -ef | grep java top kill ipconfg Redis 的 hash 是什么? Redis 中跳表的实现原理是什么? Redis Zset 的实现原理是什么? 底层是哈希表+跳表 可以用来实现排行版 哈希表:用于等值查询 跳表:用于范围查询 当元素个数小于128 且 元素大小小于64B的时候,使用压缩列表 JDK1.7后使用紧凑列表,否则使用哈希表+跳表 哈希表底层原理 将多个键值对存储在一个键中 适合存储对象,购物车等场景 底层实现 当元素个数小于512 且 元素大小小于64B的时候使用的是压缩列表或紧凑列表(JDK1.7之后),否则使用哈希表 哈希表的底层原理 在哈希表的结构体中,有一个table数组、数组大小、掩码(大小-1)和元素个数 其中table数组存储的是一个个的键值对 当发送冲突的时候使用链表解决 扩容和缩容 扩容:主要根据负载因子的情况判断,当元素个数达到所允许的负载的时候,则会继续扩容,扩容为原来的两倍 缩容:当元素的个数比较少的时候,会进行缩容,缩小为元素个数最近的那个2次幂 扩容时机: 当负载因子大于1,且此时在进行RDB生成或者AOF重写,则先不进行扩容,否则进行扩容 当负载银日大于5,无论是否继续持久化,都立即进行扩容 缩容: 负载因子小于0.1的时候 渐进式扩容 一点点的扩容 扩容的时候会使用多一个哈希表结构体,在这两个哈希表的上层,还有一个结构体引向它们,存储这哈希表数组[0]和[1],还有rehashidx,当进行渐进式扩容的时候rehashidx为一个非-1的值,表示扩容的进度 每次增删改查的时候,将一部分的数据移动到新的数组中去 新增加的数据直接添加到新数组中 最终完成渐进式哈希的时候,将rehashidx设置为-1,表示扩容完毕。 跳表: 有多条链表,越往上的链表存储的元素个数越少, 查找流程:从最上层的链表开始查找,如果能从当前链表中直接找到,则返回,如果找不到则确定一个区间,进入下一层继续查找,直到来到最后一层的链表,最后一层的链表是包含所有元素,找到则返回,找不到说明元素不存在。 插入流程:从最上层的链表开始查找,确定插入的区间(每一层都记录区间的左节点),进入下一层继续查找,直到来到最后一层的链表,找到插入的位置,此时通过摇塞子的形式,判断当前插入元素会横跨多少层,此时上面记录区间的左节点就有用了,可以方便在多层进行插入。 ★学习紧凑列表和压缩列表的思想 压缩列表 * 记录节点数目 * 记录占用空间大小 * 记录尾节点的距离开始节点的偏移量(辅助倒序遍历) * 列表节点(每个节点会存储上一个节点的长度信息1字节~5字节,这里是级联更新的关键) 紧凑列表(和紧凑列表类似) * 记录节点数目 * 记录占用空间大小 * ❌不需要记录尾节点的距离开始节点的偏移量(也就是不支持倒序遍历) * 列表节点(只存储自身的节点长度信息,且放在尾部) 问题:哈希表和HashMap有什么区别
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP