【发布时间】:2017-12-13 12:57:09
【问题描述】:
我想知道 linux 上的 read 和 write 系统调用(与 unix 套接字一起使用)是否进行动态内存分配?
上下文是实时应用程序和确定性行为。
【问题讨论】:
标签: linux malloc real-time system-calls unix-socket
我想知道 linux 上的 read 和 write 系统调用(与 unix 套接字一起使用)是否进行动态内存分配?
上下文是实时应用程序和确定性行为。
【问题讨论】:
标签: linux malloc real-time system-calls unix-socket
没有。 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)
上面的链接中还有csn-ps 可以在代码中提取这些值。
如果您尝试写入超过此缓冲区大小的大量消息,则需要将它们分解。通常,在写入套接字时,您需要创建自己的write()-wrapper 以确认是否所有数据都已写入,或者您是否需要使用部分剩余数据再次调用write(),等等。
就动态内存分配的性能而言,一旦创建了套接字,该部分就完成了。吞吐量的更大瓶颈将是使用套接字处理 I/O。
【讨论】: