PostgreSQL 中的虚拟文件描述符

news2024/11/19 5:57:47

由于每个操作系统限制了一个进程能打开的文件数(例如:ubuntu 为1024),因此进程能获得的文件描述符是有限的。对于经常需要打开许多文件的数据库进程来说,很容易会超过操作系统对于文件描述符数量的限制。

为解决这个问题,PostgreSQL 中使用了虚拟文件描述符 (VFD) 机制,通过 VFD 管理真实的文件描述符,帮助进程摆脱操作系统的限制。typedef struct vfd

typedef struct vfd
{
  int          fd;
  unsigned short fdstate;  
  ResourceOwner  resowner;
  File        nextFree;  
  File        lruMoreRecently;
  File        lruLessRecently;
  off_t        fileSize;
  char         *fileName;
  int          fileFlags;
  mode_t        fileMode;
} Vfd;

VDF 中各字段含义:

  1. fd 记录该 VFD 所对应的真实文件描述符,如果当前 VFD 没有打开文件,则其值为 VFD_CLOSED (-1)。

  2. fdstate 标记位:如 FD_DELETE_AT_CLOSE,表明该文件在关闭时要被删除。

  3. nextFree:指向下一个空闲的 VFD,其数据类型 File 表示其在 VFD 数组中的下标。

  4. lruMoreRecently:指向比该 VFD 最近更常用的虚拟文件描述符。

  5. lnuLessRecently:指向比该 VFD 最近更不常用的虚拟文件描述符。

  6. fileSize:当前文件大小。

  7. fleName:该 VFD 对应文件的文件名,如果是空闲的 VFD 则 fileName 为空。

  8. fileFlags:该文件打开时的标志,包括只读、只写、读写等。

  9. fileMode:文件创建时所指定的模式。

VFD 数组 VfdCache 作为 LRU 池管理文件描述符,并根据需要打开和关闭实际的 OS 文件描述符。LRU 池使用数组实现,数组元素是 VFD 结构体,数组大小会根据需要增长(最大1024)。

static Vfd *VfdCache;
static Size SizeVfdCache = 0;

​​​

当 LRU 池未满时,进程可以申请一个 VFD 用来打开物理文件;而当 LRU 池已满时,进程需要首先关闭一个 VFD。在 LRU 中,使用替换最长时间未使用 VFD 策略。

进程在 VfdCache 上保持了两个链表,一个是 LRU 池(双向链表),另一个是 FreeList (空闲链表,记录了所有可被分配的 VFD)。前者通过 lruMoreRecently 属性和 lruLessRecently 属性来链接,后者则通过 nextFree 属性来链接。

VfdCache [0] 不是可用的 VFD,它仅用来标识 FreeList 和 LRU 池的链表头部。对 LRU 池里的 VFD 的操作主要包括以下三种:

(1) 将 VFD 插入 LRU 池

打开一个新的 VFD 时,会将该 VFD 对应的物理文件打开,并将该 VFD 插入到 VfdCache[O] 之后的位置。例如,我们要插入的 VFD 为 a,首先要根据 a 中的 fd 字段判断对应的物理文件是否已经打开。如果没有打开则根据 a 中的 fileName 打开此文件,并插入到 LRU 池中。

插入时要将 a 的 lruMoreRecently 指向 VfdCache[0],VfdCache[0] 的 lruLessRecently 指向 a,然后 a 的 lruLessRecently 指向 V1,V1 的 lruMoreRecently 指向 a。

(2) 从 LRU 池删除 VFD

进程使用完一个文件并关闭它时,将该文件的 VFD 从 LRU 池中删除,并将该 VFD 对应的文件关闭掉。例如,我们要对 V2 操作,则首先将 V1 的 lrulessRecently 指向 V3,将 V3 的 lruMoreRecently 指向 V1。 

这样就将 V2 从 LRU 池中删除了,如果V2 的fdstate 被置为 FD_DELETE_AT_CLOSE,则要先将V2对应的文件删除,再清掉FD_DELETE_AT_CLOSE 位,接着将 fileSize 置为 0,将 fd 置为 VFD_CLOSED。这样 V2 就变为空闲,最后将其加入到空闲链表中。

(3) 删除 LRU 池尾 VFD

当 LRU 池已满,而此时又要打开新的文件时,就需将池尾的 VFD 删掉,这样新打开的 VFD 就可以插入到 LRU 中。注意,这里被删除的 VFD 仅仅只是从 LRU 池中脱链并关闭其对应的物理文件,VFD 本身并不做其他修改和删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何写好一份解决方案

1、前言 我们在日常工作中会不可避免要去编写各种方案,如技术方案、建设方案、项目建议书、实施方案、规划方案、解决方案等。 我们去浏览华为、阿里、腾讯、IBM、海尔等公司的官网,可以看到在首页比较显眼的位置,都有解决方案的入口&#…

Postcat X APISIX 合作插件 :一键同步,轻松配置到 APISIX

近日,云流科技(广州)有限公司(简称“Eolink”)旗下的开源 API 管理工具 Postcat 和深圳支流科技有限公司(简称“API7 支流科技”)在各自擅长的领域携手合作,推出了 Postcat & Ap…

R语言 tidyverse系列学习笔记(系列4)PlantGrowth - percentage table

