博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINUX下进程打开的文件怎么和底层磁盘关联的?
阅读量:6715 次
发布时间:2019-06-25

本文共 1665 字,大约阅读时间需要 5 分钟。

一直有个疑惑,文件是放在磁盘中的,但是操作文件却是在内存中,这两者是怎么关联的呢,虽然至今还没有找到更详细的答案,但是对linux底层数据结构进行梳理后,发现了其中的一些线索,与大家分享。

一、相关的linux数据结构

1. fd

在编程语言里面,打开一个文件一般的操作需要建立一个文件描述符fd:

int fd = open(...);

fd是一个int型,其实是一个数组的下标,前三个0,1,2被输入,输出,错误占用了

新建新的fd的时候,首先分配一个file对象,然后放到数组里面,返回这个数组的下标,就是fd了

2. file

struct file{    file_operations *fop;    path *f_path;    loff_t f_pos;}

file结构中有一个f_path指针,指向path结构,其中f_pos还保存了文件的位置

3. path

struct path{    dentry *dentry    ...}

path连接着一个dentry结构

4. dentry

struct dentry{    inode *d_inode;    ...}

dentry结构连接着inode结构

5. inode

struct inode{    address_space *i_mapping;    address_space *i_data;}

inode结构连接着address_space结构

6. address_space

struct address_space{    radix_tree_root page_tree;}

page_tree是一个基树,节点中存放着page节点,page就是系统中的页,所以address_space连接着page结构。

7. page

struct page{    void *private;}

private指向buffer_head

8. buffer_head

struct buffer_head{    sector_t block_nr; // 逻辑块号    block_device *b_bdev; // 磁盘设备号}

block_nr存放的数据的逻辑块号,通过逻辑块号,就可以和磁盘关联起来了。

9. bio

struct bio{    bio_vec        *bi_io_vec; // 链表    sector_t    bi_sector; // 磁盘上相关的扇区    struct block_device *bi_bdev; // 相关的块设备}

一个bio连接着n个bio_vec结构,用于表示page中内容的位置

10. bio_vec

struct bio_vec{    page *bv_page; // 指向包含的页    int bv_len; // 长度    int bv_offset; //页中的偏移}

11. task_struct

struct task_struct{    struct bio *bio_list; // 指向bio的链表头}

二、读写操作

file中的file_operations是一个操作结构,里面包含对文件的read,write等操作,所有对文件的操作,都会转移到该文件file->f_op->read/write等操作。

三、内存到磁盘的路径

linux2.6之后,使用了bio的结构来描述IO操作,由于效率的原因,所以buffer_head使用场景变少了,用bio结构描述一个读/写操作,然后使用IO调度算法进行调度。

通过以上结构体,可以得出一条线索:

fd->file->path->dentry->inode->address_space->page->buffer_head->磁盘块号

或者

task_struct->bio->磁盘块号

磁盘的IO操作都是异步的,会通过特定的条件触发把内容从内存刷新到磁盘。

转载地址:http://haelo.baihongyu.com/

你可能感兴趣的文章
六、CPU优化(5)最大并行度
查看>>
微软私有云分享(R2)18Windows Azure Pack 命令行安装
查看>>
【虚拟化实战】网络设计之一vSwitch
查看>>
两步升级到Exchange 2010 SP2
查看>>
谈谈网络推广团队每天工作流程、工作标准、考核
查看>>
Hyper-v 3.0最佳实践分析程序(BPA)
查看>>
Cisco网络设备安全管理和报告
查看>>
七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
查看>>
将组策略应用到满足条件的计算机---配置组策略筛选
查看>>
PHP中的$this和$that指针使用案例
查看>>
SQL Server 2012 内存计数器的变化
查看>>
ubuntu无法修改ROOT密码的问题解决
查看>>
老男孩linux培训某节课前考试试题及答案分享
查看>>
Rsync镜像同步工具的安装配置
查看>>
logstash日志系统搭建
查看>>
通过Dmidecode读取硬件信息。
查看>>
DPM2012系列之六:在Win7上安装DPM远程管理控制台
查看>>
SCOM 2012知识分享-19:配置数据库整理设置
查看>>
鸟哥?马哥?靠边站!今天猫哥带你玩千万PV级别运维架构实战
查看>>
欢迎加入Java私活外包QQ群
查看>>