linux读/写系统调用是否使用动态内存分配?
我想知道linux上的读写系统调用(与unix套接字一起使用)是否会进行动态内存分配 上下文是实时应用程序和确定性行为。否(我使用了linux读/写系统调用是否使用动态内存分配?,linux,malloc,real-time,system-calls,unix-socket,c,Linux,Malloc,Real Time,System Calls,Unix Socket,C,我想知道linux上的读写系统调用(与unix套接字一起使用)是否会进行动态内存分配 上下文是实时应用程序和确定性行为。否(我使用了grep-rn SYSCALL\u 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 =
grep-rn SYSCALL\u 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;
}
请注意,不同平台的系统调用定义可能不同:并非所有平台的系统调用定义都必须相同。事实上,许多平台只有少数体系结构支持系统调用
在您的情况下(即套接字),有一个预分配的每个套接字缓冲区,可能是通过动态分配的
在上面的链接中还有一些代码片段,可以在代码中提取这些值
如果您试图编写超过此缓冲区大小的大量消息,则需要将其拆分。通常,在向套接字写入时,您需要创建自己的write()
-包装器,以确认是否写入了所有数据,或者是否需要使用一部分剩余数据再次调用write()
,等等
就动态内存分配的性能而言,一旦创建了套接字,这一部分就完成了。吞吐量的更大瓶颈将是使用套接字处理I/O
/proc/sys/net/ipv4/tcp_rmem (for read)
/proc/sys/net/ipv4/tcp_wmem (for write)