Zhewen Cao

MySQL MVCC

MySQL MVCC

MySQL MVCC 内容 MVCC(Multi-Version Concurrency Control),即多版本并发控制,是MySQL中InnoDB存储引擎实现的一种并发控制机制。它通过为每个事务维护一个数据快照(ReadView)来实现,允许读写操作并发执行,同时保持数据的一致性和隔离性。MVCC主要依赖于隐藏字段、Undo日志和ReadView来实现。 隐藏字段 在InnoDB中,每条记录除了我们看到的业务字段外,还包含了一些隐藏字段,如: * DB_TRX_ID:6字节的事务ID,表示最后修改这条记录的事务ID。 * DB_ROLL_PTR:7字节的回滚指针,指向这条记录的上一个版本,保存在Undo日志中。 * DB_ROW_ID(如果表没有主键):6字节的隐藏主键,用于唯一标识记录。 Undo日志 Undo日志是InnoDB中用于实现MVCC的重要组件之一。它记录了数据被修改前的版本,以便在需要时能够回滚到某个特定的历史版本。Undo日志分为两种: * Insert Undo日志:在插入操作中生成,由于插入的记录对其他事务不可见,故在

By Zhewen Cao
IO多路复用与同步阻塞IO

IO多路复用与同步阻塞IO

同步阻塞IO(Blocking IO) * 定义:同步阻塞IO是最传统的IO模型。在这种模型中,用户线程在内核进行IO操作时被阻塞。例如,当用户线程通过系统调用read发起IO读操作时,用户线程会由用户空间转到内核空间,等待内核完成数据的读取,并将数据拷贝到用户空间后,read操作才返回,用户线程继续执行。 * 特点: * 阻塞性:IO操作未完成时,用户线程会被阻塞,无法进行其他操作。 * 同步性:用户线程需要等待IO操作完成后才能继续执行。 * 应用场景:在单线程环境下,由于阻塞地获取结果,只能处理一个客户端连接。而在多线程环境下,需要不断地新建线程来接收客户端,这样会浪费大量的系统资源。 IO多路复用(IO Multiplexing) * 定义:IO多路复用是一种网络通信的方式,可以同时检测多个文件描述符(socket),一旦检测到某个文件描述符就绪(一般是读就绪或者写就绪),就解除阻塞,然后基于这些已经就绪的文件描述符进行网络通信。通过这种方式,服务端即使是在单线程/进程的情况下也能实现并发,支持多个连接。 * 特点: * 非阻塞或少量阻塞:通

By Zhewen Cao
为什么使用epoll

为什么使用epoll

epoll之所以在Linux网络编程中被广泛使用,主要是因为它解决了传统IO多路复用技术(如select和poll)在处理大量文件描述符时遇到的一些关键问题。以下是使用epoll的几个主要原因: * 性能瓶颈: 文件描述符数量限制:select和poll在处理大量文件描述符时存在性能瓶颈,因为它们通常使用固定大小的数组来存储文件描述符,这限制了它们可以监视的文件描述符的数量。虽然poll相比select在这方面有所改进(poll没有文件描述符数量限制的理论上限,但实际操作中仍受限于系统内存),但epoll通过动态的数据结构(如红黑树)来管理文件描述符,真正实现了无限制地监视文件描述符。 * 效率问题: select和poll在检查文件描述符时,需要遍历整个数组(或链表),这种方式在文件描述符数量较多但仅有少量活跃时效率低下。epoll通过只检查就绪队列(其中包含已经就绪的文件描述符)来避免这种低效的遍历,从而大大提高了效率。 * 边缘触发(Edge Triggered, ET)和水平触发(Level Triggered, LT):

By Zhewen Cao
Linux epoll 的实现原理

Linux epoll 的实现原理

epoll是Linux内核中用于实现高效I/O多路复用的机制,它在Linux 2.6版本中引入,相比于早期的select和poll,epoll提供了更高的性能和更强大的功能。下面是epoll的实现原理概述: 1. 数据结构 epoll的核心数据结构是epoll_file_table,早期实现是一个链表,后优化为就绪队列&红黑树,用于保存所有被epoll实例跟踪的文件描述符的引用。每个文件描述符引用一个epoll_file结构,该结构包含指向实际文件描述符的指针,以及一个epoll_event数组,用于存储对该文件描述符感兴趣的事件。 2. epoll_ctl操作 epoll_ctl系统调用用于添加、修改或删除对文件描述符的跟踪。当使用EPOLL_CTL_ADD或EPOLL_CTL_MOD向epoll实例添加或修改文件描述符时,内核会将文件描述符和其感兴趣的事件类型(如EPOLLIN、EPOLLOUT等)添加到epoll_file_table中。 3.

By Zhewen Cao
Linux Socket IO多路复用

Linux Socket IO多路复用

引言 在网络服务器开发中,处理大量并发连接的能力是衡量服务器性能的关键指标之一。传统的基于线程或进程的模型在处理大量并发连接时会遇到严重的资源瓶颈和调度延迟。为了解决这个问题,Linux 提供了 I/O 多路复用技术,它允许一个进程同时监听多个 socket,从而显著提高服务器的并发能力和响应速度。本文将深入探讨 Linux Socket IO 多路复用技术的核心概念、工作原理及其实现方式。 理解 I/O 多路复用 I/O 多路复用(I/O Multiplexing)是一种让单个进程能够同时处理多个 I/O 操作的技术。在传统的阻塞 I/O 模型中,如果一个进程在一个 socket 上等待读写事件,那么它将无法处理其他 socket 上的事件,直到当前事件完成。而在 I/O 多路复用模型中,一个进程可以同时监控多个 socket,

By Zhewen Cao