- 异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
- 中断则是由于系统中某事件引起的,该事件与现行指令无关。
1.什么是数据库索引?有哪些类型?索引的底层原理(B+树)
索引:索引是数据库内一种数据结构,可以帮助数据库进行快速的查找和排序工作。索引本身也是文件,存储在磁盘上
索引的优点:降低数据库的IO成本和CPU成本
索引的缺点:占用存储空间,降低数据库更新的速度,大量数据建索引难
索引的分类:
1)按功能划分
主键索引:建立在主键上的索引,唯一标识一条记录,只能有一个
唯一索引:索引列的值必须是唯一的,但是可以为空,可以有多个
普通索引:一个索引只包含单个列,但是可以有多个索引
复合索引:一个索引包含多个列(最左匹配原则)
全文索引:快速定位特定数据,只能用于MyISAM类型的数据表,只能用于CHAR ,VARCHAR,TEXT数据列类型
前缀索引:只索引开始的部分字符
2)按照物理实现方式分
聚簇索引:索引文件本身就是数据文件,B+树的data域存储的就是数据,这也是数据表的主索引,key是数据表的主键(InnoDB采用这种形式)其中表的数据按照索引的顺序来存储,插入的时候需要找到对应的数据页,挪动数据腾出空间,如果页满则需要拆分数据页。删除的时候
非聚簇索引:B+树的叶子结点的数据域存储的数据的地址,根据地址读取相应的数据
索引的数据结构:
一般用B/B+树,每个页只保存一个节点。B树的节点中保存键值和数据信息,而B+树的节点中只保存键值,数据全部保存在叶子节点中,同时叶子结点增加指向前后节点的指针,构成双向链表。
为什么B+树要优于B树:
1)B+树的节点可以包含更多的键值,使树的深度减少,因此IO次数减少,可以节约IO的时间
2)B+树的查询更加稳定,每次查询都需要访问到叶子结点,而B树的非叶子节点中也有数据,
3)由于B+树的数据全在叶子结点,并且构成了双向队列,范围查询更快,B树范围查询要做局部的中序遍历,还要跨层
是不是可以无限增加树的路数?
不可以,这样会形成一个有序数组,如果太大了不能一次加载到内存中,反而会变慢
为什么不用哈希表?
1)哈希表只支持等值查询,不支持区间查找
2)哈希索引不支持模糊查询
3)哈希索引不支持组合查询
4)哈希需要解决哈希冲突,扩容的问题,当有大量重复数据时不适用
哈希索引仅适用于等值匹配,重复率低,对查找速度要求高的情况
2.什么是软连接和硬连接
硬链接:本质上是一条文件名和节点关联的记录,使用硬连接和使用源文件没有任何区别,源文件被删除的话指向节点的计数减1,此时硬连接还能用,计数为0的时候才完全删除。与源文件的inode号相同,更新一个文件所有的都会被同步更新。
软连接:重新建立了一个独立文件,指向源文件,源文件被删除之后,软连接就失效了,源文件的大小不影响软连接的大小。可以应用于目录,可以跨文件系统,有自己的inode号
3.设计模式,单例模式(懒汉、饿汉),工厂模式
https://www.runoob.com/design-pattern/design-pattern-tutorial.html
4.什么是用户态和内核态?有什么作用?
1)用户态和内核态是两种CPU的运行状态,一般应用程序工作在用户态,操作系统的程序运行在内核态
2)处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的;处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。
3)用户态切换到内核态只能通过中断、异常、系统调用、访管指令;内核态切换到用户态通过设置程序状态字寄存器PSW就可以实现
5.说一下SYNFlood?怎么解决?
概念:客户端通过不响应服务器的SYN-ACK报文,或者干脆直接伪造Source IP导致SYN-ACK报文石沉大海,使服务器上所有资源都被半开连接占据,无法再接受正常的连接请求。其实服务器对每个半连接有个定时器,如果超时就重新发一次,重试超过一定次数就放弃,但是没用,如果短时间内超大量的无效请求,服务器全在处理这些工作
1)提高TCP端口连接容量,同时减少半开连接资源占用的时间,降低SYN-ACK重发的次数(治标不治本,可缓解不能解决)反而也会降低网络环境不好的正常用户的连接成功率
2)部署支持IP防伪的路由器,过滤掉伪造的SYN消息,或者提高网民的防范意识,别让自己变成肉鸡(过于理想,对于高端攻击者无效)
3)无效连接监视释放,不停的监视半开连接和不活跃连接,达到一定阈值的时候释放这些连接(正常连接也会淹没其中)
4)SYN Cache技术,构造一个全局的Hash表来存储当前所有半开连接,连接成功则清除,其中的Key值很关键,既要包含SYN中的IP和Port等信息,又不能轻易被攻击者猜到,一般会通过一个加密函数生成。对所有的半连接并不急于分配TCB,在返回的SYN-ACK报文中发送一个Sequence Number,接收到正确的ACK报文后才建立起真正的连接
5)SYN Cookie技术,收到SYN报文后不分配资源,也不保存状态,使用一种特殊算法生成一个Sequence Number,考虑到了连接的四元组以及一些对方无法知道的己方信息(比如时间),收到对方返回的ACK报文后,重新计算一遍,看是否是正确的请求连接的报文,如果是才分配TCB建立连接(但是这样会导致ACK丢失情况下,服务器不会重传SYN-ACK报文,客户端以为建立了连接而服务器实际上没有建立连接)
