【问题标题】:Do linux read/write system calls use dynamic memory allocation?linux读/写系统调用是否使用动态内存分配?
【发布时间】:2017-12-13 12:57:09
【问题描述】:

我想知道 linux 上的 readwrite 系统调用(与 unix 套接字一起使用)是否进行动态内存分配?

上下文是实时应用程序和确定性行为。

【问题讨论】:

    标签: linux malloc real-time system-calls unix-socket


    【解决方案1】:

    没有。 If you look for syscalls in the Linux kernel source(我用grep -rn SYSCALL_DEFINE.*writeread/write),你可以自己看源码:

    SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
    {
        struct fd f = fdget_pos(fd);
        ssize_t ret = -EBADF;
    
        if (f.file) {
            loff_t pos = file_pos_read(f.file);
            ret = vfs_read(f.file, buf, count, &pos);
            if (ret >= 0)
                file_pos_write(f.file, pos);
            fdput_pos(f);
        }
        return ret;
    }
    
    SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
            size_t, count)
    {
        struct fd f = fdget_pos(fd);
        ssize_t ret = -EBADF;
    
        if (f.file) {
            loff_t pos = file_pos_read(f.file);
            ret = vfs_write(f.file, buf, count, &pos);
            if (ret >= 0)
                file_pos_write(f.file, pos);
            fdput_pos(f);
        }
    
        return ret;
    }
    

    请注意,系统调用定义可能因平台而异:它们不必对所有平台都相同。事实上,许多平台的系统调用仅在少数架构上支持。

    在您的情况下(即套接字),有一个预先分配的每个套接字缓冲区,可能是通过动态分配。 It's easy to check what the size is for this buffer.

    Originally posted by saeedn:

    /proc/sys/net/ipv4/tcp_rmem (for read)
    /proc/sys/net/ipv4/tcp_wmem (for write)
    

    上面的链接中还有sn-ps 可以在代码中提取这些值。

    如果您尝试写入超过此缓冲区大小的大量消息,则需要将它们分解。通常,在写入套接字时,您需要创建自己的write()-wrapper 以确认是否所有数据都已写入,或者您是否需要使用部分剩余数据再次调用write(),等等。

    就动态内存分配的性能而言,一旦创建了套接字,该部分就完成了。吞吐量的更大瓶颈将是使用套接字处理 I/O。

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2011-09-25
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多