一直有一个疑问。文件放在磁盘上,但操作文件在内存中。两者有什么关系?虽然至今没有找到更详细的答案,但是通过对linux底层数据结构的梳理,还是找到了一些端倪,分享给大家。一、linux的相关数据结构1.fd在编程语言中,一般打开文件的操作都需要创建一个文件描述符fd:intfd=open(...);fd是一个int类型,其实是一个数组下标,前三个0,1,2是输入输出,当错误占用新的fd时,先分配一个文件对象,然后放入数组,返回该数组的下标,即fd2.filestructfile{file_operations*fop;路径*f_path;loff_tf_pos;}file结构体中有一个f_path指针,指向path结构体,其中f_pos也保存了文件的位置3.pathstructpath{dentry*dentry...}path连接了一个dentry结构体4.dentrystructdentry{inode*d_inode;...}dentry结构连接到inode结构5.inodestructinode{address_space*i_mapping;address_space*i_data;}inode结构连接到address_space结构6.address_spacestructaddress_space{radix_tree_rootpage_tree;}page_tree是一棵基树,节点中存放的是page节点,page是系统中的page,所以address_space连接到page结构。7.pagestructpage{void*private;}private指向buffer_head8。buffer_headstructbuffer_head{sector_tblock_nr;//逻辑块号block_device*b_bdev;//磁盘设备号}block_nr中存储数据的逻辑块号,通过逻辑块号,可以将其与磁盘关联起来。9.生物结构生物{bio_vec*bi_io_vec;//链表sector_tbi_sector;//磁盘上的相关扇区structblock_device*bi_bdev;//相关块设备}一个bio连接了n个bio_vec结构,用来表示第10页中的内容。bio_vecstructbio_vec{page*bv_page;//指向包含的页面intbv_len;//长度intbv_offset;//页面偏移}11.task_structtask_struct{structbio*bio_list;//指向bioHead的链表}2.读写操作文件中的file_operations是一个操作结构体,包含了对文件的读写等操作。所有对文件的操作都会转移到file->f_op->read/write等操作。3、内存到磁盘的路径linux2.6以后,使用bio结构体来描述IO操作。由于效率原因,buffer_head的使用变少了。使用bio结构来描述一个读/写操作,然后使用IO调度算法进行调度。通过上面的结构,我们可以得到一个线索:fd->file->path->dentry->inode->address_space->page->buffer_head->diskblocknumberortask_struct->bio->diskblocknumberdiskIO操作都是异步的,会在特定条件下触发,将内容从内存刷新到磁盘。
