我现在试图通过研究实际的代码实现来了解 read(2) 函数的工作原理,首先,我尝试了解它是如何在 #include 头文件中定义的。
在该文件中,我发现了这个:
ssize_t read(int, void *, size_t) __DARWIN_ALIAS_C(read);
Run Code Online (Sandbox Code Playgroud)
然后,我用谷歌搜索找到了实际的 read() 函数声明。
和,
https://github.com/lattera/glibc/blob/master/io/read.c
我找到了这个。在这段代码中,
/* Read NBYTES into BUF from FD. Return the number read or -1. */
ssize_t
__libc_read (int fd, void *buf, size_t nbytes)
{
if (nbytes == 0)
return 0;
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
if (buf == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
Run Code Online (Sandbox Code Playgroud)
现在这是我的问题。
__libc_之前是什么read?为什么需要它?当用户调用read(2)时,如何调用这个函数?
在我看来,这段代码与从文件描述符读取缓冲区无关,而是只有处理可能的错误的代码: fd < …
我无法理解为什么主要压缩与次要压缩不同。据我所知,次要压缩是将一些 HFile 合并为一个或多个 HFile。
我认为主要压缩除了处理已删除的行之外几乎做了同样的事情。
所以,我不知道为什么主要压缩会恢复 HBase 的数据局部性(当它在 HDFS 上使用时)。
换句话说,为什么小压缩不能恢复数据局部性,尽管对我来说,小压缩和大压缩都只是将 HFile 合并成少量的 HFile。
为什么只有主要压缩才能显着提高读取性能?我认为小压缩也有助于读取性能的提高。
请帮助我理解。
先感谢您。