linux1.2.13 file结构体管理是怎样的
发表于:2024-10-27 作者:千家信息网编辑
千家信息网最后更新 2024年10月27日,本篇内容介绍了"linux1.2.13 file结构体管理是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2024年10月27日linux1.2.13 file结构体管理是怎样的
本篇内容介绍了"linux1.2.13 file结构体管理是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
操作系统为进程维护了打开的文件列表,每个进程维护了一个file数组字段(struct file * fd[NR_OPEN]);每个元素指向一个file结构体。每个file结构体有一个字段指向inode结构体,inode管理这个文件的内容、权限等信息。这里分析的是file结构体的管理。
下面是file结构体的定义
struct file { mode_t f_mode; loff_t f_pos; unsigned short f_flags; unsigned short f_count; off_t f_reada; struct file *f_next, *f_prev; int f_owner; /* pid or -pgrp where SIGIO should be sent */ struct inode * f_inode; struct file_operations * f_op; unsigned long f_version; void *private_data; /* needed for tty driver, and maybe others */};
下面是对file结构体的管理,当进程打开一个文件的时候,就可能需要从中申请一个file结构体。
/*
* linux/fs/file_table.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*/
#include
#include
#include
struct file * first_file;
int nr_files = 0;
// 双向循环链表,first_file指向头指针,头插法插入一个节点
static void insert_file_free(struct file *file)
{
file->f_next = first_file;
file->f_prev = first_file->f_prev;
file->f_next->f_prev = file;
file->f_prev->f_next = file;
first_file = file;
}
// 删除一个节点
static void remove_file_free(struct file *file)
{
// 如果要删除的节点是第一个节点,则更新头指针,指向下一个节点
if (first_file == file)
first_file = first_file->f_next;
// 如果被删除的节点后面还有节点,则需要更新下一个节点的prev指针,指向当前节点的上一个节点
if (file->f_next)
file->f_next->f_prev = file->f_prev;
// 同理,更新上一个节点的next指针,指向被删除节点的下一个节点
if (file->f_prev)
file->f_prev->f_next = file->f_next;
// 置空
file->f_next = file->f_prev = NULL;
}
// file插入链表,成为最后一个节点
static void put_last_free(struct file *file)
{
// 保证file脱离了原来的链表
remove_file_free(file);
// 插入链表,但是不更新头指针first_file,所以file成为最后一个节点
file->f_prev = first_file->f_prev;
file->f_prev->f_next = file;
file->f_next = first_file;
file->f_next->f_prev = file;
}
void grow_files(void)
{
struct file * file;
int i;
// 申请一页内存
file = (struct file *) get_free_page(GFP_KERNEL);
if (!file)
return;
// i=PAGE_SIZE/sizeof(struct file),即一页可以存多少个节点,更新最大节点数
nr_files+=i= PAGE_SIZE/sizeof(struct file);
/*
当前是初始化的时候,先初始化一个节点,需要初始化的节点数减一,执行insert_file_free
前需要保证first_file非空,见insert_file_free中的first_file
*/
if (!first_file)
file->f_next = file->f_prev = first_file = file++, i--;
// 形成一个链表
for (; i ; i--)
insert_file_free(file++);
}
// file链表初始化
unsigned long file_table_init(unsigned long start, unsigned long end)
{
first_file = NULL;
return start;
}
// 获取一个可以的file结构体
struct file * get_empty_filp(void)
{
int i;
struct file * f;
if (!first_file)
grow_files();
repeat:
// nr_files是链表的总节点数
for (f = first_file, i=0; i < nr_files; i++, f = f->f_next)
// 找到空闲的节点
if (!f->f_count) {
// 脱离链表
remove_file_free(f);
// 清空内存
memset(f,0,sizeof(*f));
// 插入链表末尾
put_last_free(f);
// 标记已使用
f->f_count = 1;
f->f_version = ++event;
return f;
}
// 没有找到空闲节点,扩容,再找
if (nr_files < NR_FILE) {
grow_files();
goto repeat;
}
return NULL;
}
从图中我们可以看出,系统维护了一个双向循环的链表,保存了一系列已使用和未使用的file结构体。first_file指针执行第一个空闲的节点,进程申请file结构体的时候就把该节点放到链表结尾。first_file指针指向下一个空闲节点。如果没有空闲节点了,就会自动扩容。
"linux1.2.13 file结构体管理是怎样的"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
节点
结构
指针
指向
管理
空闲
更新
进程
内容
文件
时候
点数
内存
双向
字段
更多
知识
系统
保证
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器优化管理软件
怎样装数据库
丰田网络安全
gui编程 图像数据库
校园网络安全主题
用友数据库在哪
科创版网络安全
网络安全大赛攻防
大华网络安全漏洞
服务器安全策略端口打开
苹果手机共享服务器连接不上
浦东新区本地网络技术调试
石家庄帅旗网络技术有限公司
网络安全认证线上培训机构
湖南通用软件开发参考价格
电信宽带服务器名称和地址
华为云服务器网络安全上班怎么样
滨州昂旭互联网科技有限公司
方舟手游怎么转到别的服务器
乡镇卫生院网络安全经费保障
九零后互联网科技有限公司
有线电视网络技术培训班
vpn服务器接
新买的服务器安装不了输入法
数据库事务一直不提交
国家网络安全中心重庆
2018剑灵四川服务器
齐齐哈尔市委网络安全银行
网络安全等级保护没做的后果
平顶山服务器机柜供应商