Yeonnnnny

[xv6] 데이터를 청크 단위로 읽다 본문

xv6

[xv6] 데이터를 청크 단위로 읽다

yeonny_do 2024. 11. 22. 19:19

 

"데이터를 청크 단위로 읽는다"는 표현은 데이터를 한 번에 일정한 크기(block size)로 나누어 처리한다는 의미이다.

이해를 위해 readi() 라는 함수의 동작을 예로 설명해보겠다.

 


청크단위로 읽는 이유?

  1. 효율성
    • 파일 데이터를 한 번에 전체를 처리하기보다는, 작은 크기(블록 또는 청크 단위)로 나누어 작업하면 메모리 사용을 최적화할 수 있다.
    • xv6에서는 디스크 I/O 연산이 디스크 블록 (BSIZE, 512바이트) 단위로 이루어진다.
  2. 파일 크기와 디스크 블록 구조
    • 디스크는 데이터를 블록 단위로 저장한다.
    • 파일의 데이터가 여러 블록에 걸쳐 저장될 수 있으므로, 읽기 작업은 한 번에 블록 크기만큼 수행된다.

readi에서 청크 단위 읽기의 예

// tot : 지금까지 읽은 바이트 수, m : 현재 읽는 바이트 수
for(tot=0 ; tot < n ; tot += m, off += m, dst += m){
    bp = bread(ip->dev, bmap(ip, off/BSIZE)); // 현재 블록을 읽어 옴
    m = min(n-tot, BSIZE - off % BSIZE); // 현재 읽을 바이트 크기 계산
    memmove(dst, bp->data+off % BSIZE, m); // 블록 데이터를 dst로 복사
    brelse(bp); // 사용한 버퍼 해제
}

 

과정 설명

  1. off / BSIZE :
    • 현재 읽으려는 오프셋이 위치한 디스크 블록 번호를 계산한다.
    • 예 : 오프셋이 600이면, 이는 512 바이트 단위로 나눠서 1번째 블록에 해당한다.
  2. bread :
    • 해당 블록의 데이터를 메모리 버퍼에 로드한다.
  3. min(n-tot, BSIZE - off % BSIZE)
    • 현재 읽으려는 총 데이터 크기와, 현재 블록에서 읽을 수 있는 크기 중 더 작은 값을 계산한다.
    • 예 : 총 600바이트를 읽으려고 한다면,
      • 첫 번째 블록에서 읽을 수 있는 크기 : 512 - (600%512) = 512
      • 두 번째 블록에서 남은 88바이트 읽는다.
  4. memmove
    •   블록의 데이터를 계산된 크기만큼 dst에 복사한다.
  5. brelse
    • 현재 사용한 블록 캐시를 해제하여 다른 작업이 디스크 캐시를 사용할 수 있도록 만든다.

청크 단위 읽기의 이점

  1. 메모리 효율성
    • 한 번에 처리 가능한 메모리 크기만큼 작업을 수행하므로 메모리 낭비를 줄일 수 있다.
  2. 디스크 효율성
    • 디스크는 데이터를 블록 단위로 읽고 쓰기 때문에, 한 번에 블록 크기만큼 작업하는 것이 I/O 성능을 최적화한다.
  3. 큰 파일 처리
    • 파일이 메모리보다 클 경우, 데이터를 나눠서 처리하지 않으면 메모리 부족 문제가 발생할 수 있다.

결론

 

"데이터를 청크 단위로 읽는다"

  • 512 바이트 크기의 블록(청크)를 기준으로 데이터를 읽어오는 것이다.
  • 파일이 여러 블록에 걸쳐 저장되어 있으면, 한 블록씩 데이터를 읽어 필요한 만큼 복사하고 작업을 진행한다.