fd_clone给fuse带来了什么

fd_clone给fuse带来了什么

       libfuse从2016年12月08日发布3.0.0版本开始支持clone_fd选项,相应的ko模块在linux内核4.2版本做相应的修改:https://kernelnewbies.org/Linux_4.2

       查看libfuse的changelog是这么描述的

* Added *clone_fd* option.  This creates a separate device file
  descriptor for each processing thread, which might improve
  performance.

       意思是可以为一个processing thread创建一个独立的内核文件描述符file descriptor,达到提高性能的目的。这只是用户态所看到的信息,看看内核ko的protocol说明,可以看到如下的表述

Multi-Threading

Background: When a file is opened, the Linux kernel creates a "file description" for the I/O state, and returns a "file descriptor" to userland. That descriptor can be freely passed to the dup(2) functions to duplicate the descriptor, but the underlying description remains unary.

The FUSE kernel driver implicitly locks access to the /dev/fuse file descriptor so that each read() and write() syscall is atomic. This implies that multiple threads can safely share the descriptor, but also that they will face lock contention and reduced performance.

To get the best performance out of a multi-threaded filesystem server, open /dev/fuse once as a "session FD" and again in each thread as "worker FDs". After initializing the session with a standard FUSE handshake, the workers can be associated with the session by calling ioctl(worker_fd, FUSE_DEV_IOC_CLONE, &session_fd).

This allows multiple threads to serve FUSE requests without contending for the descriptor lock.

     所以不是separate file descriptor这么简单,普通的通过dup(2)复制出来的fd,最终指向的是同一个file description,下面这个图应该是熟面孔了,如果fd 20是通过对fd 2执行dup(2)得到的,则两个fd在内核实际指向同一个file description,在这种情况下,不考虑file description中file operation的实现,不同的两个线程分别操作fd 2和fd 20,最终在file description都难以避免一些竞争条件。

    而fd_clone则正是为了解决这个问题,通过使用ioctl来对一个fuse dev fd进行clone,在内核创建不同的file description,将资源分割开以达到尽量减少冲突域的目的。

    fuse在mount和clone fd后内核数据结构如下图:

  • mount一个fuse文件系统对应一个super block;
  • 一个super block对应一个fuse_conn;
  • mount时会创建第一个fuse_dev;
  • 每clone一次fd就会再创建一个fuse_dev;
  • 每个fuse_dev都有自己的processing queue;
  • 多个fuse_dev都放在fuse_conn的devices链表中;
  • 一个fuse文件系统只有一个iput queue在fuse_conn对象中;

fs handler

      从fs handler端来看,user application发起的文件操作最终都会走到__fuse_request_send(fuse_conn *, fuse_req *)。可能有多个user application线程同时发起操作,都是通过对fuse_iqueue中waitq的spinlock进行加锁来互斥,保护多个线程同时把request挂入到fuse_iqueue的pending中。所以fd clone对user application端的效率应该是没有任何帮助了。

dev handler

       而fuse daemon端的多个worker线程都是通过fuse_dev_do_read(fuse_dev *, file *, size_t)来读取request。如果是支持fd clone的话,这里的fuse_dev *和file *两个参数都是线程独享的。从流程上来看,fuse_dev_do_read是从fuse_conn的fuse_iqueue中取出一个request,放入到fuse_dev的fuse_pqueue中的io list里;然后执行内存拷贝,将内核buffer中的req数据拷贝到用户空间,copy完成后将这个req再从fuse_pqueue的io list移动到processing list。然后read操作返回。整个过程会针对fuse_pqueue加多次锁,因此如果不同的worker使用不同的fuse_dev的话,这里的竞争条件必然会缩小,从而达到提高效率的目的。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cv2.MIXED_CLONE是OpenCV中的一个函数,用于实现图像混合克隆。它可以将一个图像中的一个区域无缝地复制到另一个图像中,并将其与周围像素进行混合,以使过渡更自然。该函数需要以下参数: - src:源图像,应该是一个三通道的图像,数据类型为np.uint8。 - dst:目标图像,应该是一个三通道的图像,与src具有相同的形状和数据类型。 - mask:掩码图像,确定源图像中哪些区域应该被复制到目标图像中。它应该是一个单通道的图像,数据类型为np.uint8,其值应该为0或255。 - center:源图像中被复制区域的中心点在目标图像中的位置。 - mixed_clone:指定混合克隆的类型。可以是cv2.NORMAL_CLONE或cv2.MIXED_CLONE。 使用cv2.MIXED_CLONE函数可以实现很多有趣的应用,例如将一个人的脸部特征无缝地合并到另一个人的照片中。 ### 回答2: cv2.MIXED_CLONE是OpenCV中的一个函数,用于执行图像混合操作。它可以将源图像的某一区域无缝地融合到目标图像中的特定位置上。 cv2.MIXED_CLONE的使用涉及以下几个步骤: 首先,需要准备一个目标图像和一个源图像。目标图像是用来接收被融合区域的图像,而源图像是指定待融合的区域。 然后,需要确定融合操作的区域范围。可以通过生成一个掩膜来指定需要融合的区域。掩膜是一个和目标图像大小相同的二值图像,在融合区域上取值为非零,其他区域取值为零。 接下来,调用cv2.mixeClone函数进行融合操作。该函数需要传入目标图像、源图像、掩膜以及融合区域的起始坐标作为参数。 最后,融合结果将会返回给调用者,可以将其保存为一个输出图像。 cv2.MIXED_CLONE的工作原理是根据源图像和目标图像的灰度值与掩膜的像素值之间的权重关系,进行像素级的融合计算。该函数采用了一个优化算法,可以处理多层次的融合操作,以达到更好的效果。 ### 回答3: cv2.MIXED_CLONE是OpenCV图像处理库中的一个函数,用于将源图像中的某个区域克隆到目标图像中的对应位置。该函数采用克隆融合的方式,旨在以尽可能无缝的方式将源图像的特定区域与目标图像进行融合。 具体而言,cv2.MIXED_CLONE函数的调用方式如下: dst = cv2.seamlessClone(src, dst, mask, center, cv2.MIXED_CLONE) 其中,src表示源图像,dst表示目标图像,mask表示源图像中待克隆区域的蒙版,center为待克隆区域在目标图像中的中心位置,cv2.MIXED_CLONE表示克隆的融合方式。 在实际使用中,首先需要将待克隆的区域在源图像中进行标记,将标记结果作为mask参数传入cv2.MIXED_CLONE函数。接着,通过指定待克隆区域在目标图像中的中心位置,确定克隆的位置。最后,调用cv2.MIXED_CLONE函数,将源图像中的待克隆区域融合到目标图像中。 cv2.MIXED_CLONE函数的融合方式是综合了纹理、颜色和边缘等特征,以最小化融合边缘上的伪影和人工痕迹。这种融合方式在保持图像连续性和真实性的基础上,提供了较好的克隆效果。 总之,cv2.MIXED_CLONE是OpenCV图像处理库中一个用于克隆融合的函数,通过对源图像和目标图像进行相应的处理,可以实现将源图像中的特定区域无缝融合到目标图像中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值