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

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 表示一个 fdunsigned long *open_fds;// bitmap,一个 bit 表示 BITS_PER_LONG 个 fdunsigned 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.mzph.cn/bicheng/14441.shtml

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

相关文章

基于manifest文件批量将coding的仓库导入gitlab中

文章目录 写在前面的话背景编写manifest文件最终效果 写在前面的话 前面有讲过通过manifest清单导入项目到gitlab中,但是实际的操作是不同gitlab实例之间的操作,然而对于在不同gitlab实例的repo迁移而言,显然direct transfer会更合适。 背景…

民国漫画杂志《时代漫画》第21期.PDF

时代漫画21.PDF: https://url03.ctfile.com/f/1779803-1248634754-017e2b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

结构型模式之桥接模式

文章目录 概述原理结构图代码示例 小结 概述 桥接模式(bridge pattern) 的定义是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转…

基于深度学习OCR文本识别系统源码(带界面)

第一步:概要 基于深度学习OCR文本识别分为两个模块:DBNet和CRNN。 DBNet是基于分割的文本检测算法,算法将可微分二值化模块(Differentiable Binarization)引入了分割模型,使得模型能够通过自适应的阈值图进行二值化,并…

Postgresql 基础学习

一、介绍 PostgreSQL是一个开源的关系型数据库管理系统(RDBMS),它支持SQL语言的所有功能,具有可扩展性、高并发性和可靠性等特点。 以下是一些 PostgreSQL 的特点: 开源:PostgreSQL是一个非常受欢迎的开源…

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后,在需要打开notebook的文件夹中, shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面: 2 快速查看函数用法 光标放在函数上——shift键tab 3...

Docker镜像源自动测试镜像速度,并选择速度最快的镜像

国内执行如下代码 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/check_docker_registry.sh)国外执行如下代码 bash <(curl -sSL https://github.com/xjxjin/scripts/raw/main/check_docker_registry.sh)如果有老铁有比较不错的镜像源&#xff0c;可以提…

探索Python编程乐趣:制作气泡反弹小游戏

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;Python编程的轻松入门 二、游戏实现原理&#xff1a;气泡反弹的逻辑 …

探索生态农业,守护绿色家园

在繁忙的都市生活中&#xff0c;我们往往忽略了与自然和谐相处的重要性。而生态农业&#xff0c;正是让我们重拾与大自然亲密关系的桥梁。通过采用生态友好的耕作方式&#xff0c;生态农业不仅能够提供健康、营养的农产品&#xff0c;还能够保护生态环境&#xff0c;实现人与自…

CCS基础入门

视频&#xff1a; CCS使用教程_哔哩哔哩_bilibili 创建工程 步骤一&#xff1a;创建 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 步骤二&#xff1a;选择工程配置 步骤三&#xff1a;完成创建 编译工程&#xff1a; 方法一&#xff08;最常用&#xff09;…

Excel中自动验证URL网址链接有效性

下面表格中的网址有的可以打开&#xff0c;有的不能打开 在Excel中按下 Alt F11 键来打开VBA编辑器&#xff0c;选择 插入 > 模块&#xff0c;创建一个新的模块&#xff0c;在新创建的模块窗口中输入以下代码&#xff1a; Function 测试网址(ByVal URL As String) As Str…

UDP协议与TCP协议1.2

UDP UDP数据报UDP报头UDP载荷 UDP的报文格式&#xff1a; 这里的UDP长度&#xff0c;描述了整个UDP数据报&#xff0c;占多少个字节&#xff0c;这里整个UDP长度最多是64kb 在UDP中校验和就是使用CRC的方式来完成的 数据在网络传输中是可能会出现错误的&#xff0c;例如比特翻…

uniappx 安卓保活(多种技术;UTS版) Ba-KeepAlive-U

简介&#xff08;下载地址&#xff09; Ba-KeepAlive-U 是一款android原生保活插件&#xff0c;UTS版本&#xff08;同时支持uniapp和uniappx&#xff09;&#xff0c;支持市面上大部分机型&#xff0c;Android4.4到Android14&#xff08;**注意&#xff1a;**不保证支持所有机…

正则表达式(知识总结篇)

本篇文章主要是针对初学者&#xff0c;对正则表达式的理解、作用和应用 正则表达式&#x1f31f; 一、&#x1f349;正则表达式的概述二、&#x1f349;正则表达式的语法和使用三、 &#x1f349;正则表达式的常用操作符四、&#x1f349;re库主要功能函数 一、&#x1f349;正…

远动通讯屏柜的组成及各装置的作用

远动通讯屏柜的组成及各装置的作用 远动通讯屏是基于公共电网安全而投入的远方监控遥控设备&#xff1b;主要由远动装置、通讯管理机、交换机、调制解调器、GPS对时装置、数字通道防雷器、模拟通道防雷器、插线板、空气开关、屏柜及附件等设备组成、标配尺寸2260*800*600&…

C++设计模式---面向对象原则

面向对象设计原则 原则的目的&#xff1a;高内聚&#xff0c;低耦合 1. 单一职责原则 类的职责单一&#xff0c;对外只提供一种功能&#xff0c;而引起类变化的原因都应该只有一个。 2. 开闭原则 对扩展开放&#xff0c;对修改关闭&#xff1b;增加功能是通过增加代码来实现的&…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量&#xff1a;echo %path% linux系统变量&#xff1a;echo $PATH2.引号 " " 双引号&#xff0c;换行…

如何基于springboot构建cas最新版源码?

环境准备 下载JDK21 https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip下载gradle 8.5并配置环境变量 https://gradle.org/next-steps/?version8.5&formatbin下载项目git clone http://gitlab.ruishan.cc/meta/anka-authentication.git 开始…

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

Ansible自动化运维中的file文件模块模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月21日15点21分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…