linux 中 fd 申请和释放管理(两级 bitmap)

news2024/10/5 23:26:37

linux 中 fd 的几点理解_linux fd-CSDN博客

通过上边的文章,我们可以知道,在 linux 中,fd 有以下几点需要了解:

(1)fd 表示进程打开的文件,是进程级别的资源,不是系统级别的资源

(2)struct task_struct 在内核中用于描述一个进程,其中打开的文件使用 fd table 来描述

(3)在用户态看 linux,一些皆文件

(4)一个进程可以打开的文件个数是有限制的,使用 ulimit -a 可以查看

那么在 linux 中,当我们打开一个文件的时候,会返回一个 fd,fd 是一种资源,在内核中是怎么维护这些资源的呢 ?当关闭一个文件的时候,会释放这个 fd,释放的时候又是怎么释放的呢 ?

可以想象,如果让我们自己来实现的话,我们会选择一个 bitmap 来维护 fd 的被使用情况。系统默认情况下,一个进程可以打开的文件个数是 1024,我们就需要维护一个长度为 1024 的 bitmap。如下图所示,表示一个长度为 1024 的 bitmap,bitmap 的下标从 0 到 1023 表示 1024 个 fd,bitmap 中的内容 1 表示 fd 被使用,0 表示 fd 没有被使用。下图表示 fd 0、1、2、501 被使用,其它的 fd 没有被使用。

那么当我们打开一个文件的时候,是怎么分配 fd 的呢,是每次都要遍历 bitmap,从中选择一个空闲的 fd 来返回吗 ?这种方式是最基础的方法,当然是可行的。缺点在于,每次都要遍历 bitmap,如果 bitmap 0~1000 都已经被使用,1001 没有没使用,这个时候我们就需要做 1000 次无用的查询,效率比较低。当我们关闭文件,释放 fd 的时候,是比较好理解的,直接使用 fd 作为下标,找到对应的 bit,直接将该 bit 设置为 0 即可。

1 fd 上下边界

fd 最小是 0,最大可以使用 ulimit -a 来查看。默认情况下,系统允许一个进程最多打开 1024 个文件,所以 fd 最大值为 1023。所以默认情况下,进程内的 fd 的取值范围是 [0, 1023]。

2 申请 fd

2.1 数据结构 struct fdtable 和函数 find_next_fd

struct fdtable 中有以下几个成员和 fd 的维护有关。

struct fdtable {
    // 进程能打开的文件个数的最大值
	unsigned int max_fds;
    ...
    // bitmap,一个 bit 表示一个 fd
	unsigned long *open_fds;
    // bitmap,一个 bit 表示 BITS_PER_LONG 个 fd
	unsigned long *full_fds_bits;
    ...
};

在函数 find_next_fd 中,空闲 fd 的查找分了两步来完成:

(1)先在 full_fds_bits 中查找,如果文件个数最多是 1024 个,在 64 位机器上 long 类型长度市是 64 个 bit。那么 full_fds_bit 的长度是 16(1024/64),第 0 bit 就能代表 open_fds 中的第 0 到第 63bit,第 1bit 能代表 open_fds 中的第 64 到 127bit,以此类推。只要第 64 到 127bit 有空闲的 fd,哪怕只有 1 个,那么在 full_fds_bit 中的第 1 bit 也会标志为空闲。

(2)在第一步中已经在 full_fds_bits 找到了空闲的 bit,这个 bit 能把查找范围缩小到 64 个 bit 范围之内。然后第二步中从 full_fds_bits 中查找具体空闲的 bit。

static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start)
{
	unsigned int maxfd = fdt->max_fds;
	unsigned int maxbit = maxfd / BITS_PER_LONG;
	unsigned int bitbit = start / BITS_PER_LONG;

	bitbit = find_next_zero_bit(fdt->full_fds_bits, maxbit, bitbit) * BITS_PER_LONG;
	if (bitbit > maxfd)
		return maxfd;
	if (bitbit > start)
		start = bitbit;
	return find_next_zero_bit(fdt->open_fds, maxfd, start);
}

使用两级 bitmap 来查找空闲的 fd,对性能做了优化。

如果使用一级 bitmap,那么查找次数平均下来要 1024 次。

使用两级 bitmap,查找次数平均下来是 16 + 64 = 80 次。16 是第一级 map 查找的次数,64 是第二级 bitmap 查找的次数。

3 释放 fd

释放 fd 相对来说好理解,直接使用 fd 做下标找到 bitmap 中对应的 bit,然后将 bit 清除即可。关闭 fd 的时候,会通过函数 __put_unused_fd() 最终调用 导函数 __clear_open_fd()。

static inline void __clear_open_fd(unsigned int fd, struct fdtable *fdt)
{
	__clear_bit(fd, fdt->open_fds);
	__clear_bit(fd / BITS_PER_LONG, fdt->full_fds_bits);
}

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

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

相关文章

Rhinoceros v7.5 解锁版安装教程 (3D三维造型软件)

