0%

以自己能快速理解的方式重新梳理了innodb引擎的物理文件结构,从静态和动态的两种视角去
理解文件结构,增强对innodb引擎的运行的了解。

  • 静态视角,首先从文件读取的角度考虑整个文件的组织形式和存储结构,以便于能够顺利的解析innodb的ibd文件
  • 动态视角,数据库文件是为数据库管理系统和数据库实例运行而服务的,在了解B+树原理的01基础上,深刻理解数据在数据库中增加以后,是如何在数据库中存储,以及数据是如何落地的,既要保证数据存储的灵活性,又要保证数据库查询的性能。
阅读全文 »

笔记重点:

  • Mac os x下编译mysql,主要是处理要wolfssl依赖库,下载wolfssl库以后需要打上与mysql相关的补丁,然后执行do.sh,拷贝CMakeFiles.txt到wolfssl库的根目录,这样mysql编译时会连同wolfssl库一起编译;
  • Mysql编译完成后,mysql的启动工作,主要涉及到配置文件的配置以及相关目录文件的权限问题,所以mysql可以安装在/usr/local/mysql中,而数据文件以及日志之类的文件,放在用户的home目录下
  • 遇到非8.0.16版本编译或者其他版本编译时出现的错误,尽量通过log_error文件提示信息来排错
阅读全文 »

笔记重点:

  • 定时事件的处理依赖两个结构,一个是小根堆,一个是common_timeout的结构。
  • 小根堆根据超时时间进行排序,最近超时的为小根堆的根节点。
  • common_timeout_list结构是为了处理超时时间相同的一系列事件的集合,以防止小根堆随超时事件的增多而过多增加的情况,对common-timeout的理解是依据《管理超时event》这篇博客进行分析的。
阅读全文 »

笔记重点:
本来进程退出没有什么好谈的,但是进程退出都做了什么,可能会很模糊,比如进程退出会引发重新调度,比如资源的销毁对应进程创建的重新分配,进程的退出依赖于系统对信号的处理,所以应该先熟悉系统如何处理信号。

  • 信号处理是在什么时候进行的
  • 进程退出时要销毁哪些具体的资源
阅读全文 »

笔记重点:
进程调度一直是linux系统开发中相当重要的部分,但在最初版本中的调度如此简单,以至于你并不相信,但是在不断的发展过程中,首先在2.6内核版本中发展了抢占式的调度算法,在经历几次重大版本的迭代后在开发出CFS(完全公平的调度算法),不过调度算法的重点是,如何选择需要运行的进程以及保证性能。进程的运行很多时候会被外部的资源分配不及时而阻塞,这个时候进程睡眠等待,以及这个时候的合理调度,对于CPU资源的充分利用,显得尤为重要,那调度就从进程的睡眠机制开始了解。
问题:

  • 任务调度在何时发生
  • 任务调度的基本策略是什么
  • 任务切换时怎么做到的
阅读全文 »

笔记重点:
尽管时代在变化,中断系统的基本原理却是变化不大,对新版linux的中断系统的分析和理解起到指引作用,中断系统的细节包括,中断发生前的上下文保存以及中断处理完成后的上下文恢复;中断的统一调用过程中CPU的异常处理是,当CPU响应异常或者中断时,处理器使用异常或者中断的向量作为IDT表的索引,引用索引中的门描述符指向的中断程序,进行处理。硬件对中断的支持表现在CPU中有专门的中断向量表寄存器IDTR,并使用专门的指令在设置和读取这个寄存器的内容(LIDT和SIDT),以及8259A这样的中断控制器处理外部中断的优先级;中断系统的中断来源三个方面,分析linux中的中断系统的原理是从以下三个方面的透彻理解入手的:

  • 一个方面是来自CPU执行流中的内部中断和异常
  • 一方面有外部设备通过8259A中断控制器向CPU的INTR脚请求中断
  • 还有一个方面被称为软中断的系统调用
阅读全文 »

笔记重点:
重新分析进程的创建,发现最初的笔记还是比较简单,说起进程创建,不得不先了解进程0的创建。

  • 进程0之后创建的所有进程都是以这个进程为模板进行创建,进程0的创建过程是在系统启动的main.c中进行的,在系统初始化之前,手动设置这个进程0,更重要的是这个进程是在内核状态下切换到用户态运行的,所以之后的进程也都在用户态下运行;
  • 其次需要理解进程的控制信息(PCB)和进程本身运行的内存空间的分配情况,这点在代码中要了解透彻,进程内核态的堆栈和用户态的堆栈的的分配是分开,同时需要了解他们的分布情况,这对了解用户态下进程如何调用系统调用的理解至关重要;同时一个进程的虚拟内存分布和实际的物理内存分配是分开的,理解这一点对理解linux的内存分配方式以及缺页中断的理解,写时复制机制的理解都很重要;
  • 最后在谈到进程的调度,在此版本的调度中可以说非常简单,但是在进程调度却是linux系统一个非常大且重要的主题。
阅读全文 »

笔记重点:
linux 0.12的启动代码能够给我们分析最新的linux代码给予一定的启示,启动代码虽然只有三个文件,但是对读者分析能力的要求比较高,主要是在对汇编语言以及x86编程体系的理解,以下是对linux 0.12启动代码的简要说明,对分析很重要

  • bootsect.S文件主要的目的是加载setup.S和内核模块
  • setup.S 主要目的是通过biso中断读取机器的系统数据
  • head.s 主要目的是内核初始化之前的环境配置,也就是32位保护模式运行做准备
阅读全文 »