2011-7-10 15:32:09

本文介绍了Linux内核中节点的管理方式,包括根据节点状态形成的三种双向循环链表:正在使用(in_use)、脏(dirty)及未使用(unused),并详细解释了它们的特点与应用场景。此外,还介绍了命名空间的概念及其结构,以及与进程相关的文件系统结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


2011-7-10 15:32:09

节点链表
Linux内核根据节点的使用状态将节点链接成三种不同的双向循环链表,分别说明如下:

(1)"in_use"链表

"in_use(正在使用)"链表 通过成员i_list链接正在使用的有效节点,特征是:i_count > 0或i_nlink > 0。"in_use"链表用全局变量inode_in_use表示。

(2)"dirty"链表

"dirty(脏)"链表 与"in_use"一样的有效节点,但还设置了脏标识。"dirty"链表表示。Linux内核为每个超级块维护"dirty"链表,允许用于低负载的节点sync()操作。

(3)"unused"链表

"unused(未使用)"链表 通过成员i_list链接未使用的节点,特征是:i_count = 0。该链表用作磁盘高速缓存。"unused"链表用全局变量inode_unused

每个节点同时位于两个独立的链表中:一个是通过成员i_hash链接于节点的Hash链表,用全局变量inode_hashtable表示,用于快速查找。另一个链表是上述类型的链表之一。

"in_use"链表和"unused"链表定义如下(在include/linux/writebach.h中):
extern spinlock_t inode_lock;    /*用于保护设置i_state*/
extern struct list_head inode_in_use;
extern struct list_head inode_unused;

命名空间结构mnt_namespace
每个进程可以拥有属于自己的已挂接文件系统树,称为命名空间。通常大多数进程共享一个文件系统命名空间,即系统的根文件系统。
命名空间被子进程继承,但如果系统调用clone()用标识CLONE_NEWNS创建一个新进程时,那么新进程将获得一个新命名空间。

进程挂接或卸载文件系统时,仅修改它的命名空间,在同一命名空间的进程才可见这些修改,修改对其他命名空间没有影响。文件系统命名空间

用结构mnt_namespace描述,该结构列出如下(在include/linux/mnt_namespace.h中):
struct mnt_namespace {
 atomic_t  count;      /*引用计数器,表示共享命名空间的进程数*/
 struct vfsmount * root;  /*挂接点对象指针*/
 struct list_head list;  /*属于本命名空间的已安装文件系统的挂接点对象链表头*/
 wait_queue_head_t poll;
 int event;                 /*事件*/
};

挂接/卸载API函数
挂接/卸载API函数的功能说明如表2所示。

表2 挂接/卸载API函数功能说明
函数名  功能说明 
asmlinkage long sys_mount(char __user * dev_name, char __user * dir_name,…)  用于挂接普通文件系统的系统调用。 
asmlinkage long sys_umount(char __user * name, int flags)  用于卸载普通文件系统的系统调用。 

进程操作文件系统

 

与进程联系的文件系统相关结构
进程是通过文件描述符(file descriptors, 简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数,规定每个进程最多能同时使用NR_OPEN个文件描述符,

这个值在fs.h中定义为1024。每个进程用一个file_struct的结构来记录文件描述符的使用情况,它是进程的私有数据。

在进程的task_struct中有文件系统相关的数据成员,列出如下:
struct task_struct {
  ……
 struct fs_struct *fs; //文件系统信息
 struct files_struct *files;//打开文件信息
 ……
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值