前言 Rhinoceros 中文名称犀牛是一款超强的三维建模工具,全称Rhinoceros,Rhino是美国Robert McNeel & Assoc开发的PC上强大的专业3D造型软件,它可以广泛地应用于三维动画制作、工业制造、科学研究以及机械设计等领域。它能轻易整合3DS M…

Nodejs及stfshow相关例题

Nodejs及stfshow相关例题 Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境,或者说是一个 JS 语言解释器而不是某种库。 Node.js可以生成动态页面内容Node.js 可以在服务器上创建、打开、读取、写入、删除和关闭文件Node.js…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式(Adapte…

【Linux】Centos7安装JDK

【Linux】Centos7安装JDK 下载 Oracle 官网下载 JDK17 https://www.oracle.com/cn/java/technologies/downloads/#java17 安装 使用rz命令上传 jdk tar 包,上传失败直接用 xftp 上传 在安装图形界面时,有勾选开发工具,会自动安装 JDK 需要先…

【openlayers系统学习】3.4波段数学计算(计算NDVI)

四、波段数学计算(计算NDVI) 我们已经看到了如何使用 ol/source/GeoTIFF​ 源代码来渲染真彩色和假彩色合成。我们通过将缩放的反射率值直接渲染到红色、绿色或蓝色显示通道中的一个来实现这一点。还可以对来自GeoTIFF(或其他数据瓦片源&…

深度学习之基于Pytorch框架手写数字识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是数字图像处理领域的一个经典问题,也是深度学习技术的一个常用应用场…

vue期末复习选择题1

1. 下面哪一项描述是错误的?(B) A.$("ul li:gt(5):not(:last)")选取ul标记里面索引值大于5且不是最后一个的li元素B.$("div").find("span")选取div元素的子元素spanC.$("div.showmore > a")选取…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。 另外我有一台阿里云服务器,做跳板机。 我有一个阿里的域名…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回,而不需要等待消息被处理完毕,这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构,通常涉及多个服务之间的相互调用,如果通信只是在少数几个微…

Pandas的基础应用

Pandas 介绍 Pandas 是一个用于数据操作和分析的强大 Python 库,在数据科学和机器学习领域广泛使用。要有效地使用 Pandas,理解一些关键概念非常重要,如坐标轴(axis)、索引(index)、行&#xff…

windows平台vcpkg安装

1. 克隆vcpkg仓库 git clone https://github.com/microsoft/vcpkg 2.运行bootstrap-vcpkg.bat下载vcpkg.exe 3.运行验证 4.使用VCPKG安装OPENSSL 5.安装成功

RDDM论文阅读笔记

CVPR2024的残差去噪模型。把diffusion 模型的加噪过程分解为残差diffusion和noise diffusion,其中残差diffusion模拟从target image到degraded image的过程,而noise diffusion则是原来的diffusion过程,即从图片到高斯噪声的加噪过程。前者可以…

python批发模块的调试之旅:从新手到专家的蜕变

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、调试技巧的重要性 二、批发模块调试的实战演练 1. 设置断点 2. 逐行执行代码 3. 观察…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 DOM破坏总结为一句话就是&#xff1a;利用HTML元素来响应JS代码的执行结果。 举个例子&#xff1a; <body> <img id"x"> <img name"y"…

网络模型-PoE技术

一、PoE简介 以太网供电PoE(Powerover Ethernet)是指通过以太网网络进行供电&#xff0c;也被称为基于局域网的供电系统PoL(PoweroverLAN)或有源以太网(Active Ethernet)。 1、PoE的优势: 可靠: 电源集中供电&#xff0c;备份方便。连接简捷: 网络终端不需外接电源&#xf…

《web应用设计》第八次作业

我的小组长是姚若希&#xff0c;我们组课程设计的题目是&#xff1a;学生管理系统 &#xff0c;我认领的功能模块是&#xff1a;课程管理 2.查询并分页

这所211专硕22408复试线310分,学硕收调剂!辽宁大学计算机考研考情分析!

辽宁大学信息学院下设计算机科学与技术、电子信息科学与技术、通信工程、信息管理与信息系统、软件工程5个本科专业&#xff0c;有计算机软件与理论、计算机应用技术2个硕士学位授权点&#xff0c;软件工程和计算机技术两个专业硕士学位点&#xff0c;1个计算机应用研究所、1个…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…

力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树 文章目录 题目描述思路复杂度Code 题目描述 思路 1.利用二叉树的后序遍历将原始的二叉树序列化&#xff08;之所以利用后序遍历是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西&#xff09;&#xff1b; 2…

【EXCEL_VBA_基础知识】15 使用ADO操作外部数据

课程来源&#xff1a;王佩丰老师的《王佩丰学VBA视频教程》&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 目录 1. 使用ADO链接外部数据源 2. 常用SQL语句&#xff08;Execute(SQL语句)&#xff09; 2.1 查询数据、查询某几个字段、带条件查询、合并两表数据、插…