Day14
1. 请你说说虚拟内存和物理内存的区别
- 以前还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址范围就是2^32,也就是4G。一方面内存分配效率低下,另一方面由于指令都是直接访问物理内存,那么任何进程都可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是不安全的
- 由于物理内存的诸多问题,就出现了虚拟内存。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存,间接扩大了内存容量,而实际上,它通常是被分割成许多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在有需要的时候进行数据交换
2. 请说说epoll原理
epoll
是 Linux 下用于高效处理大量文件描述符的 I/O 事件通知机制。它是一种 I/O 多路复用技术,用于监视多个文件描述符,当其中任何一个文件描述符就绪(例如可读、可写等),epoll
会通知应用程序进行相应的处理。
主要的 I/O 多路复用技术有 select
、poll
和 epoll
,而 epoll
是其中的一种,相对于 select
和 poll
,它在处理大量连接时有更好的性能。
以下是 epoll
的一些特性和优势:
- 效率:
epoll
的效率比传统的select
和poll
更高。select
和poll
需要将所有的文件描述符集合传递给内核,而epoll
利用事件驱动的方式,只需向内核传递活跃的事件,减少了数据的复制。 - 支持边缘触发(Edge-Triggered):
epoll
提供了边缘触发的模式,只有在状态变化时才会通知应用程序,这与水平触发(Level-Triggered)模式有所不同。这可以减少事件通知的次数,提高效率。 - 支持大量连接:
epoll
在处理大量文件描述符时的性能表现更好,因此适用于高并发的网络服务器。 - 适用于可伸缩的网络服务器:
epoll
可以轻松处理大量并发连接,适用于构建可伸缩的网络服务器。
3. 请你说说MySQL的事务隔离级别
- 读未提交:一个事务可以读取到其他事务修改了但是还没有提交的数据,所以在该隔离级别下是不加任何共享锁和排他锁的,相应它的执行速度最快,但是会导致脏读,不可重复读,幻读的情况发生。
- 串行化:当一个事务读取某个数据时,他会对整张表加共享锁,修改时,整张表加排他锁,所以它的性能最低,但是可以避免脏读,不可重复读和幻读。
- 读已提交:指一个事务只能读取其他事务修改并提交后的数据,但是数据若只是修改还未提交,那么此时读取的数据便不是当前读而是有MVCC中readview提供的数据快照,可以避免脏读,但是不可避免不可重复读和幻读
- 可重复读:指一个事务连续两次读取到的数据都是相同的,无论这两次读取的过程中是否有其他事务修改了数据。它避免了脏读,不可重复读。不能避免幻读,同时他也是mysql的默认隔离级别。
- 在MVCC中每一个事务都会有一个readview,在读已提交的隔离级别中,一个事务每次快照读取一次都会重新生成一次readview。所以它无法避免不可重复读。而可重复读的隔离级别,仅仅在事务开启时生成一次readview,后续的操作都会复用这个readview,所以每次读取同一个数据时读取的值都是一样的
4. 请你说说innodb和myisam的区别?
- InnoDB引擎:是具有事务,提交,回滚和崩溃恢复能力的事务安全型引擎,他可以实现行级锁来保证高性能的大量数据的并发操作,增删改的性能更优,支持外键;Myisam引擎:是具有默认支持全文检索,压缩功能以及较高的查询性能的非事务型引擎,不支持外键,支持表级锁
- InnoDB引擎:所需内存空间较大;Myisam引擎:所占用的内存空间较小,支持三种不同的存储格式:静态表,动态表和压缩表
- InnoDB行级锁是通过对索引项加锁实现的,只有通过索引查询数据的,InnoDB才可以使用行级锁,否则InnoDB使用表级锁
5. 请你说说MySQL索引,以及它们的好处和坏处
-
索引就像指向表行的指针,是一种允许查询操作快速确定哪些行符合where子句中的条件的数据结构
-
索引主要有普通索引、唯一索引、主键索引、外键索引、全文索引、复合索引几种
-
在大数据量的查询中,合理使用索引不仅能大幅提高匹配where条件的检索效率,还能用于排序和分组操作的加速
-
但是索引必定会增加存储资源的消耗,同时也增大了增删改的维护成本,因为每个增删改操作后相应列的索引都必须被更新