我想知道在Linux上使用读和写系统调用(与unix套接字一起使用)是否进行动态内存分配?
上下文是实时应用程序和确定性行为。
答案 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.
/proc/sys/net/ipv4/tcp_rmem (for read)
/proc/sys/net/ipv4/tcp_wmem (for write)
上面的链接中还有c个代码段,用于在代码中提取这些值。
如果您尝试编写超过此缓冲区大小的大量邮件,则需要将其分解。通常,在写入套接字时,您需要创建自己的write()
- 包装器以确认是否已写入所有数据,或者是否需要再次调用write()
剩下的数据等
就动态内存分配的性能命中而言,一旦创建了套接字,该部分就完成了。吞吐量的更大瓶颈是使用套接字处理I / O.