PostgreSQL VFD——虚拟文件描述符

news/2024/7/9 20:29:19 标签: 数据结构, postgresql, linux, c语言, 数据库

在操作系统中,每当一个进程打开一个文件,系统就会为该文件分配一个唯一的文件描述符,在Linux系统中是一个int类型的值。每个操作系统都会对一个进程能打开的文件数加以限制,用ulimit -n命令可以查看进程能打开的最大文件数。对于一个数据库系统,系统元数据和用户数据都可能保存在许多不同文件当中,而且常常会对大表进行排序、hash join等操作,需要经常打开大量文件,如果超过了操作系统的限制,就会出错或阻塞。为了解决这个问题,PostgreSQL使用了虚拟文件描述符(VFD)机制。

VFD的原理类似于进程池、内存池等池化技术,当进程申请打开一个文件时,总能分配一个虚拟的文件描述符,是真实文件描述符的一个上层封装。上层系统对文件进行操作时,只需要使用VFD即可,由VFD管理器转化为对实际文件描述符的操作。VFD使用LRU(最近最少使用)池来管理所有已经打开文件,当进程打开的文件个超过操作系统限制时,也可以申请一个新的VFD,从LRU链表中替换最长时间未使用的VFD并关闭相应的实际文件描述符。VFD也会管理一个空闲VFD链表,方便获取当前空闲的VFD。

typedef struct vfd
{
	int			fd;				// 当前文件描述符
	unsigned short fdstate;		// 当前VFD的状态
	ResourceOwner resowner;		// 拥有者
	File		nextFree;		// 在空闲链表中表示下一个空闲的VFD
	File		lruMoreRecently;	// LRU链表中更近被使用的
	File		lruLessRecently;	// LRU链表中更远被使用的
	off_t		fileSize;		// 当前文件大小
	char	   *fileName;		// 当前文件名
	int			fileFlags;		// 打开文件时open()函数的flags
	mode_t		fileMode;		// 打开文件的模式
} Vfd;

static Vfd *VfdCache; 			 // VFD数组的指针
static Size SizeVfdCache = 0;	 // VFD数组的大小

static int	nfile = 0;			// 正在使用的VFD数量

http://www.niftyadmin.cn/n/1842718.html

相关文章

Linux bash学习总结

文章目录Bash shellBash shell 的功能命令记录能力 (history)命令与档案补全功能:([tab] 按键的好处)命令删名设定功能(alias)工作控制、前景背景控制(job control, foreground, background)程序化脚本(shell scripts)通配符(Wildcard)Bash shell的内建命令&#xf…

openGauss源码解析——列存压缩算法

在openGauss数据库中,相对于行存以页为单元进行压缩,列存以CU为单元具有天然的压缩优势。 在openGauss中有三种压缩级别:LOW, MIDDLE, HIGH。指定的压缩等级越高,则数据的压缩率越高。除此之外还可以选择不开启压缩。 typedef e…

openGauss列存数据压缩实验

对于时序场景,float和timestamp类型占比较大,需要重点关注,较高的压缩率可以降低磁盘空间的使用。 openGauss中,对于float使用Delta2算法,对于float使用XOR算法,推测参考了facebook关于时序数据库的论文&a…

解决:ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

目录问题解决问题 在oracle数据库中执行insert操作时,遇到下面的错误信息: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 00054. 00000 - “resource busy and acquire with NOWAIT specified or timeout expired”…

PostgreSQL插入大量数据:pg_testgen插件

PostgreSQL test generator 在进行数据库开发、测试时,新建表之后,时常想自己插入数据,但十分麻烦。 pg_testgen插件可以产生大量随机数据,方便进行数据库开发测试。 插件地址:pg_testgen 安装方法: c…

Windows查看和导入证书(.cer / .pfx)

文章目录证书介绍问题汇总导入导出细节注意如何查看以上两种证书的到期日?Windows下导入证书证书介绍 作为文件形式存在的证书一般有以下几种格式: 带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含…

PostgreSQL 空闲空间映射表(FSM)

随着数据表中不断插入和删除元组,页内必然会产生空闲空间。当我们需要插入新的元组时,需要优先将元组放到已有页内的空闲空间内,以节约存储空间。如果每次都用新的页来存放新元祖,显然会造成空间利用率的浪费。但我们怎么知道哪个…

PostgreSQL可见性映射表(VM)和VACUUM操作

PostgreSQL为了实现多版本并发控制(MVCC),当事务删除或者更新元组时,并非从物理上删除,而是将其标记无效,最终再通过VACUUM命令清理这些无效元组,真正的物理删除发生在清理过程。清理无效元组时…