本篇学习数据分析, Excel 表格制作 Task: 创建一个 行 百分比 表格 row percentage table 先看一下 PlantGrowth 数据集 library(dplyr)data("PlantGrowth") view(PlantGrowth)给数据集新加一列 weight_cat ,并用 case_when 自定…

【React】: React的生命周期

概述 生命周期的每个阶段总是伴随着一些方法的调用,这些方法就是生命周期的钩子函数 钩子函数的作用:为开发人员在不同操作阶段提供了十几 只有 类组件 才有生命周期 生命周期的图片: 同时有: 1.1 创建时 的生命周期执行顺序 编写…

计划任务使用介绍

作者:lly 文章目录 前言一、使用说明1.1 发布模型1.2 创建并设置计划任务1.3 开启计划任务1.4 管理计划任务 二、结语 前言 iServer 11i(2023)对于处理自动化服务新增计划任务功能,该功能支持定时触发和监听文件变化触发执行模型,因此计划任务适用于以下…

Vite构建工具下Tinymce踩坑指南

背景 "vue": "^3.2.41","vite": "^3.2.3","tinymce": "^6.4.2","tinymce/tinymce-vue": "^5.1.0",坑1: 找不到zh-Hans.js等配置的文件 使用Tinymce需要配置中文汉化包、样式等。这些文件都是…

安全问题我们需要重视,立刻升级fastjson2

一、前言 小伙伴大家好,我是开源字节快速开发平台的作者。fastjson2.0 是fastjson的重要升级,目标是为下一个十年提供一个高性能的JSON库,同一套API支持JSON/JSONB两种协议。 近期fastjson 再报安全漏洞,直接给我们发送了高危告…

FastReport 2023.2新版, Delphi 和 Lazarus 核心产品将统一整合, 一起来看!

FastReport 是功能齐全的报表控件,可以帮助开发者可以快速并高效地为.NET,VCL,COM,ActiveX应用程序添加报表支持,由于其独特的编程原则,现在已经成为了Delphi平台最优秀的报表控件,支持将编程开…

风景类Midjouney prompt提示词

稳定输出优美风景壁纸的Midjouney prompt提示词。 1\在夏夜,有淡蓝色的星空,海边,流星,烟花,海滩上全是蓝色的玫瑰和绿色的植物,由Ivan Aivazovsky和Dan Mumford,趋势在cgsociety,柔…

HEIC→JPG

问题描述:图片格式由HEIC转JPG 解决办法:在网上找一个在线图片转格式的软件

我理解的参与开源贡献

坐标上海的E人,还在新手村练级的前端开发。曾闯荡过教育培训和零售管理行业,经历过大公司、外企,也和朋友的工作室合作过,斩获过一些能吓唬人的标签。好奇心很足,精力也很充沛,代码世界就是我现实生活中的霍…

【前后端实现文件下载或浏览】

前后端实现文件下载或浏览 背景前端后端java其他IO流分两种;字符流&字节流 背景 前端html\js\css,使用a标签或者iframe,笔者使用window.open(url)—重新打开标签页地址栏显示的接口路径;后端返回客户端[HttpServletResponse] 文件流(以附件的方式[a…

建设现代化智慧十防档案室所需要的技术性方案

一、库房温湿度对档案的影响 库房的温湿度,过高过低都会影响档案制成材料的耐久性。高温高湿会加速纸张的老化水解,使危害档案制成材料的霉菌、细菌繁殖,并增强光化作用,使有害气体、灰尘吸附能力增大。但低温低湿会使纸张变脆&a…

VXLAN 主机VTEP(EVPN)

EVE环境模拟搭建一个基于主机VTEP的VXLAN数据中心网络。 实验里vtep是在linux主机上,同时linux主机还得有路由功能使VTEP的端点IP可达,所以两台linux服务器需要安装FRR。 数据转发平面使用VXLAN封装;在控制平面我打算选择使用EVPN和OVN两种不…

数据中台的商机

阿里拆中台了,很多人来问数据中台还要不要的问题,我认为中台总是要有的,无非是薄厚的问题。然后又有人来问数据中台价值创造的问题,这个其实是数据中台最核心的问题,我就来正式聊一聊,里面有很多的批判&…

T900:可以完美替代P900的国产900MHz无线跳频模块

目录 国产T900模块及其系列成品 T900模块 T900成品 国产T900模块及其系列成品 T900模块及其系列成品,是专门针对无人机及机器人行业设计的,尺寸小、性能优越,可以完美替代microhard的P900产品。下面向大家介绍下T900的相关情况&#xff1…

Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 一、负载均衡 …

STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

深入学习 Linux 操作系统的存储 IO 堆栈

一、Linux 存储堆栈图 当使用 read() 和 write() 系统调用向内核提交读写 I/O 请求操作时需要经历的步骤: 1)首先,请求经过虚拟文件系统,虚拟文件系统提供了统一的文件和文件系统的相关接口,屏蔽了不同文件系统的差异…

Applied soft computing期刊投稿流程

爱斯唯尔账户注册问题: 账号所属作者即默认通讯作者 刚开始应该会进入这个页面,这里的用户名和密码一般是导师(通讯作者)的账号密码,可以询问老师,然后点击author login登陆就好。 注册里面强调一点,这里面的Title 一般是职称的意思,如果是学生可以填Mr.或者Mrs. 投…