posix_fadvise와 미리 읽기의 차이점

posix_fadvise와 미리 읽기의 차이점

맨페이지에 따르면 readaheadLinux 관련 내용은 다음과 같습니다.

준수하다

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
fadvise64posix_fadvisevfs_fadvise

관련 정보