Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux vmsplice(2)的语义是什么,有礼物和没有礼物?_Linux_Linux Kernel_Splice_Zero Copy - Fatal编程技术网

Linux vmsplice(2)的语义是什么,有礼物和没有礼物?

Linux vmsplice(2)的语义是什么,有礼物和没有礼物?,linux,linux-kernel,splice,zero-copy,Linux,Linux Kernel,Splice,Zero Copy,我试图理解vmsplice(2)syscall(手册页)的功能。关于SPLICE\u F\u GIFT标志的效果,我有两个问题: 手册页说,一旦将页面赠予内核,就不能再修改内存。这是否意味着内存被永久固定,或者它可能指的是可以通过赠送过程取消映射的虚拟内存,而不是物理内存?换句话说,这个的典型用法是什么 如果我没有设置SPLICE\u F_GIFT,那么vmsplice(2)与像writev(2)这样的向量化写系统调用有什么不同吗 这是否意味着内存被永久固定,或者它可能指的是可以通过赠送过程取消

我试图理解
vmsplice(2)
syscall(手册页)的功能。关于
SPLICE\u F\u GIFT
标志的效果,我有两个问题:

  • 手册页说,一旦将页面赠予内核,就不能再修改内存。这是否意味着内存被永久固定,或者它可能指的是可以通过赠送过程取消映射的虚拟内存,而不是物理内存?换句话说,这个的典型用法是什么

  • 如果我没有设置
    SPLICE\u F_GIFT
    ,那么
    vmsplice(2)
    与像
    writev(2)
    这样的向量化写系统调用有什么不同吗

  • 这是否意味着内存被永久固定,或者它可能指的是可以通过赠送过程取消映射的虚拟内存,而不是物理内存?换句话说,这个的典型用法是什么

    您承诺不修改该页面。不是页面的虚拟地址。对于大多数用例,建议操作类似于:

    mmap
    read
    vmsplice
    munmap
    
    通常,您希望在
    malloc
    上使用
    mmap
    ,因为您希望确保拥有一个页面,而不仅仅是4096字节的RAM。如果你的分配器确定效率更高,它可以坐在2MB的中间,或者1GB的代码> HuGeEpgEpg/<代码>。p> 如果我没有设置SPLICE\u F\u GIFT,那么
    vmsplice(2)
    与像
    writev(2)
    这样的向量化写系统调用有什么不同吗


    内核中的大多数缓冲区都是管道。或者说,管道是由与缓冲区相同的数据结构表示的

    1-是的,它不同。
    如果使用write将1GB写入管道,它将循环,直到1GB被传送到管道,除非有信号中断工作。
    如果将1GB应用于管道,则仅当管道缓冲区已满时,它才会阻塞,然后只写入管道缓冲区中可用的内容。
    非常令人沮丧的是,它没有循环并保持正常的写作。不复制与必须执行一大堆VMPLICE调用以及必须为部分VMPLICE写入实现一个循环进行权衡

    2-我从mmaped区域进行VMPLICING,并且能够在VMPLICING之后立即进行munmap,而不会发生崩溃或数据损坏