linux read/write 系统调用是否使用动态内存分配?

Do linux read/write system calls use dynamic memory allocation?

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

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

没有。 If you look for syscalls in the Linux kernel source(我是用grep -rn SYSCALL_DEFINE.*write找的read/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)

上面的链接中还有 片段,用于在代码中提取这些值。

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

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