2013-02-21 2 views
1

실제로 여기 전통적인 하드 디스크에 관한 두 가지 질문이 있습니다.효율적인 방법으로 임의 파일 액세스를 할 수 있습니까?

디스크의 모든 읽기/쓰기가 시스템 캐시/섹터 크기에 정렬됩니까?

디스크에 생성 된 모든 파일이 섹터에 정렬됩니까? 내 말은, 파일을 만들면 파일의 시작 지점이 섹터의 ​​시작 지점과 같을까요?

섹터 크기가 4096이고 fseek (pFile , 10 , SEEK_SET);을 사용하여 위치 10에서 4096 바이트를 읽으 려하므로 두 번 읽는 것으로 끝나나요?

+0

내부적으로는 페이징 알고리즘이 적어도 페이지 (아마도 4K)에서 읽을 수있는 프로그램으로 바뀌 었다고 생각합니다. 하지만 그것은 코드에 투명합니다. ** 효율적인 방법으로 무작위 파일 액세스를 할 수 있습니까? 어때 ** 매핑 된 파일에 대한 메모리? – phoeagon

+1

예, 투명합니다. 그러나 마지막 진술이 사실이라면 액세스 할 때 불일치를 방지하기 위해 일종의 정렬을해야 할 가능성이 높습니다. – user1192878

+1

방금 ​​묻는 모든 질문은 OS 및/또는 런타임에 따라 구현됩니다. 대답은 궁극적 인 결정 요인이 될 것입니다. – WhozCraig

답변

2

내가 광범위한 대답을 시간이 없어, 그래서 짧은 것 : 현대 디스크에

  1. 디스크 섹터 크기가 응용 프로그램을 볼 수 있습니다보다 낮은 수준에서 작동; 대부분의 경우에도 OS는 디스크에 의해보고 된 숫자를 신뢰할 수 없습니다. 또한 성능에 크게 영향을주지 않습니다.

  2. 전통적인 파일 시스템을 가정 할 때, 키 정렬은 디스크 블록 크기와 버퍼 캐시 사이에 있습니다. 이것은 OS/파일 시스템에서 발생하며 모든 응용 프로그램 수준 IO-ops는 정수 블록 수입니다. 디스크가 지속되는 동안 익스텐트와 엘리베이터로 인해 작업이 지연, 분할 또는 재정렬 될 수 있음을 이해하십시오.

  3. 현대의 모든 디스크에는 디스크 캐시가 있지만 성능/안정성 측면에서 고급 디스크는 비활성화 될 수 있습니다. 다시 블록에서 섹터와 동등한 요소 및 디스크상의 엘리베이터로 매핑하면 지연, 분할, 병합 및 재정렬이 발생할 수 있습니다. 그러나 대부분의 경우이 점에 대해 걱정할 필요가 없습니다. 디스크가 현재 쓰기 상태에 있지 않은지 확인하십시오.

  4. 대부분의 파일 시스템 파일은 블록으로 정렬되어 있습니다. 주어진 1 블럭이 최소 읽기이므로, 섹터 정렬은 당신의 관심사가 아니며, 어쨌든 당신은 그것에 대해 아무 것도 할 수 없습니다. 파일 시스템/io- 서브 시스템이이를 제대로 수행하도록 신뢰하십시오.

  5. 블록이 연속적이면 두 번 읽는 것이 거의 불가능합니다. 두 개의 블록을 읽지 만, 중간 트랙 탐색 시간이 짧고 요즘 일반 디스크의 순차 읽기 속도가 주어지면 미리 읽기 기능이 단일 블록 요청에 대해 여섯 개의 블록을 읽었을 것이므로 두 번째 블록은 무료입니다. 주 : 이것은 블록이 인접 해있는 경우에만 적용됩니다. 단편화가 있으면 짧거나 긴 구도를 얻게 될 것이고, 그렇게하면 너무 많은 일을하면 당신의 연기가 죽을 것입니다.

이것이 중요한 경우, 사용 가능한 파일 시스템에 대해 알아야합니다. 그들의 튜닝 파라미터들; 그에 따라 데이터 구조를 계획하십시오. 약간 다른 응용 프로그램 수준 블록/읽기 버퍼/쓰기 버퍼 크기로 재생할 수 있도록 구조를 매개 변수화해야합니다.

0

그냥해라. 가장 간단한 방법. 보다 복잡한 것은 (프로그래밍, 디버깅 및 유지 보수 시간)이 귀찮을 것이며 측정 값이 시스템의 병목 현상이라고 표시하지 않으면 낭비 일뿐입니다.

관련 문제