day 22(mysql隔离、redis定时机制、红黑树、select、poll、epoll多路IO复用、epoll优点、epoll实现、堆、栈、描述符、优先级队列)
- Mysql主要包含四种隔离状态,事务隔离级别:读取未提交、不可重复读、可重复读、串行化。
- 内存管理机制上:redis数据全部存在内存,定期写入磁盘,当内存不够的时候,可以选择指定的LRU算法产出数据。MongoDB数据在内存,由linux系统的mmap实现,当内存不够时,只将热点数据存入内存,其他数据存在磁盘。
支持的数据结构:redis支持的数据结构很丰富,包括hash、set、list。MongoDB数据结构比较单一,但是支持丰富的数据表达。索引,最类似关系型数据库,支持的查询语言很丰富。 - 在mysql数据库中,常用的引擎是innodb和myiasm,其中:
innodb是一个事务型的存储引擎,有行锁定和外键约束,提供了对数据库ACID事务的支持,实现了SQL标准的四种隔离(读取未提交、不可重复读、可重复读、串行化),其涉及目标就是处理大数据容量的数据库。
MyIASM引擎是mysql的默认引擎,不提供数据库事务的支持,也不支持行级锁和外键,因此当写操作时需要锁定整个表,效率较低。不过其保存了表的行数。当时用select count(*)from table时,可以直接读取保存的值,不需要全表扫描。所以当表的读操作远多于写操作,并且不需要事务支持的时候,可以优先选择myIASM。 - redis定时机制,redis服务器是一个事件驱动程序,服务器主要处理一下两类事件:文件事件(服务器对套接字操作的抽象)和时间事件(服务器对定时操作的抽象)。redia的定时机制就是借助时间事件实现的。
时间事件组成:ID:时间事件的标志号,when:记录时间事件的到达时间,timeProc:时间事件处理器。当时间事件到达时,服务器就会调用相应的处理器来处理事件。根据时间事件处理器的返回值判断是定时事件还是周期性事件。 - 红黑树在查找。插入删除的性能都是 O(logn),且性能稳定。是一种二叉查找树。
红黑树的特点:
每个节点非红即黑,根节点是黑色,一个节点是红色,则它的子节点必须是黑色,对于任意节点其到叶子点树NULL指针的每条路径都包含相同数目的黑节点,红黑树没有一条路径会比其他路径长出两倍。
select、poll、epoll都是多路IO复用的机制。多路IO复用就是通过一种机制,可以监听多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),就能够通知程序进行相应的读写操作。
三者本质上都是同步IO,都需要在读写事件就绪后自己负责读写,所以是阻塞的。
epoll的优点:一是支持一个进程打开大数目的socket描述符。二是IO效率不随描述符数目增加而线性下降,只会对活跃的socket进行操作。三是使用mmap加速内核与用户空间的消息传递,epoll是通过内核与用户空间mmap处于同一块内存实现的。
- epoll的实现
epoll机制是通过红黑树和双向链表实现的。首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头结点,然后通过epoll_wait()系统调用,想epoll对象的红黑树结构中添加、删除、修改事件,返回0成功,-1则失败。最后通过epoll_wait()判断双向链表是否为空,空则阻塞。
当文件描述符状态改变,fd上回调函数被调用,该函数将fd加入到双向链表,此时的epoll_wait()函数就被唤醒,返回就绪好的事件。 - 堆和栈的区别
堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。
堆内存需要手动申请和手动释放;栈内存是由OS自动申请和自动释放,存放着参数、局部变量等内存。
栈不会产生内存碎片。栈是操作系统提供的数据结构,分配专门的寄存器存储栈地址,压栈和入栈有专门的指令执行。
而堆是由C/C++函数库提供的,机制复杂,需要一些列分配内存、合并和释放内存等算法。
堆定义:当一颗二叉树的每个节点都大于等于它的两个子节点时,它被称为堆有序。
优先级队列可以通过最大堆和最小堆实现最大优先和最小优先,插入元素时插入到最后然后用堆排序。 - 描述符,每个进程的进程空间都有一个套接字或者文件的描述符表,存放着套接字描述符和套接字数据结构的对应关系或者标志信息与文件指针。