맨페이지에 따르면 readahead
Linux 관련 내용은 다음과 같습니다.
준수하다
readahead() 시스템 호출은 Linux에만 적용되며 이식 가능한 응용 프로그램에서는 사용을 피해야 합니다.
그리고 posix_fadvise
이식성이 뛰어납니다:
준수하다
POSIX.1-2001, POSIX.1-2008. POSIX.1-2001 TC1에서는 len 매개변수의 유형이 size_t에서 off_t로 변경되었습니다.
하지만 둘 다 같은 일을 하고 있는 것 같습니다. 그러나 이식성의 위험 외에도 이 두 기능을 교환하면 어떤 결과가 발생합니까?
답변1
이러한 시스템 호출이 실행되도록 하는 코드를 살펴보겠습니다.
여기에 인용하세요 mm/readahead.c
:
611 │ ssize_t ksys_readahead(int fd, loff_t offset, size_t count)
612 │ {
613 │ ssize_t ret;
614 │ struct fd f;
615 │
616 │ ret = -EBADF;
617 │ f = fdget(fd);
618 │ if (!f.file || !(f.file->f_mode & FMODE_READ))
619 │ goto out;
620 │
621 │ /*
622 │ * The readahead() syscall is intended to run only on files
623 │ * that can execute readahead. If readahead is not possible
624 │ * on this file, then we must return -EINVAL.
625 │ */
626 │ ret = -EINVAL;
627 │ if (!f.file->f_mapping || !f.file->f_mapping->a_ops ||
628 │ !S_ISREG(file_inode(f.file)->i_mode))
629 │ goto out;
630 │
631 │ ret = vfs_fadvise(f.file, offset, count, POSIX_FADV_WILLNEED);
632 │ out:
633 │ fdput(f);
634 │ return ret;
635 │ }
참고 631행: 이것은 vfs_fadvise(…, POSIX_FADV_WILLNEED)
지하를 호출합니다.
이것을 비교하십시오 mm/fadvise.c
:
192 │ int ksys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
193 │ {
194 │ struct fd f = fdget(fd);
195 │ int ret;
196 │
197 │ if (!f.file)
198 │ return -EBADF;
199 │
200 │ ret = vfs_fadvise(f.file, offset, len, advice);
201 │
202 │ fdput(f);
203 │ return ret;
204 │ }
이 코드도 동일한 호출을 수행 vfs_fadvise
하므로 posix_fadvise64(…, WILLNEED)
다음을 사용합니다.기능적으로같은.
차이점은 아마도 두 함수 중 하나와 함께 사용하는 파일이 부적합할 때 보고되는 오류입니다. readahead
파일 자체가 파일을 읽을 수 있는지, 매핑되었는지, 실제로 유용한 주소 지정 작업이 있는지 확인하고 EBADF
부적합한 경우 OR를 반환합니다. , 후속 시스템 호출은 내부적으로 이를 확인하기 위해 직접 호출되며 다른 오류를 반환할 수 있습니다. (실제로 그런지는 확인하지 못했습니다.)EINVAL
fadvise64
posix_fadvise
vfs_fadvise