数据库内核讲解-(二)一起来搭一个数据库系统的架构吧!

 要建一栋大楼,首先肯定是需要一张详细,漂亮的设计图,一个系统的建立同样也需要一个蓝图,如果蒙头直接干,想到啥做啥,那这个系统到后面就会崩溃,其实这也是架构师存在的意义之一。

 有一天,在搬砖的时候,突然,你对自己说:“不行,我不能整天做增删改查,我是要成为程序媛的男人,就让我自己做一个数据库让别人增删改查吧!”

 说做就做,你跑到某宝上买了一大块硬盘,接上电脑,放在了自己的房间里,:“这就是我实现数据库的仓库了!”

 然后,你想着要做一个数据库,自己肯定要先画一个数据库的蓝图(架构图)吧!
我们先有点仪式感,给我们要绘画的架构蓝图文件起个名字,就叫dggz(大哥关注)吧!

 那有了自己的硬盘,然后第一步,在dggz上画一个数据仓库。
在这里插入图片描述
 有了数据仓库,接下来你就考虑一个问题,数据仓库需要一个磁盘管理器来存取文件吧,于是乎你就萌生了三个解决方案,

 1.使用目前操作系统提供的文件系统来作为自己数据仓库的磁盘管理器。
 2.自己写一个磁盘管理器?
 3.在现有的文件系统上加以改造,使这个磁盘管理器适合自己的数据仓库。

 数据库经常要做的是拿里面得数据元组出来做事,很明显现有得文件系统以文件为单位并不显得那么合适,那是否可以考虑自己写一个磁盘管理器?很明显,如果能自己写一个磁盘管理器是最适合咱们数据仓库的方案了,但是成本过高,时间成本和人力成本都太高,那只有第三种折中的方案了,在现有的文件系统上加以改造,使它适应我们自己的数据仓库了。

 说干就干,咱要使现有的文件系统适应咱自己的仓库,那咱自己的仓库就要有一些问题需要解决。

 1.数据项怎么表示呢,就是 姓名,年龄这些数据在仓库里用varchar和interger 都用bytes表示,但怎么表示这个问题需要我们自己考虑。
  2.记录怎么表示,就是数据项的集合,比如说 姓名年龄是user表的模式,那么一条记录就是 (小明,18),这条记录在文件中要怎么表示。
  3.每次把数据读入内存,不大可能一次一条的读,那每次肯定读入一个块为单位会更合适,那么记录在块中怎么组织比较合适呢?
  4.记录怎么修改呢?比如说修改后记录超出块的范围等等问题?
  5.块要怎么在文件中表示呢?

 终于,历经千辛万苦,咱们解决了以上的问题,对现有的 文件系统完成了改造。可以在dggz上加上存储管理器了。
在这里插入图片描述
 接下来,咱要考虑一下读取的效率问题了,数据的读取如果每次都是直接从磁盘读出来,那么咱这个数据库的效率肯定不会特别的高,所以咱在内存中肯定要设定一个缓冲区,用来交换数据,保存一些数据,让交换到磁盘里的次数减少,于是咱可以在dggz上上一块缓冲区。
在这里插入图片描述
 有了这块缓冲区,肯定需要涉及到缓冲区的管理,考虑以下问题,
 1.缓冲区的结构怎么设计?
 2.缓冲区的置换算法怎么设计?
 3.缓冲区的怎么管理,就是怎么从磁盘把数据置换到缓冲区?

解决完以上问题,咱们就可以在dggz上画一个缓冲区管理器了。
在这里插入图片描述
 下一步呢?我们要从磁盘里读数据,但每次读数据总不能都全表扫描把,肯定需要一个索引,和文件的管理器吧,用来记录和管理索引。利用索引,文件,记录等信息,穿过缓冲区读取仓库里的文件。
在这里插入图片描述
 有了对咱数据库操作的整套工具后,就要考虑对外的开放了,需要有SQL语句,那定义好咱们的SQL语句,就需要有一个查询的编译器。
在这里插入图片描述
 此时,解析完这些语句,肯定需要一个执行这些语句的工具,执行引擎就出现了。
