Solaris에서 현재 미리 읽기 설정을 어떻게 얻습니까?
Linux에서는 다음과 같이 검색할 수 있습니다.
# echo $(($(blockdev --getra /dev/sda)*512/1024))
(blockdev는 항상 512바이트 단위로 읽기 헤드 값을 반환한다고 가정합니다.)
(일반적으로 Linux에서 미리 읽기는 128K입니다.)
답변1
솔라리스는 어느 정도 프리페칭을 수행할 수 있습니다. Linux와 달리 Solaris의 커널은 완전히 동적이며 제약 조건과 사용 가능한 커널 메모리에 따라 수행할 작업을 결정합니다.
파일 시스템에 의해 제어되는 미리 읽기도 있으며 ZFS를 사용하는 경우 기록 캐시와 다른 캐시를 가질 수 있습니다.
더 나은 답변을 얻으려면 합리적이지 않은 버퍼링된 장치에서 읽는 것을 실제로 좋아하는지 여부를 아는 것이 중요하며 구현 세부 사항을 알고 싶은 이유를 이해하는 것도 중요합니다.
일반적으로 Solaris에서는 버퍼링된 백스토어에 대한 read() 호출이 임시 커널 맵 맵 영역의 복사본으로 변환됩니다. IIRC 이 임시 맵 영역은 32비트 커널에서 2MB이고 64비트 커널에서는 더 큽니다. 미리 읽기 작업은 관련 세그먼트 드라이버(가상 전면 메모리와 후면 스토리지 사이의 드라이버)에 의해 설정된 수동으로 트리거된 오류 호출을 통해 구현됩니다. AFAIK, 사용 가능한 유일한 설명은 내 WOFS 졸업장 논문에 있습니다. Sun 직원은 이러한 이유로 이를 사용합니다.
상황을 더 잘 이해하려면 약간의 역사적 맥락을 갖는 것이 도움이 될 수 있습니다.
28년 전, 새로운 가상 메모리 하위 시스템과 함께 SunOS-4.0이 출시되었습니다. 모든 최신 운영 체제는 최소한 SunOS-4.0의 mmap() 아이디어를 복사했습니다. 그러나 SunOS-4.0은 객체 지향 VM 하위 시스템을 구현하므로 더 많은 기능을 가지고 있습니다.
가상 전면 메모리, 세그먼트 드라이버, HAL 계층(MMU) 및 백엔드 스토리지가 있습니다.
전경 메모리 개체 유형과 배경 개체 유형을 기반으로 하는 특수 세그먼트 드라이버가 있습니다.
파일 시스템을 전면 개체로 사용하고 디스크 저장소를 배경 메모리로 사용하는 경우 세그먼트 드라이버를 이라고 합니다 seg_vn
. 장치에 대한 매핑이 있는 경우 sev_dev
사용합니다 .
ufs_vnops.c
미리 읽기가 객체별로 다르다는 것을 이해하려면 를 확인 하고 알아내는 것이 좋습니다 ufs_getpage_ra()
.