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

时间:2017-07-09 21:12:14

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

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

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

1 个答案:

答案 0 :(得分:1)

没有。 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() - 包装器以确认是否已写入所有数据,或者是否需要再次调用write()剩下的数据等

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