在这里插入图片描述
 就这样,咱的一个简单的数据库就完成了,但是这样的数据库在软件设计上有诸多的不完善,无法商用,比如说如果数据出现丢失,咱们数据库有什么办法恢复吗?这个时候就需要一个日志和恢复的管理器吧。
在这里插入图片描述
 有了日志,咱得考虑下一个事情,如果咱对数据库的操作,比如说银行转账,A往B的账户赚钱,A转了100万到B的账户,这个时候银行系统崩溃了,然后恢复,这个时候B的账户还没有转进100万,于是乎发生了官司,怎么办,咱们肯定不会允许这个事情发生,所以咱就考虑把A账户减100万和B账户加100万绑定成一组操作,要么都做,要么都不做,我们称这个东西叫事务,这样才能保证我们数据库的正确性和安全性,于是乎,咱就往数据库里添加了一个事务管理器。当然,事务需要记录在日志中才安全。
在这里插入图片描述
 这个时候数据库的安全性和正确性得到了满足,但是数据库是同时很多人在用的,现在咱们完成的只是单人的使用,如果多个人一起使用,还是会发生比如两个同时访问一个数据,一个读一个写,就会有不正确的事发生,所以要加上并发控制,当然,并发控制目前主流的还是用锁,所以我们需要一个锁表。
在这里插入图片描述
 嗯嗯,做系统的都知道,需要管理员,那就来一个数据库管理员吧。

在这里插入图片描述
 然后一个完整的数据库系统就新鲜出炉啦!
 你满意的看了看自己的砖,搬得更加卖力了。

 挖了这么多的坑,下一章终于要开始填坑了!下一章先讲讲存储器吧!
 最后,还是那句话,大哥姐姐们,码字不易,来点赞吧,有打赏我也不介意嘿嘿。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
本文将简单讲解Linux内核中的ext4文件系统源码。 ext4是Linux中常用的文件系统之一,它的源码位于fs/ext4目录下。在这个目录中,我们可以看到很多文件和子目录,其中比较重要的有: 1. balloc.c:块分配器。 2. dir.c:目录处理程序。 3. file.c:文件处理程序。 4. inode.c:inode处理程序。 5. super.c:超级块处理程序。 这些文件和子目录中的代码实现了ext4文件系统的各个方面,下面我们简单介绍一下每个文件的作用。 balloc.c balloc.c文件实现了ext4文件系统的块分配器,主要负责分配和释放数据块。它包括多个函数,其中比较重要的有: - ext4_new_blocks:分配一个或多个数据块。 - ext4_free_blocks:释放一个或多个数据块。 dir.c dir.c文件实现了ext4文件系统的目录处理程序,主要负责处理目录项的添加、查找和删除等操作。它包括多个函数,其中比较重要的有: - ext4_add_entry:添加一个目录项。 - ext4_delete_entry:删除一个目录项。 - ext4_find_entry:查找一个目录项。 file.c file.c文件实现了ext4文件系统的文件处理程序,主要负责文件的读写操作。它包括多个函数,其中比较重要的有: - ext4_file_read:读取一个文件。 - ext4_file_write:写入一个文件。 inode.c inode.c文件实现了ext4文件系统的inode处理程序,主要负责inode的创建、删除和修改等操作。它包括多个函数,其中比较重要的有: - ext4_new_inode:创建一个inode。 - ext4_delete_inode:删除一个inode。 - ext4_set_inode_flags:修改一个inode的标志位。 super.c super.c文件实现了ext4文件系统的超级块处理程序,主要负责文件系统的初始化和挂载等操作。它包括多个函数,其中比较重要的有: - ext4_fill_super:初始化一个文件系统。 - ext4_mount:挂载一个文件系统。 除了以上这些文件之外,ext4文件系统还包括了很多其他的源码文件,比如block_validity.c、ext4_jbd2.c、ext4_xattr.c等等,它们实现了文件系统的不同功能。如果想深入了解ext4文件系统的源码,可以阅读这些文件的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值