2010-3-15 sys_read()的流程

本文详细介绍了Linux系统中read()系统调用的过程及各内核组件的作用,包括vfs层、磁盘高速缓存、映射层、通用块设备层、I/O调度层和磁盘设备驱动,为理解文件读取提供了清晰的思路。

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

上次看sys_read()看得太乱了,主次不分,于是重新看了遍,对流程有了个大致的了解:

 

 

 

read()系统调用所涉及的内核组件如上图所示,依次为vsf层、磁盘高速缓存、映射层、通用块设备层、I/O调度层、磁盘设备驱动。 作用大致如下: vfs层决定如何执行read操作,将filp->f_op->read指向具体的函数; 内核映射层确定数据的物理位置,主要执行两步:1、确定数请求数据所在的块号;2调用具体的文件系统的函数,访问磁盘索引节点,根据逻辑块号来确定请求数 据在磁盘上的位置; 通用块层将上层的请求构造成bio结构,再将bio结构提交个I/O调度层; I/O调度层主要的工作则将上层的bio构造成request结构,将其加入到对应的request_queue中,并完成合并和排序的工作; 块设备从request中取得请求,然后再完成这些请求。

vfs层

 

 

映射层

filp->f_op->read和filp->f_op->aio_read指向具体的文件系统的指针,在 ext2文件系统中这两者分别对应generic_file_read()和generic_file_aio_read(),而 generic_file_read()和generic_file_aio_read()都将调用 __generic_file_aio_read()。

(注:大多数磁盘文件系统的read方法是由generic_file_read()通用函数实现,而 __generic_file_aio_read()函数是所有文件系统实现同步和异步读操作所使用的通用例程。此外,对于大多数问价系统来说,从文件中 读取一个数据页就等同于在磁盘上查找所请求的数据存放在哪些块上。只要这个过程完成了,内核就可以通过向通用块层提交适当的I/O操作来填充这些页)

 

 


通用块设备层

 

 

I/O调度层

接下来说明q->make_request的赋值:

在块设备驱动程序中(如sbull中),会调用blk_init_queue()来分配并初始化一个request队列,"prepare a request queue for use with a block device";

blk_init_queue()函数调用函数blk_init_queue_node(),blk_init_queue_node() 的主要工作就是对request队列进行初始化,在这里我只关注两个函数request_fn()和make_request_fn(),前者会被赋值为 blk_init_queue()的第一个参数,而make_request_fn()则会由blk_queue_make_request()设置为 __make_request()。

__make_request()函数会完成合并、排序等操作。

 

 

块设备驱动层

request弄好了之后,使用了blk_init_queue()块设备驱动程序就会通过request_fn()来处理器请求了。

在sbull中使用了两种模式:RM_SIMPLE、RM_FULL。

print("样本名称:", sys.argv[1]) print("单细胞参考-表达矩阵:", sys.argv[2]) print("单细胞参考-细胞类型信息:", sys.argv[3]) print("N_cells_per_location = ", sys.argv[4], "----", sys.argv[5]) sample = sys.argv[1] ## spot的细胞核识别数量的最大值: # WMQ-605-mspl:62 # Ncellsperspot = int(sys.argv[4]) proindex= sys.argv[5] # save_path = "/data1/chengrui/workspace/zst_st/result/cell2location/" ## save_path = "/data1/zhaoshutao/projectworkspace/cell2location_mouse_atlas_20241014_ref_filter/c2lres/"+ proindex +"/" # sample_folder = "/data1/chengrui/workspace/zst_st/ourdata_main/matrix/" sample_folder = "/data1/chengrui/workspace/zst_st/all_data/" # save_file = save_path + sample save_file = save_path + sample + "/1000/" os.makedirs(save_file, exist_ok=True) countsfilepath = sys.argv[2] if countsfilepath.endswith('.csv'): data=sc.read_csv(countsfilepath) elif countsfilepath.endswith('.txt'): data=sc.read_text(countsfilepath) else: print("Unsupported file format. Please use .csv or .txt files.") # 可以选择退出程序或者抛出异常 sys.exit(1) # meta = pd.read_csv(sys.argv[3]) # meta = pd.read_table(sys.argv[3]) file_path = sys.argv[3] if file_path.endswith('.csv'): meta = pd.read_csv(file_path) elif file_path.endswith('.txt'): meta = pd.read_table(file_path) else: print("Unsupported file format. Please use .csv or .txt files.") # 可以选择退出程序或者抛出异常 sys.exit(1) ##################################################################### adata_ref=data.transpose() os.chdir(save_file) os.getcwd() if sample == "WMQ-606-mSpl": sample_path = sample_folder + "WMQ-606-mSpleen/outs" elif sample in ["WMQ-627-mSpl","WMQ-629-mLym","WMQ-636-mLung","WMQ-678-mLiver","LXZ-009","WMQ-712-mTes","WMQ-714-mTes"]: if sample == "WMQ-627-mSpl": sample_path = sample_folder + "WMQ-627-mSpleen" else: sample_path = sample_folder + sample elif sample == "WMQ-731-mOva": sample_path = sample_folder + "WMQ-731-mOVA-bu" elif sample == "WMQ-732-mOva": sample_path = sample_folder + "WMQ-732-mOVA-bu" elif sample in ["WMQ-765-mOVA","WMQ-766-mOVA","WMQ-767-mOVA","WMQ-768-mOVA"]: sample_path = "/data1/zhaoshutao/projectworkspace/rawdata_20241222_ovary_st/" + sample +"/outs" else: sample_path = sample_folder + sample +"/outs" adata_st = sc.read_visium(sample_path) adata_st if sample in ["WMQ-586-mHeart", "WMQ-584-mHeart", "WMQ-644-mHeart"]: selected_barcodes = pd.read_csv("".join(["/data1/chengrui/workspace/zst_st/eye/",sample,"_pointsinregions.csv"])) selected_barcodes = selected_barcodes["barcode"] ## 扣掉血液位置 adata_st = adata_st[~adata_st.obs.index.isin(selected_barcodes), :].copy() elif sample in ["WMQ-567-mEye", "WMQ-594-mEye", "WMQ-593-mEye"]: selected_barcodes = pd.read_csv("".join(["/data1/chengrui/workspace/zst_st/eye/",sample,"_pointsinregions.csv"])) selected_barcodes = selected_barcodes["barcode"] ## 仅保留目标位置 adata_st = adata_st[adata_st.obs.index.isin(selected_barcodes), :].copy() else: pass adata_st检查代码有没有问题,并提供注释
最新发布
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值